diff --git a/API Server/internal/api/routes.go b/API Server/internal/api/routes.go new file mode 100644 index 0000000..8230678 --- /dev/null +++ b/API Server/internal/api/routes.go @@ -0,0 +1,360 @@ +package api + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/url" + "regexp" + "strings" + "time" +) + +// Routes are the pilots' saved waypoint missions — the server side of the Fly +// App's mission library (GO 4-parity plan P7). One `routes` record holds one +// route verbatim, exactly as `WaypointMissionSpec.toJson()` writes it (format +// version 1), keyed by the app's own route id so a tablet can sync without +// knowing PocketBase record ids. +// +// Sync is last-writer-wins by the route's own `updatedAt`: a write older than +// what is stored is refused with 409 and the stored route, so the device adopts +// it. Deletes are kept as tombstones (deleted = true, with the delete time as +// updatedAt) so an offline device learns of them instead of re-uploading. +// +// Scoping (as for flights): +// - user → only the routes they own. +// - admin → every route in their organization. +// - superadmin → everything. +// +// `?mine=1` narrows any caller to their own routes (what a tablet syncs). + +// routeFormatVersion is the WaypointMissionSpec.formatVersion this server stores. +const routeFormatVersion = 1 + +// maxRouteBytes caps one route's JSON (99 waypoints with actions is ~40 KB). +const maxRouteBytes = 2 << 20 + +// routeIDPattern bounds the app-generated ids ("wp-"). It also keeps +// the id safe to splice into a PocketBase filter. +var routeIDPattern = regexp.MustCompile(`^[A-Za-z0-9_-]{1,100}$`) + +type routeRecord struct { + ID string `json:"id"` + RouteID string `json:"route_id"` + Name string `json:"name"` + Spec json.RawMessage `json:"spec"` + RouteUpdatedAt string `json:"route_updated_at"` + Deleted bool `json:"deleted"` + Owner string `json:"owner"` + Organization string `json:"organization"` + Created string `json:"created"` + Updated string `json:"updated"` +} + +type routeView struct { + ID string `json:"id"` // the app's route id + RecordID string `json:"recordId"` + Name string `json:"name"` + Deleted bool `json:"deleted"` + UpdatedAt string `json:"updatedAt"` + PointCount int `json:"pointCount"` + Owner string `json:"owner"` + Mine bool `json:"mine"` + Organization string `json:"organization"` + Created string `json:"created"` + Spec json.RawMessage `json:"spec,omitempty"` +} + +func (r routeRecord) view(who *callerIdentity) routeView { + v := routeView{ + ID: r.RouteID, RecordID: r.ID, Name: r.Name, Deleted: r.Deleted, + UpdatedAt: r.RouteUpdatedAt, Owner: r.Owner, Mine: who != nil && r.Owner == who.ID, + Organization: r.Organization, Created: r.Created, + } + if len(r.Spec) > 0 && string(r.Spec) != "null" { + v.Spec = r.Spec + if s, err := parseRouteSpec(r.Spec); err == nil { + v.PointCount = s.pointCount + } + } + return v +} + +// routeSpec is what the server needs to read out of a stored route; the rest +// of the JSON is kept as-is. +type routeSpec struct { + id string + name string + updatedAt time.Time + pointCount int +} + +// parseRouteSpec checks a route body is a format-1 WaypointMissionSpec with an +// id and an updatedAt, and pulls out the fields the server indexes on. +func parseRouteSpec(raw []byte) (routeSpec, error) { + var in struct { + Version *int `json:"version"` + ID string `json:"id"` + Name string `json:"name"` + Points []json.RawMessage `json:"points"` + UpdatedAt string `json:"updatedAt"` + } + if err := json.Unmarshal(raw, &in); err != nil { + return routeSpec{}, errRoute("route is not valid JSON") + } + if in.Version == nil || *in.Version != routeFormatVersion { + return routeSpec{}, errRoute("unsupported route format version (want 1)") + } + if !routeIDPattern.MatchString(in.ID) { + return routeSpec{}, errRoute("route id is missing or invalid") + } + t, ok := parseRouteTime(in.UpdatedAt) + if !ok { + return routeSpec{}, errRoute("route updatedAt is missing or not an RFC 3339 time") + } + return routeSpec{id: in.ID, name: strings.TrimSpace(in.Name), updatedAt: t, pointCount: len(in.Points)}, nil +} + +type errRoute string + +func (e errRoute) Error() string { return string(e) } + +// routeTimeLayout is how route_updated_at is stored: fixed-width UTC with +// microseconds (Dart's DateTime precision), so it also sorts as text. +const routeTimeLayout = "2006-01-02T15:04:05.000000Z" + +func parseRouteTime(s string) (time.Time, bool) { + t, err := time.Parse(time.RFC3339Nano, strings.TrimSpace(s)) + return t, err == nil +} + +// routeIsNewer reports whether a stored route (or tombstone) stamped `stored` +// supersedes a write stamped `incoming`. Equal stamps let the write through, so +// a retried push is idempotent. An unreadable stored stamp never blocks. +func routeIsNewer(stored string, incoming time.Time) bool { + t, ok := parseRouteTime(stored) + return ok && t.After(incoming) +} + +func routeScopeFilter(who *callerIdentity, mine bool) string { + if mine || (!who.isSuperadmin() && !(who.isManager() && who.OrgID != "")) { + return "owner = \"" + who.ID + "\"" + } + if who.isSuperadmin() { + return "" + } + return "organization = \"" + who.OrgID + "\"" +} + +func canManageRoute(who *callerIdentity, r routeRecord) bool { + if who.isSuperadmin() { + return true + } + if who.isManager() && who.OrgID != "" && r.Organization == who.OrgID { + return true + } + return r.Owner == who.ID +} + +// findRoute fetches a route by the app's route id (tombstones included). +func (s *Server) findRoute(ctx context.Context, routeID string) (routeRecord, bool, error) { + var list struct { + Items []routeRecord `json:"items"` + } + status, err := s.listRecords(ctx, "routes", "route_id = \""+routeID+"\"", "", &list) + if err != nil { + return routeRecord{}, false, err + } + if status != http.StatusOK || len(list.Items) == 0 { + return routeRecord{}, false, nil + } + return list.Items[0], true, nil +} + +// routePathID reads and validates the {id} path value. +func routePathID(w http.ResponseWriter, r *http.Request) (string, bool) { + id := r.PathValue("id") + if !routeIDPattern.MatchString(id) { + writeError(w, http.StatusBadRequest, "invalid route id") + return "", false + } + return id, true +} + +// GET /api/routes — the caller's in-scope routes, newest first. Tombstones are +// left out unless ?includeDeleted=1 (a syncing device needs them). +func (s *Server) handleListRoutes(w http.ResponseWriter, r *http.Request) { + who := caller(r) + q := r.URL.Query() + filter := routeScopeFilter(who, q.Get("mine") == "1") + if q.Get("includeDeleted") != "1" { + if filter != "" { + filter = "(" + filter + ") && " + } + filter += "deleted = false" + } + var list struct { + Items []routeRecord `json:"items"` + } + status, err := s.listRecords(r.Context(), "routes", filter, "-route_updated_at", &list) + if err != nil { + gatewayError(w, err) + return + } + if status != http.StatusOK { + writeError(w, http.StatusBadGateway, "could not list routes") + return + } + out := make([]routeView, 0, len(list.Items)) + for _, rec := range list.Items { + out = append(out, rec.view(who)) + } + writeJSON(w, http.StatusOK, map[string]any{"routes": out}) +} + +// GET /api/routes/{id} — one route (a tombstone reads as deleted: true). +func (s *Server) handleGetRoute(w http.ResponseWriter, r *http.Request) { + who := caller(r) + id, ok := routePathID(w, r) + if !ok { + return + } + rec, found, err := s.findRoute(r.Context(), id) + if err != nil { + gatewayError(w, err) + return + } + if !found || !canManageRoute(who, rec) { + writeError(w, http.StatusNotFound, "route not found") + return + } + writeJSON(w, http.StatusOK, map[string]any{"route": rec.view(who)}) +} + +// PUT /api/routes/{id} — create or update a route. The body is the route JSON +// as WaypointMissionSpec.toJson() writes it; its id must match the path. +func (s *Server) handlePutRoute(w http.ResponseWriter, r *http.Request) { + who := caller(r) + id, ok := routePathID(w, r) + if !ok { + return + } + raw, err := io.ReadAll(http.MaxBytesReader(w, r.Body, maxRouteBytes)) + if err != nil { + writeError(w, http.StatusRequestEntityTooLarge, "route is too large") + return + } + spec, err := parseRouteSpec(raw) + if err != nil { + writeError(w, http.StatusUnprocessableEntity, err.Error()) + return + } + if spec.id != id { + writeError(w, http.StatusUnprocessableEntity, "route id does not match the URL") + return + } + + existing, found, err := s.findRoute(r.Context(), id) + if err != nil { + gatewayError(w, err) + return + } + payload := map[string]any{ + "route_id": id, + "name": spec.name, + "spec": json.RawMessage(raw), + "route_updated_at": spec.updatedAt.UTC().Format(routeTimeLayout), + "deleted": false, + } + + if !found { + payload["owner"] = who.ID + payload["organization"] = who.OrgID + data, status, err := s.admin.do(r.Context(), http.MethodPost, "/api/collections/routes/records", payload) + if err != nil { + gatewayError(w, err) + return + } + if status != http.StatusOK { + relayRaw(w, status, data) + return + } + var rec routeRecord + _ = json.Unmarshal(data, &rec) + writeJSON(w, http.StatusCreated, map[string]any{"route": rec.view(who)}) + return + } + + if !canManageRoute(who, existing) { + writeError(w, http.StatusConflict, "route id is already in use") + return + } + if routeIsNewer(existing.RouteUpdatedAt, spec.updatedAt) { + writeJSON(w, http.StatusConflict, map[string]any{"error": "a newer version of this route is stored", "route": existing.view(who)}) + return + } + // Owner + organization stay as created: an admin editing a pilot's route + // does not take it over. + data, status, err := s.admin.do(r.Context(), http.MethodPatch, + "/api/collections/routes/records/"+url.PathEscape(existing.ID), payload) + if err != nil { + gatewayError(w, err) + return + } + if status != http.StatusOK { + relayRaw(w, status, data) + return + } + var rec routeRecord + _ = json.Unmarshal(data, &rec) + writeJSON(w, http.StatusOK, map[string]any{"route": rec.view(who)}) +} + +// DELETE /api/routes/{id}?at= — tombstone a route. `at` is when the +// pilot deleted it (default: now); a route edited after that is kept (409). +func (s *Server) handleDeleteRoute(w http.ResponseWriter, r *http.Request) { + who := caller(r) + id, ok := routePathID(w, r) + if !ok { + return + } + at := time.Now().UTC() + if v := r.URL.Query().Get("at"); v != "" { + t, ok := parseRouteTime(v) + if !ok { + writeError(w, http.StatusBadRequest, "at must be an RFC 3339 time") + return + } + at = t + } + existing, found, err := s.findRoute(r.Context(), id) + if err != nil { + gatewayError(w, err) + return + } + if !found || !canManageRoute(who, existing) { + writeError(w, http.StatusNotFound, "route not found") + return + } + if routeIsNewer(existing.RouteUpdatedAt, at) { + writeJSON(w, http.StatusConflict, map[string]any{"error": "the route was changed after this delete", "route": existing.view(who)}) + return + } + data, status, err := s.admin.do(r.Context(), http.MethodPatch, + "/api/collections/routes/records/"+url.PathEscape(existing.ID), map[string]any{ + "deleted": true, + "route_updated_at": at.UTC().Format(routeTimeLayout), + }) + if err != nil { + gatewayError(w, err) + return + } + if status != http.StatusOK { + relayRaw(w, status, data) + return + } + var rec routeRecord + _ = json.Unmarshal(data, &rec) + writeJSON(w, http.StatusOK, map[string]any{"ok": true, "route": rec.view(who)}) +} diff --git a/API Server/internal/api/routes_test.go b/API Server/internal/api/routes_test.go new file mode 100644 index 0000000..93d4c41 --- /dev/null +++ b/API Server/internal/api/routes_test.go @@ -0,0 +1,228 @@ +package api + +import ( + "context" + "encoding/json" + "net/http" + "net/http/httptest" + "strconv" + "strings" + "sync" + "testing" + "time" +) + +// A route as the Fly App's WaypointMissionSpec.toJson() writes it. +const sampleRoute = `{"version":1,"id":"wp-m1x2y3","name":" Field ","points":[{"lat":55.1,"lon":12.2},{"lat":55.2,"lon":12.3}],"pois":[],` + + `"cruiseSpeed":8.0,"headingMode":"auto","finishAction":"goHome","pathMode":"straight","exitOnSignalLost":true,` + + `"gotoFirst":"safely","repeatTimes":1,"updatedAt":"2026-10-20T08:30:00.123Z"}` + +func TestParseRouteSpec(t *testing.T) { + s, err := parseRouteSpec([]byte(sampleRoute)) + if err != nil { + t.Fatalf("parse: %v", err) + } + if s.id != "wp-m1x2y3" || s.name != "Field" || s.pointCount != 2 { + t.Fatalf("got %+v", s) + } + want := time.Date(2026, 10, 20, 8, 30, 0, 123e6, time.UTC) + if !s.updatedAt.Equal(want) { + t.Fatalf("updatedAt = %v, want %v", s.updatedAt, want) + } + + bad := map[string]string{ + "not json": `{`, + "no version": `{"id":"wp-1","updatedAt":"2026-10-20T08:30:00Z"}`, + "version 2": `{"version":2,"id":"wp-1","updatedAt":"2026-10-20T08:30:00Z"}`, + "no id": `{"version":1,"updatedAt":"2026-10-20T08:30:00Z"}`, + "filter quote": `{"version":1,"id":"a\" || 1=1","updatedAt":"2026-10-20T08:30:00Z"}`, + "no updatedAt": `{"version":1,"id":"wp-1"}`, + "bad updatedAt": `{"version":1,"id":"wp-1","updatedAt":"yesterday"}`, + } + for name, body := range bad { + if _, err := parseRouteSpec([]byte(body)); err == nil { + t.Errorf("%s: accepted", name) + } + } +} + +func TestRouteIsNewer(t *testing.T) { + at := time.Date(2026, 10, 20, 8, 30, 0, 0, time.UTC) + if !routeIsNewer("2026-10-20T08:30:00.000001Z", at) { + t.Error("a later stored stamp must win") + } + if routeIsNewer("2026-10-20T08:30:00.000000Z", at) { + t.Error("an equal stamp lets the write through (idempotent retry)") + } + if routeIsNewer("2026-10-20T08:29:59Z", at) { + t.Error("an older stored stamp loses") + } + if routeIsNewer("", at) { + t.Error("a missing stored stamp never blocks") + } +} + +func TestRouteTimeLayoutSortsAsText(t *testing.T) { + a := time.Date(2026, 10, 20, 8, 30, 0, 0, time.UTC).Format(routeTimeLayout) + b := time.Date(2026, 10, 20, 8, 30, 0, 500e6, time.UTC).Format(routeTimeLayout) + if !(a < b) { + t.Fatalf("%q should sort before %q", a, b) + } + if _, ok := parseRouteTime(a); !ok { + t.Fatalf("stored stamp %q does not parse back", a) + } +} + +func TestRouteScope(t *testing.T) { + user := &callerIdentity{ID: "u1", Role: roleUser, OrgID: "o1"} + admin := &callerIdentity{ID: "a1", Role: roleAdmin, OrgID: "o1"} + orgless := &callerIdentity{ID: "a2", Role: roleAdmin} + super := &callerIdentity{ID: "s1", Role: roleSuperadmin} + + cases := []struct { + who *callerIdentity + mine bool + want string + }{ + {user, false, `owner = "u1"`}, + {admin, false, `organization = "o1"`}, + {admin, true, `owner = "a1"`}, + {orgless, false, `owner = "a2"`}, + {super, false, ``}, + {super, true, `owner = "s1"`}, + } + for _, c := range cases { + if got := routeScopeFilter(c.who, c.mine); got != c.want { + t.Errorf("%s mine=%v: %q, want %q", c.who.ID, c.mine, got, c.want) + } + } + + pilots := routeRecord{Owner: "u1", Organization: "o1"} + other := routeRecord{Owner: "u9", Organization: "o2"} + if !canManageRoute(user, pilots) || canManageRoute(user, routeRecord{Owner: "u2", Organization: "o1"}) { + t.Error("a user manages only their own routes") + } + if !canManageRoute(admin, pilots) || canManageRoute(admin, other) { + t.Error("an admin manages their organization's routes only") + } + if !canManageRoute(super, other) { + t.Error("a superadmin manages everything") + } +} + +// fakeRoutesPB is just enough PocketBase for the route handlers: superuser +// auth, a route_id lookup, create and patch. +type fakeRoutesPB struct { + mu sync.Mutex + recs map[string]map[string]any // record id → fields + n int +} + +func (f *fakeRoutesPB) ServeHTTP(w http.ResponseWriter, r *http.Request) { + f.mu.Lock() + defer f.mu.Unlock() + const coll = "/api/collections/routes/records" + switch { + case strings.HasSuffix(r.URL.Path, "/auth-with-password"): + writeJSON(w, 200, map[string]any{"token": "su"}) + case r.Method == http.MethodGet && r.URL.Path == coll: + items := []map[string]any{} + filter := r.URL.Query().Get("filter") + for _, rec := range f.recs { + if strings.HasPrefix(filter, "route_id = ") && filter != `route_id = "`+rec["route_id"].(string)+`"` { + continue + } + items = append(items, rec) + } + writeJSON(w, 200, map[string]any{"items": items}) + case r.Method == http.MethodPost && r.URL.Path == coll: + var rec map[string]any + _ = json.NewDecoder(r.Body).Decode(&rec) + f.n++ + rec["id"] = "rec" + strconv.Itoa(f.n) + f.recs[rec["id"].(string)] = rec + writeJSON(w, 200, rec) + case r.Method == http.MethodPatch && strings.HasPrefix(r.URL.Path, coll+"/"): + rec, ok := f.recs[strings.TrimPrefix(r.URL.Path, coll+"/")] + if !ok { + writeError(w, 404, "missing") + return + } + var patch map[string]any + _ = json.NewDecoder(r.Body).Decode(&patch) + for k, v := range patch { + rec[k] = v + } + writeJSON(w, 200, rec) + default: + writeError(w, 404, "unexpected "+r.Method+" "+r.URL.Path) + } +} + +func TestRouteHandlersLastWriterWins(t *testing.T) { + pb := &fakeRoutesPB{recs: map[string]map[string]any{}} + ts := httptest.NewServer(pb) + defer ts.Close() + s := &Server{admin: newAdminClient(ts.URL, "svc@x", "pw")} + pilot := &callerIdentity{ID: "u1", Role: roleUser, OrgID: "o1"} + stranger := &callerIdentity{ID: "u2", Role: roleUser, OrgID: "o2"} + + call := func(who *callerIdentity, h http.HandlerFunc, method, target, body string) (int, map[string]any) { + req := httptest.NewRequest(method, target, strings.NewReader(body)) + req.SetPathValue("id", strings.Split(strings.TrimPrefix(req.URL.Path, "/api/routes/"), "?")[0]) + req = req.WithContext(context.WithValue(req.Context(), ctxCaller, who)) + rec := httptest.NewRecorder() + h(rec, req) + var out map[string]any + _ = json.Unmarshal(rec.Body.Bytes(), &out) + return rec.Code, out + } + withTime := func(at string) string { + return strings.Replace(sampleRoute, "2026-10-20T08:30:00.123Z", at, 1) + } + + if code, _ := call(pilot, s.handlePutRoute, "PUT", "/api/routes/wp-other", sampleRoute); code != 422 { + t.Fatalf("id mismatch: %d", code) + } + code, out := call(pilot, s.handlePutRoute, "PUT", "/api/routes/wp-m1x2y3", sampleRoute) + if code != 201 { + t.Fatalf("create: %d %v", code, out) + } + route := out["route"].(map[string]any) + if route["id"] != "wp-m1x2y3" || route["name"] != "Field" || route["mine"] != true || route["pointCount"].(float64) != 2 { + t.Fatalf("created view: %v", route) + } + stored := pb.recs["rec1"] + if stored["owner"] != "u1" || stored["organization"] != "o1" { + t.Fatalf("owner/org not stamped: %v", stored) + } + + if code, out := call(pilot, s.handlePutRoute, "PUT", "/api/routes/wp-m1x2y3", withTime("2026-10-20T08:00:00Z")); code != 409 || out["route"] == nil { + t.Fatalf("older write: %d %v", code, out) + } + if code, _ := call(pilot, s.handlePutRoute, "PUT", "/api/routes/wp-m1x2y3", sampleRoute); code != 200 { + t.Fatalf("idempotent retry: %d", code) + } + if code, _ := call(stranger, s.handlePutRoute, "PUT", "/api/routes/wp-m1x2y3", withTime("2026-10-21T00:00:00Z")); code != 409 { + t.Fatalf("someone else's id: %d", code) + } + if code, _ := call(stranger, s.handleGetRoute, "GET", "/api/routes/wp-m1x2y3", ""); code != 404 { + t.Fatalf("stranger get: %d", code) + } + + if code, _ := call(pilot, s.handleDeleteRoute, "DELETE", "/api/routes/wp-m1x2y3?at=2026-10-20T08:00:00Z", ""); code != 409 { + t.Fatalf("delete older than the edit: %d", code) + } + code, out = call(pilot, s.handleDeleteRoute, "DELETE", "/api/routes/wp-m1x2y3?at=2026-10-20T09:00:00Z", "") + if code != 200 || out["route"].(map[string]any)["deleted"] != true { + t.Fatalf("delete: %d %v", code, out) + } + if stored["route_updated_at"] != "2026-10-20T09:00:00.000000Z" { + t.Fatalf("tombstone stamp: %v", stored["route_updated_at"]) + } + // A save newer than the delete brings the route back. + code, out = call(pilot, s.handlePutRoute, "PUT", "/api/routes/wp-m1x2y3", withTime("2026-10-20T10:00:00Z")) + if code != 200 || out["route"].(map[string]any)["deleted"] != false { + t.Fatalf("resurrect: %d %v", code, out) + } +} diff --git a/API Server/internal/api/server.go b/API Server/internal/api/server.go index b48bc7d..8553953 100644 --- a/API Server/internal/api/server.go +++ b/API Server/internal/api/server.go @@ -168,6 +168,14 @@ func (s *Server) Handler() http.Handler { mux.HandleFunc("DELETE /api/documents/{id}", s.requireUser(s.handleDeleteDocument)) mux.HandleFunc("GET /api/documents/{id}/file", s.requireUser(s.handleDownloadDocument)) + // Routes — saved waypoint missions, synced with the Fly App's mission + // library (last-writer-wins by the route's updatedAt; deletes tombstoned). + // Per-role scoping is enforced inside the handlers. + mux.HandleFunc("GET /api/routes", s.requireUser(s.handleListRoutes)) + mux.HandleFunc("GET /api/routes/{id}", s.requireUser(s.handleGetRoute)) + mux.HandleFunc("PUT /api/routes/{id}", s.requireUser(s.handlePutRoute)) + mux.HandleFunc("DELETE /api/routes/{id}", s.requireUser(s.handleDeleteRoute)) + // Device / dashboard API. mux.HandleFunc("GET /api/devices", s.handleListDevices) mux.HandleFunc("GET /api/devices/{id}/track", s.handleTrack) diff --git a/API Server/pocketbase/pb_migrations/1720301100_add_routes.js b/API Server/pocketbase/pb_migrations/1720301100_add_routes.js new file mode 100644 index 0000000..d6d2acc --- /dev/null +++ b/API Server/pocketbase/pb_migrations/1720301100_add_routes.js @@ -0,0 +1,87 @@ +/// + +// Creates the `routes` collection: the pilots' saved waypoint missions (the Fly +// App's mission library, GO 4-parity plan P7). Each row holds one route exactly +// as the Fly App's `WaypointMissionSpec.toJson()` writes it (format version 1) +// in `spec`, keyed by the app-generated `route_id` so a tablet can push and pull +// without knowing PocketBase record ids. +// +// Sync is last-writer-wins by the route's own `updatedAt` (copied into +// `route_updated_at` so the API Server can compare without parsing `spec`). +// Deletes are kept as tombstones (`deleted` = true) so a device that was +// offline learns about them instead of re-uploading the route. +// +// Like the logbook and documents, the collection is reached only through the +// API Server's superuser service account, so its API rules stay locked +// (superusers only); the API Server enforces per-role scoping in Go. +// +// Apply by copying into your PocketBase deployment's `pb_migrations/` directory +// and restarting. Written for PocketBase v0.22+/v0.23. Idempotent: the +// collection is created only if absent, so re-running is a no-op. +// +// Depends on 1720300200_add_organizations.js (organizations) and the `users` +// auth collection. +migrate( + (app) => { + // Idempotency guard. + try { + app.findCollectionByNameOrId('routes') + return // already present + } catch (_) { + // create below + } + + const orgs = app.findCollectionByNameOrId('organizations') + const users = app.findCollectionByNameOrId('users') + + const routes = new Collection({ + type: 'base', + name: 'routes', + fields: [ + // The Fly App's own id (e.g. "wp-m1x2y3z"); unique across the store. + { name: 'route_id', type: 'text', required: true, max: 100 }, + { name: 'name', type: 'text', max: 200, presentable: true }, + // The route itself, verbatim WaypointMissionSpec.toJson(). + { name: 'spec', type: 'json', maxSize: 2000000 }, + // The spec's updatedAt (RFC 3339, UTC) — the last-writer-wins clock. + { name: 'route_updated_at', type: 'text', max: 40 }, + { name: 'deleted', type: 'bool' }, + { + name: 'owner', + type: 'relation', + required: false, + collectionId: users.id, + cascadeDelete: false, + minSelect: 0, + maxSelect: 1, + presentable: false, + }, + { + name: 'organization', + type: 'relation', + required: false, + collectionId: orgs.id, + cascadeDelete: false, + minSelect: 0, + maxSelect: 1, + presentable: false, + }, + { name: 'created', type: 'autodate', onCreate: true, onUpdate: false }, + { name: 'updated', type: 'autodate', onCreate: true, onUpdate: true }, + ], + indexes: [ + 'CREATE UNIQUE INDEX `idx_routes_route_id` ON `routes` (`route_id`)', + 'CREATE INDEX `idx_routes_owner` ON `routes` (`owner`)', + 'CREATE INDEX `idx_routes_org` ON `routes` (`organization`)', + ], + }) + app.save(routes) + }, + (app) => { + try { + app.delete(app.findCollectionByNameOrId('routes')) + } catch (_) { + // already gone + } + }, +) diff --git a/Fly App/lib/fly/modes/mission_library.dart b/Fly App/lib/fly/modes/mission_library.dart index c37493f..c7e95a1 100644 --- a/Fly App/lib/fly/modes/mission_library.dart +++ b/Fly App/lib/fly/modes/mission_library.dart @@ -1,24 +1,56 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'mission_sync.dart'; import 'waypoint_mission.dart'; +/// How the library stands with the API Server. +enum MissionSyncStatus { + /// Signed out (or no server): routes live on this device only. + local, + syncing, + synced, + + /// The last sync failed (offline, server down); routes are safe locally and + /// go up on the next sync. + failed, +} + /// The pilot's saved waypoint routes (GO 4's mission library, plan P7). /// /// Kept on this device as JSON in shared preferences, in the -/// [WaypointMissionSpec.toJson] format the API Server will store once route -/// sync lands. Newest first. +/// [WaypointMissionSpec.toJson] format the API Server stores. Newest first. +/// +/// When signed in, the library syncs with the server through [MissionRemote]: +/// [load] pulls, every [save] and [delete] syncs again, and the two sides are +/// merged last-writer-wins by `updatedAt` ([mergeMissions]). Deletes the server +/// has not acknowledged are kept as local tombstones. Offline, everything still +/// works on the device and goes up on the next successful sync. +/// +/// Each account keeps its own copy on the device, so pilots sharing a tablet +/// never see (or upload) each other's routes. Routes saved while signed out +/// are claimed by the first account that signs in. class MissionLibrary extends ChangeNotifier { - MissionLibrary({SharedPreferences? prefs}) : _prefs = prefs; + MissionLibrary({SharedPreferences? prefs, MissionRemote? remote}) + : _prefs = prefs, + _remote = remote; static const String _key = 'missions.waypoint'; SharedPreferences? _prefs; + final MissionRemote? _remote; List _missions = []; + Map _tombstones = {}; bool _loaded = false; + /// The account whose copy is loaded ('' = signed out). + String _account = ''; + MissionSyncStatus _status = MissionSyncStatus.local; + Future _chain = Future.value(); + /// The flight screen can close while [load] still waits for storage. bool _disposed = false; @@ -35,21 +67,69 @@ class MissionLibrary extends ChangeNotifier { List get missions => List.unmodifiable(_missions); bool get loaded => _loaded; + MissionSyncStatus get syncStatus => _status; + + /// Completes once every sync started so far has finished. + Future get idle => _chain; + + static String _keyFor(String account) => account.isEmpty ? _key : '$_key@$account'; Future load() async { - try { - _prefs ??= await SharedPreferences.getInstance(); - final String? raw = _prefs!.getString(_key); - _missions = raw == null ? [] : decode(raw); - } catch (_) { - _missions = []; - } + _account = _remote?.account ?? ''; + await _loadLocal(); _loaded = true; notifyListeners(); + await sync(); + } + + Future _loadLocal() async { + try { + _prefs ??= await SharedPreferences.getInstance(); + _missions = _read(_keyFor(_account)); + _tombstones = _readTombstones(_keyFor(_account)); + if (_account.isNotEmpty) { + // Routes saved while signed out now belong to this account. + final List unclaimed = _read(_key); + if (unclaimed.isNotEmpty) { + final Set have = {for (final WaypointMissionSpec m in _missions) m.id}; + _missions = [ + ..._missions, + for (final WaypointMissionSpec m in unclaimed) if (!have.contains(m.id)) m, + ]; + await _store(); + await _prefs!.remove(_key); + await _prefs!.remove('$_key.deleted'); + } + } + } catch (_) { + _missions = []; + _tombstones = {}; + } + } + + List _read(String key) { + final String? raw = _prefs!.getString(key); + return raw == null ? [] : decode(raw); + } + + Map _readTombstones(String key) { + final String? raw = _prefs!.getString('$key.deleted'); + if (raw == null) return {}; + try { + final Object? m = jsonDecode(raw); + if (m is! Map) return {}; + return { + for (final MapEntry e in m.entries) + if (e.key is String && DateTime.tryParse('${e.value}') != null) e.key! as String: DateTime.parse('${e.value}'), + }; + } catch (_) { + return {}; + } } /// Saves [m] (replacing the one with the same id) and returns it as stored: - /// with an id and a fresh [WaypointMissionSpec.updatedAt]. + /// with an id and a fresh [WaypointMissionSpec.updatedAt]. Syncs in the + /// background. Future save(WaypointMissionSpec m, {DateTime? now}) async { final WaypointMissionSpec stored = m.copyWith( id: m.id.isEmpty ? newId(now) : m.id, @@ -59,25 +139,115 @@ class MissionLibrary extends ChangeNotifier { stored, for (final WaypointMissionSpec o in _missions) if (o.id != stored.id) o, ]; + _tombstones.remove(stored.id); await _persist(); + unawaited(sync()); return stored; } - Future delete(String id) async { + Future delete(String id, {DateTime? now}) async { _missions = [for (final WaypointMissionSpec o in _missions) if (o.id != id) o]; + // Only a signed-in library has a server copy to tell. + if (_account.isNotEmpty) _tombstones[id] = (now ?? DateTime.now()).toUtc(); await _persist(); + unawaited(sync()); + } + + /// Pulls the server's routes, merges, and pushes what the device has newer. + /// Runs one at a time; a no-op while signed out. Never throws. + Future sync() => _chain = _chain.then((_) => _sync()).catchError((Object _) {}); + + Future _sync() async { + final MissionRemote? remote = _remote; + if (remote == null || _disposed) return; + final String account = remote.account; + if (account != _account) { + // Signed in, out, or as someone else since the last load. + _account = account; + await _loadLocal(); + notifyListeners(); + } + if (account.isEmpty) { + _setStatus(MissionSyncStatus.local); + return; + } + _setStatus(MissionSyncStatus.syncing); + try { + final List theirs = await remote.pull(); + if (remote.account != _account) return; // signed out mid-pull + // Merged against the library as it is now, not as it was before the + // pull: a save made meanwhile is newer and gets pushed. + final MissionMerge merge = mergeMissions(local: _missions, tombstones: _tombstones, remote: theirs); + _missions = merge.missions; + _tombstones = Map.of(merge.tombstones); + await _persist(); + + bool ok = true; + for (final WaypointMissionSpec m in merge.toPush) { + try { + final RemoteRoute? newer = await remote.push(m); + if (newer != null) _adopt(newer); + } catch (_) { + ok = false; + } + } + for (final MapEntry d in merge.toDelete.entries) { + try { + final RemoteRoute? newer = await remote.pushDelete(d.key, d.value); + if (_tombstones[d.key] == d.value) _tombstones.remove(d.key); + if (newer != null) _adopt(newer); + } catch (_) { + ok = false; + } + } + await _persist(); + _setStatus(ok ? MissionSyncStatus.synced : MissionSyncStatus.failed); + } catch (_) { + _setStatus(MissionSyncStatus.failed); + } + } + + /// Takes the server's copy of a route it refused to overwrite — unless the + /// pilot changed the route again while the push was in flight. + void _adopt(RemoteRoute r) { + final WaypointMissionSpec? mine = _missions.where((WaypointMissionSpec m) => m.id == r.id).firstOrNull; + final DateTime? mineAt = mine?.updatedAt ?? _tombstones[r.id]; + if (mineAt != null && mineAt.isAfter(r.updatedAt)) return; + _tombstones.remove(r.id); + _missions = [ + if (r.spec != null) r.spec!, + for (final WaypointMissionSpec o in _missions) if (o.id != r.id) o, + ]..sort((WaypointMissionSpec a, WaypointMissionSpec b) => + (b.updatedAt ?? DateTime(0)).compareTo(a.updatedAt ?? DateTime(0))); + } + + void _setStatus(MissionSyncStatus s) { + if (_status == s) return; + _status = s; + notifyListeners(); } Future _persist() async { notifyListeners(); try { - _prefs ??= await SharedPreferences.getInstance(); - await _prefs!.setString(_key, encode(_missions)); + await _store(); } catch (_) { // Storage unavailable: the library lives for this session only. } } + Future _store() async { + _prefs ??= await SharedPreferences.getInstance(); + final String key = _keyFor(_account); + await _prefs!.setString(key, encode(_missions)); + if (_tombstones.isEmpty) { + await _prefs!.remove('$key.deleted'); + } else { + await _prefs!.setString('$key.deleted', + jsonEncode({for (final MapEntry e in _tombstones.entries) e.key: e.value.toUtc().toIso8601String()})); + } + } + static String newId([DateTime? now]) => 'wp-${(now ?? DateTime.now()).microsecondsSinceEpoch.toRadixString(36)}'; static String encode(List missions) => diff --git a/Fly App/lib/fly/modes/mission_sync.dart b/Fly App/lib/fly/modes/mission_sync.dart new file mode 100644 index 0000000..2781828 --- /dev/null +++ b/Fly App/lib/fly/modes/mission_sync.dart @@ -0,0 +1,211 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import '../../pb_auth.dart'; +import 'waypoint_mission.dart'; + +/// One route as the API Server reports it: a [spec], or a tombstone (null +/// [spec]) left by a delete on some device. [updatedAt] is the +/// last-writer-wins clock either way. +class RemoteRoute { + const RemoteRoute(this.id, this.updatedAt, this.spec); + + final String id; + final DateTime updatedAt; + final WaypointMissionSpec? spec; + + bool get deleted => spec == null; + + /// Reads one entry of the server's `/api/routes` view. Null when unusable. + static RemoteRoute? fromView(Map v) { + final String id = v['id'] as String? ?? ''; + final DateTime? at = DateTime.tryParse(v['updatedAt'] as String? ?? ''); + if (id.isEmpty || at == null) return null; + if (v['deleted'] == true) return RemoteRoute(id, at, null); + final Object? spec = v['spec']; + if (spec is! Map) return null; + try { + final WaypointMissionSpec m = WaypointMissionSpec.fromJson(Map.from(spec)); + return RemoteRoute(id, at, m.copyWith(id: id, updatedAt: m.updatedAt ?? at)); + } catch (_) { + return null; + } + } +} + +/// The server half of the mission library. [ApiMissionRemote] is the real one. +abstract class MissionRemote { + /// Who the routes belong to; empty while signed out (nothing syncs). + String get account; + + /// Every route the account owns, tombstones included. + Future> pull(); + + /// Stores [m]. Returns the server's copy when it holds a newer one (the + /// write was refused), else null. + Future push(WaypointMissionSpec m); + + /// Tombstones route [id] as deleted at [at]. Returns the server's copy when + /// the route was changed after [at] (the delete was refused), else null. + Future pushDelete(String id, DateTime at); +} + +/// What [mergeMissions] decided. +class MissionMerge { + const MissionMerge({required this.missions, required this.tombstones, required this.toPush, required this.toDelete}); + + /// The library after the merge, newest first. + final List missions; + + /// Local deletes the server has not heard of yet. + final Map tombstones; + + /// Local routes newer than the server's copy (or unknown to it). + final List toPush; + + /// Local deletes newer than the server's live copy. + final Map toDelete; +} + +final DateTime _epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true); + +/// Last-writer-wins merge of the device's library with the server's, per +/// route id, by `updatedAt`. A delete counts as a write at the time it was +/// made, on either side. On a tie the server wins. +/// +/// A route saved before it had an `updatedAt` is treated as the oldest +/// possible write (and stamped so it can be pushed). +MissionMerge mergeMissions({ + required List local, + required Map tombstones, + required List remote, +}) { + final Map mine = { + for (final WaypointMissionSpec m in local) m.id: m.updatedAt == null ? m.copyWith(updatedAt: _epoch) : m, + }; + final Map theirs = {for (final RemoteRoute r in remote) r.id: r}; + + final Map out = {}; + final Map keepTombstones = {}; + final List toPush = []; + final Map toDelete = {}; + + final Set ids = {...mine.keys, ...tombstones.keys, ...theirs.keys}; + for (final String id in ids) { + final WaypointMissionSpec? l = mine[id]; + final DateTime? t = tombstones[id]; + final RemoteRoute? r = theirs[id]; + + // The device's own latest word on this route: a save, or a delete. + final bool localDeleted = t != null && (l == null || !t.isBefore(l.updatedAt!)); + final DateTime? localAt = localDeleted ? t : l?.updatedAt; + + if (r == null) { + // The server never had it: push a save; a delete has nothing to undo. + if (!localDeleted && l != null) { + out[id] = l; + toPush.add(l); + } + continue; + } + if (localAt == null || !localAt.isAfter(r.updatedAt)) { + // The server's copy (or its delete) is the newest word. + if (!r.deleted) out[id] = r.spec!; + continue; + } + if (localDeleted) { + if (!r.deleted) { + keepTombstones[id] = t; + toDelete[id] = t; + } + } else { + out[id] = l!; + toPush.add(l); + } + } + + final List missions = out.values.toList() + ..sort((WaypointMissionSpec a, WaypointMissionSpec b) => b.updatedAt!.compareTo(a.updatedAt!)); + return MissionMerge(missions: missions, tombstones: keepTombstones, toPush: toPush, toDelete: toDelete); +} + +/// [MissionRemote] over the API Server's `/api/routes`, as the signed-in +/// pilot ([auth]). +class ApiMissionRemote implements MissionRemote { + ApiMissionRemote({PbAuth? auth}) : _auth = auth; + + final PbAuth? _auth; + PbAuth get _a => _auth ?? auth; + + static const Duration _timeout = Duration(seconds: 10); + + @override + String get account => _a.isAuthed ? (_a.userEmail.isEmpty ? '_' : _a.userEmail) : ''; + + @override + Future> pull() async { + final (int status, Map body) = await _send('GET', '/api/routes?mine=1&includeDeleted=1'); + if (status != 200) throw MissionSyncException(status, body); + return [ + for (final Object? v in (body['routes'] as List? ?? const [])) + if (v is Map) + if (RemoteRoute.fromView(Map.from(v)) case final RemoteRoute r) r, + ]; + } + + @override + Future push(WaypointMissionSpec m) async { + final (int status, Map body) = + await _send('PUT', '/api/routes/${Uri.encodeComponent(m.id)}', body: m.toJson()); + if (status == 200 || status == 201) return null; + return _conflict(status, body); + } + + @override + Future pushDelete(String id, DateTime at) async { + final String when = Uri.encodeQueryComponent(at.toUtc().toIso8601String()); + final (int status, Map body) = await _send('DELETE', '/api/routes/${Uri.encodeComponent(id)}?at=$when'); + // 404: the server never had it, which is as deleted as it gets. + if (status == 200 || status == 404) return null; + return _conflict(status, body); + } + + RemoteRoute _conflict(int status, Map body) { + final Object? route = body['route']; + final RemoteRoute? r = status == 409 && route is Map ? RemoteRoute.fromView(Map.from(route)) : null; + if (r == null) throw MissionSyncException(status, body); + return r; + } + + Future<(int, Map)> _send(String method, String path, {Object? body}) async { + final HttpClient http = HttpClient()..connectionTimeout = _timeout; + try { + final HttpClientRequest req = await http.openUrl(method, Uri.parse('${_a.serverUrl}$path')); + req.headers.set(HttpHeaders.authorizationHeader, _a.token); + if (body != null) { + req.headers.contentType = ContentType.json; + req.add(utf8.encode(jsonEncode(body))); + } + final HttpClientResponse resp = await req.close().timeout(_timeout); + final String text = await resp.transform(utf8.decoder).join().timeout(_timeout); + Map json = {}; + try { + final Object? decoded = text.isEmpty ? null : jsonDecode(text); + if (decoded is Map) json = Map.from(decoded); + } catch (_) {} + return (resp.statusCode, json); + } finally { + http.close(force: true); + } + } +} + +class MissionSyncException implements Exception { + const MissionSyncException(this.status, this.body); + final int status; + final Map body; + + @override + String toString() => (body['error'] ?? 'Route sync failed ($status)').toString(); +} diff --git a/Fly App/lib/ui/fly/fly_screen.dart b/Fly App/lib/ui/fly/fly_screen.dart index 741fb6c..0b25976 100644 --- a/Fly App/lib/ui/fly/fly_screen.dart +++ b/Fly App/lib/ui/fly/fly_screen.dart @@ -8,6 +8,7 @@ import '../../fly/flight_trail.dart'; import '../../fly/fly_prefs.dart'; import '../../fly/hud_features.dart'; import '../../fly/modes/mission_library.dart'; +import '../../fly/modes/mission_sync.dart' show ApiMissionRemote; import '../../fly/modes/vision_modes.dart'; import '../../fly/modes/waypoint_editor.dart'; import '../../fly/modes/waypoint_mission.dart' show MissionLimits; @@ -110,7 +111,7 @@ class _FlyScreenState extends State { IntelligentMode? _mode; late final WaypointEditor _waypoints = widget.waypoints ?? WaypointEditor(); final VisionSession _vision = VisionSession(); - late final MissionLibrary _library = MissionLibrary()..load(); + late final MissionLibrary _library = MissionLibrary(remote: ApiMissionRemote())..load(); MissionLimits _limits = const MissionLimits(); int _seenFinishes = 0; diff --git a/Fly App/lib/ui/fly/modes/waypoints/waypoint_sheets.dart b/Fly App/lib/ui/fly/modes/waypoints/waypoint_sheets.dart index d215021..d747879 100644 --- a/Fly App/lib/ui/fly/modes/waypoints/waypoint_sheets.dart +++ b/Fly App/lib/ui/fly/modes/waypoints/waypoint_sheets.dart @@ -190,8 +190,11 @@ class IssueRow extends StatelessWidget { // ── Mission library ──────────────────────────────────────────────────────── /// The saved routes: save the current one, start a new one, load or delete. -Future showMissionLibrary(BuildContext context, {required WaypointEditor editor, required MissionLibrary library}) => - _showSheet(context, title: 'Mission library', icon: 'album', body: MissionLibraryList(editor: editor, library: library)); +/// Opening it also syncs, so routes saved on another device show up. +Future showMissionLibrary(BuildContext context, {required WaypointEditor editor, required MissionLibrary library}) { + library.sync(); + return _showSheet(context, title: 'Mission library', icon: 'album', body: MissionLibraryList(editor: editor, library: library)); +} class MissionLibraryList extends StatelessWidget { const MissionLibraryList({super.key, required this.editor, required this.library}); @@ -209,6 +212,13 @@ class MissionLibraryList extends StatelessWidget { editor.markSaved(await library.save(m)); } + static String _heading(MissionSyncStatus s) => switch (s) { + MissionSyncStatus.local => 'SAVED ON THIS DEVICE', + MissionSyncStatus.syncing => 'SAVED ROUTES · SYNCING…', + MissionSyncStatus.synced => 'SAVED ROUTES · SYNCED', + MissionSyncStatus.failed => 'SAVED ROUTES · OFFLINE, SYNCS LATER', + }; + Future _discardOk(BuildContext context) async { if (!editor.dirty || editor.mission.points.isEmpty) return true; return confirmHud(context, title: 'Discard changes?', body: 'The route on the map has unsaved changes.', action: 'Discard'); @@ -239,7 +249,7 @@ class MissionLibraryList extends StatelessWidget { ), Padding( padding: const EdgeInsets.fromLTRB(16, 14, 16, 4), - child: Text('SAVED ON THIS DEVICE', style: HudText.label), + child: Text(_heading(library.syncStatus), style: HudText.label), ), if (library.missions.isEmpty) Padding( @@ -256,7 +266,9 @@ class MissionLibraryList extends StatelessWidget { if (context.mounted) Navigator.of(context).pop(); }, onDelete: () async { - if (await confirmHud(context, title: 'Delete "${m.name}"?', body: 'The saved route is removed from this device.', action: 'Delete')) { + if (await confirmHud(context, title: 'Delete "${m.name}"?', body: library.syncStatus == MissionSyncStatus.local + ? 'The saved route is removed from this device.' + : 'The saved route is removed from this device and your account.', action: 'Delete')) { await library.delete(m.id); } }, diff --git a/Fly App/test/fly/waypoint_test.dart b/Fly App/test/fly/waypoint_test.dart index 30bb72b..55f2e1a 100644 --- a/Fly App/test/fly/waypoint_test.dart +++ b/Fly App/test/fly/waypoint_test.dart @@ -6,6 +6,7 @@ import 'package:pilotvault_fly/fly/action_rail_state.dart'; import 'package:pilotvault_fly/fly/fly_prefs.dart'; import 'package:pilotvault_fly/fly/modes/intelligent_modes.dart'; import 'package:pilotvault_fly/fly/modes/mission_library.dart'; +import 'package:pilotvault_fly/fly/modes/mission_sync.dart'; import 'package:pilotvault_fly/fly/modes/waypoint_editor.dart'; import 'package:pilotvault_fly/fly/modes/waypoint_mission.dart'; import 'package:pilotvault_fly/fly/product_profile.dart'; @@ -290,6 +291,156 @@ void main() { final List out = MissionLibrary.decode('[{"name":"ok","points":[]}, {"points": 7}, 3]'); expect(out.map((WaypointMissionSpec m) => m.name), ['ok']); }); + + group('sync', () { + WaypointMissionSpec named(String id, String name, int day) => + route([base, at(0, 100)]).copyWith(id: id, name: name, updatedAt: DateTime.utc(2026, 1, day)); + RemoteRoute live(WaypointMissionSpec m) => RemoteRoute(m.id, m.updatedAt!, m); + RemoteRoute gone(String id, int day) => RemoteRoute(id, DateTime.utc(2026, 1, day), null); + List names(Iterable ms) => [for (final WaypointMissionSpec m in ms) m.name]; + + test('merge: newest write wins per route, either side', () { + final MissionMerge m = mergeMissions( + local: [named('a', 'A local', 5), named('b', 'B local', 2), named('c', 'C only here', 3)], + tombstones: const {}, + remote: [live(named('a', 'A server', 4)), live(named('b', 'B server', 6)), live(named('d', 'D only there', 1))], + ); + expect(names(m.missions), ['B server', 'A local', 'C only here', 'D only there'], reason: 'newest first'); + expect(names(m.toPush), unorderedEquals(['A local', 'C only here'])); + expect(m.toDelete, isEmpty); + }); + + test('merge: a tie goes to the server and pushes nothing', () { + final MissionMerge m = mergeMissions( + local: [named('a', 'mine', 3)], + tombstones: const {}, + remote: [live(named('a', 'theirs', 3))], + ); + expect(names(m.missions), ['theirs']); + expect(m.toPush, isEmpty); + }); + + test('merge: deletes are writes too', () { + final MissionMerge m = mergeMissions( + local: [named('kept', 'edited after their delete', 5), named('dropped', 'stale', 2)], + tombstones: { + 'del': DateTime.utc(2026, 1, 5), // deleted here after their edit + 'lost': DateTime.utc(2026, 1, 1), // deleted here, but edited there since + 'never': DateTime.utc(2026, 1, 1), // deleted before it ever reached the server + 'both': DateTime.utc(2026, 1, 4), // deleted on both sides + }, + remote: [ + gone('kept', 4), + gone('dropped', 3), + live(named('del', 'old', 4)), + live(named('lost', 'edited there', 2)), + gone('both', 2), + ], + ); + expect(names(m.missions), ['edited after their delete', 'edited there']); + expect(names(m.toPush), ['edited after their delete'], reason: 'resurrects it on the server'); + expect(m.toDelete, {'del': DateTime.utc(2026, 1, 5)}); + expect(m.tombstones.keys, ['del'], reason: 'only unacknowledged deletes stay'); + }); + + test('merge: a route with no updatedAt is the oldest write, and gets one to push', () { + final MissionMerge m = mergeMissions( + local: [route([base]).copyWith(id: 'legacy', name: 'legacy')], + tombstones: const {}, + remote: const [], + ); + expect(m.toPush.single.updatedAt, isNotNull); + }); + + test('the server view parses, tombstones included', () { + final WaypointMissionSpec spec = named('wp-1', 'R', 3); + final RemoteRoute? r = RemoteRoute.fromView({ + 'id': 'wp-1', + 'updatedAt': '2026-01-03T00:00:00.000000Z', + 'deleted': false, + 'spec': spec.toJson(), + }); + expect(r!.spec!.toJson(), spec.toJson()); + final RemoteRoute? t = RemoteRoute.fromView({'id': 'wp-1', 'updatedAt': '2026-01-04T00:00:00Z', 'deleted': true}); + expect(t!.deleted, isTrue); + expect(RemoteRoute.fromView({'id': 'wp-1', 'deleted': false, 'spec': spec.toJson()}), isNull); + }); + + test('a route saved on one tablet is there after a reinstall + sign-in', () async { + final _FakeRemote server = _FakeRemote('pilot@x'); + final MissionLibrary tablet = MissionLibrary(remote: server); + await tablet.load(); + final WaypointMissionSpec saved = await tablet.save(route([base, at(0, 100)]).copyWith(name: 'Survey')); + await tablet.idle; + expect(server.routes.keys, [saved.id]); + expect(tablet.syncStatus, MissionSyncStatus.synced); + + SharedPreferences.setMockInitialValues({}); // reinstall + final MissionLibrary fresh = MissionLibrary(remote: server); + await fresh.load(); + expect(fresh.missions.single.toJson(), saved.toJson()); + + await fresh.delete(saved.id); + await fresh.idle; + expect(server.routes[saved.id]!.deleted, isTrue); + await tablet.sync(); + expect(tablet.missions, isEmpty, reason: 'the other tablet learns of the delete'); + }); + + test('offline: saves and deletes stay local and go up on the next sync', () async { + final _FakeRemote server = _FakeRemote('pilot@x')..offline = true; + final MissionLibrary lib = MissionLibrary(remote: server); + await lib.load(); + expect(lib.syncStatus, MissionSyncStatus.failed); + final WaypointMissionSpec a = await lib.save(route([base]).copyWith(name: 'A'), now: DateTime.utc(2026, 1, 1)); + final WaypointMissionSpec b = await lib.save(route([base]).copyWith(name: 'B'), now: DateTime.utc(2026, 1, 2)); + server.routes[b.id] = RemoteRoute(b.id, DateTime.utc(2026, 1, 2), b); // reached the server earlier + await lib.delete(b.id, now: DateTime.utc(2026, 1, 3)); + await lib.idle; + expect(names(lib.missions), ['A'], reason: 'works offline'); + + final MissionLibrary reopened = MissionLibrary(remote: server); + await reopened.load(); + expect(names(reopened.missions), ['A'], reason: 'the pending delete survives a restart'); + + server.offline = false; + await reopened.sync(); + expect(server.routes[a.id]!.spec!.name, 'A'); + expect(server.routes[b.id]!.deleted, isTrue); + expect(reopened.syncStatus, MissionSyncStatus.synced); + }); + + test('a refused push adopts the newer server copy', () async { + final _FakeRemote server = _FakeRemote('pilot@x'); + final MissionLibrary lib = MissionLibrary(remote: server); + await lib.load(); + final WaypointMissionSpec a = await lib.save(route([base]).copyWith(name: 'mine'), now: DateTime.utc(2026, 1, 1)); + // Someone else's newer save lands between our pull and our push. + server.beforePush = () => server.routes[a.id] = live(a.copyWith(name: 'theirs', updatedAt: DateTime.utc(2026, 1, 9))); + await lib.idle; + expect(names(lib.missions), ['theirs']); + }); + + test('signed-out routes are claimed by the first account; accounts stay apart', () async { + final _FakeRemote server = _FakeRemote(''); + final MissionLibrary lib = MissionLibrary(remote: server); + await lib.load(); + await lib.save(route([base]).copyWith(name: 'before sign-in')); + await lib.idle; + expect(lib.syncStatus, MissionSyncStatus.local); + expect(server.routes, isEmpty); + + server.who = 'a@x'; + await lib.sync(); + expect(names(lib.missions), ['before sign-in']); + expect(server.routes.values.single.spec!.name, 'before sign-in'); + + server.who = 'b@x'; + server.routes.clear(); // b's own (empty) server library + await lib.sync(); + expect(lib.missions, isEmpty, reason: "b never sees a's routes"); + }); + }); }); group('WaypointEditor', () { @@ -647,3 +798,46 @@ void main() { }); }); } + +/// An in-memory API Server route store, with the server's last-writer-wins rule. +class _FakeRemote implements MissionRemote { + _FakeRemote(this.who); + + String who; + bool offline = false; + void Function()? beforePush; + final Map routes = {}; + + @override + String get account => who; + + void _check() { + if (offline) throw const MissionSyncException(0, {'error': 'offline'}); + } + + @override + Future> pull() async { + _check(); + return routes.values.toList(); + } + + @override + Future push(WaypointMissionSpec m) async { + _check(); + beforePush?.call(); + final RemoteRoute? have = routes[m.id]; + if (have != null && have.updatedAt.isAfter(m.updatedAt!)) return have; + routes[m.id] = RemoteRoute(m.id, m.updatedAt!, m); + return null; + } + + @override + Future pushDelete(String id, DateTime at) async { + _check(); + final RemoteRoute? have = routes[id]; + if (have == null) return null; + if (have.updatedAt.isAfter(at)) return have; + routes[id] = RemoteRoute(id, at, null); + return null; + } +} diff --git a/Web App/server/bff.go b/Web App/server/bff.go index 854ccdc..8ec57bd 100644 --- a/Web App/server/bff.go +++ b/Web App/server/bff.go @@ -527,6 +527,19 @@ func (a *App) handleExportLogbook(w http.ResponseWriter, r *http.Request) { _, _ = io.Copy(w, resp.Body) } +/* ---------- Routes ---------- */ + +// GET /bff/routes → API Server /api/routes (preserves ?mine=1). +func (a *App) handleListRoutes(w http.ResponseWriter, r *http.Request) { + target := a.apiBaseFor(r) + "/api/routes" + if r.URL.RawQuery != "" { + target += "?" + r.URL.RawQuery + } + req, _ := http.NewRequest(http.MethodGet, target, nil) + req.Header.Set("Authorization", tokenOf(r)) + a.doRelay(w, req) +} + /* ---------- Documents ---------- */ // GET /bff/documents → API Server /api/documents (preserves ?expiring=N). diff --git a/Web App/server/dist/assets/index-Bw3iqrF-.css b/Web App/server/dist/assets/index-DFvwkmh-.css similarity index 55% rename from Web App/server/dist/assets/index-Bw3iqrF-.css rename to Web App/server/dist/assets/index-DFvwkmh-.css index 8c2ba28..6a9ea81 100644 --- a/Web App/server/dist/assets/index-Bw3iqrF-.css +++ b/Web App/server/dist/assets/index-DFvwkmh-.css @@ -1 +1 @@ -:root,[data-theme=light]{--navy-950: #0B1730;--navy-900: #0F1E3D;--navy-800: #1B2E52;--navy-700: #26406E;--blue-50: #EAF1FE;--blue-100: #D6E3FD;--blue-200: #B4CDFA;--blue-300: #8FB4F6;--blue-400: #5B93F5;--blue-500: #3D7BF0;--blue-600: #2B62CC;--blue-700: #1F4CA0;--slate-0: #FFFFFF;--slate-50: #F6F7F9;--slate-100: #EEF0F3;--slate-150: #E6E9EE;--slate-200: #DCE0E7;--slate-300: #C5CCD7;--slate-400: #97A1B0;--slate-500: #6B7688;--slate-600: #4C5566;--slate-700: #333B4A;--slate-800: #1E2635;--slate-900: #131A28;--slate-950: #0B111C;--steel: #5A6B85;--green-500: #1F8A5B;--green-100: #DCF1E7;--green-600:#177049;--amber-500: #D9852B;--amber-100: #FBEBD5;--amber-600:#B86C1B;--red-500: #D64545;--red-100: #FBE0E0;--red-600: #B83232;--bg-app: var(--slate-100);--bg-subtle: var(--slate-50);--surface: var(--slate-0);--surface-2: var(--slate-50);--surface-inset: var(--slate-100);--border: var(--slate-200);--border-strong: var(--slate-300);--border-subtle: var(--slate-150);--text-primary: var(--navy-900);--text-secondary:var(--steel);--text-tertiary: var(--slate-400);--text-inverse: var(--slate-0);--text-on-accent:#FFFFFF;--accent: var(--blue-500);--accent-hover: var(--blue-600);--accent-active: var(--blue-700);--accent-soft: var(--blue-50);--accent-soft-fg:var(--blue-700);--focus-ring: color-mix(in srgb, var(--blue-500) 45%, transparent);--success: var(--green-500);--success-soft: var(--green-100);--success-fg: var(--green-600);--warning: var(--amber-500);--warning-soft: var(--amber-100);--warning-fg: var(--amber-600);--danger: var(--red-500);--danger-soft: var(--red-100);--danger-fg: var(--red-600);--overlay: color-mix(in srgb, var(--navy-950) 55%, transparent);--font-sans: "Space Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono: "Space Mono", ui-monospace, "SF Mono", "JetBrains Mono", monospace;--radius-xs: 4px;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--radius-xl: 20px;--radius-pill: 999px;--shadow-xs: 0 1px 2px rgba(15,30,61,.06);--shadow-sm: 0 1px 2px rgba(15,30,61,.06), 0 1px 3px rgba(15,30,61,.04);--shadow-md: 0 2px 4px rgba(15,30,61,.06), 0 6px 16px rgba(15,30,61,.08);--shadow-lg: 0 8px 24px rgba(15,30,61,.1), 0 2px 6px rgba(15,30,61,.06);--ease-standard: cubic-bezier(.4, 0, .2, 1);--ease-out: cubic-bezier(.16, 1, .3, 1);--dur-fast: .12s;--dur-base: .2s;color-scheme:light}[data-theme=dark]{--bg-app: var(--navy-950);--bg-subtle: var(--slate-950);--surface: #10203F;--surface-2: #142748;--surface-inset: var(--navy-950);--border: color-mix(in srgb, #FFFFFF 10%, transparent);--border-strong: color-mix(in srgb, #FFFFFF 18%, transparent);--border-subtle: color-mix(in srgb, #FFFFFF 6%, transparent);--text-primary: #F4F7FC;--text-secondary:#8FA0BE;--text-tertiary: #5E6E8C;--text-inverse: var(--navy-900);--text-on-accent:#FFFFFF;--accent: var(--blue-400);--accent-hover: var(--blue-300);--accent-active: var(--blue-200);--accent-soft: color-mix(in srgb, var(--blue-500) 18%, transparent);--accent-soft-fg:var(--blue-300);--focus-ring: color-mix(in srgb, var(--blue-400) 55%, transparent);--success:var(--green-500);--success-soft: color-mix(in srgb, var(--green-500) 22%, transparent);--success-fg:#5FD3A0;--warning:var(--amber-500);--warning-soft: color-mix(in srgb, var(--amber-500) 22%, transparent);--warning-fg:#F0B26A;--danger: var(--red-500);--danger-soft: color-mix(in srgb, var(--red-500) 22%, transparent);--danger-fg: #F08A8A;--overlay: color-mix(in srgb, #000000 62%, transparent);--shadow-xs: 0 1px 2px rgba(0,0,0,.35);--shadow-sm: 0 1px 3px rgba(0,0,0,.4);--shadow-md: 0 4px 12px rgba(0,0,0,.45);--shadow-lg: 0 12px 32px rgba(0,0,0,.5);color-scheme:dark}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Space Grotesk,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tabular{font-variant-numeric:tabular-nums}.eyebrow{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-size:11px;text-transform:uppercase;letter-spacing:.14em;color:var(--text-tertiary)}.readout{font-variant-numeric:tabular-nums;font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-size:30px;line-height:1;font-weight:500;color:var(--text-primary)}.panel{border-radius:14px;border-width:1px;border-color:var(--border);background-color:var(--surface);--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.pill{border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface-2);padding:.5rem .75rem}.field{width:100%;border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface-2);padding:.625rem .75rem;font-size:.875rem;line-height:1.25rem;color:var(--text-primary);outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.field::-moz-placeholder{color:var(--text-tertiary)}.field::placeholder{color:var(--text-tertiary)}.field{transition-duration:var(--dur-fast)}.field:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring)}.btn-accent{border-radius:10px;background-color:var(--accent);padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-accent:hover{background-color:var(--accent-hover)}.btn-accent:active{--tw-translate-y: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn-accent:disabled{opacity:.5}.btn-accent{transition-duration:var(--dur-fast)}.btn-ghost{border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface);padding:.375rem .75rem;font-size:.875rem;line-height:1.25rem;color:var(--text-secondary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{border-color:var(--border-strong);color:var(--text-primary)}.btn-ghost:active{--tw-translate-y: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn-ghost{transition-duration:var(--dur-fast)}.btn-icon{display:grid;height:2.25rem;width:2.25rem;place-items:center;border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface);color:var(--text-secondary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-icon:hover{border-color:var(--border-strong);color:var(--text-primary)}.btn-icon{transition-duration:var(--dur-fast)}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-5{bottom:1.25rem}.right-0{right:0}.right-5{right:1.25rem}.top-0{top:0}.top-5{top:1.25rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1190\]{z-index:1190}.z-\[1200\]{z-index:1200}.col-span-2{grid-column:span 2 / span 2}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-28{height:7rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[180px\]{height:180px}.h-\[18px\]{height:18px}.h-\[320px\]{height:320px}.h-\[74vh\]{height:74vh}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-\[16px\]{min-height:16px}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[18px\]{width:18px}.w-\[380px\]{width:380px}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[1240px\]{max-width:1240px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[220px\]{max-width:220px}.max-w-\[280px\]{max-width:280px}.max-w-\[360px\]{max-width:360px}.max-w-\[420px\]{max-width:420px}.max-w-\[520px\]{max-width:520px}.max-w-\[920px\]{max-width:920px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x: 1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.grid-cols-\[210px_1fr\]{grid-template-columns:210px 1fr}.grid-cols-\[248px_1fr\]{grid-template-columns:248px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1\.5{row-gap:.375rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded,.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:14px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-none{border-style:none}.border-accent{border-color:var(--accent)}.border-line{border-color:var(--border)}.border-line-strong{border-color:var(--border-strong)}.border-transparent{border-color:transparent}.bg-\[var\(--navy-800\)\]{background-color:var(--navy-800)}.bg-accent{background-color:var(--accent)}.bg-accent-soft{background-color:var(--accent-soft)}.bg-amber{background-color:var(--warning)}.bg-amber-soft{background-color:var(--warning-soft)}.bg-caution{background-color:var(--warning)}.bg-current{background-color:currentColor}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-ink-muted{background-color:var(--text-tertiary)}.bg-line{background-color:var(--border)}.bg-ready,.bg-success{background-color:var(--success)}.bg-success-soft{background-color:var(--success-soft)}.bg-surface-1{background-color:var(--surface)}.bg-surface-2{background-color:var(--surface-2)}.bg-transparent{background-color:transparent}.bg-warning{background-color:var(--danger)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-10{padding:2.5rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-8{padding-bottom:2rem}.pr-10{padding-right:2.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[30px\]{font-size:30px}.text-\[34px\]{font-size:34px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-mode{font-size:18px;line-height:1.2;letter-spacing:-.02em;font-weight:600}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-caps{letter-spacing:.14em}.tracking-tightest{letter-spacing:-.02em}.text-accent{color:var(--accent)}.text-accent-soft-fg{color:var(--accent-soft-fg)}.text-amber-fg{color:var(--warning-fg)}.text-danger-fg{color:var(--danger-fg)}.text-ink{color:var(--text-primary)}.text-ink-muted{color:var(--text-tertiary)}.text-ink-secondary{color:var(--text-secondary)}.text-success-fg{color:var(--success-fg)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.accent-\[var\(--accent\)\]{accent-color:var(--accent)}.accent-\[var\(--danger\)\]{accent-color:var(--danger)}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--shadow-lg);--tw-shadow-colored: var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--shadow-md);--tw-shadow-colored: var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}html,body,#app{height:100%}html{background-color:var(--bg-app);transition:background-color var(--dur-base) var(--ease-standard)}body{font-family:Space Grotesk,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;color:var(--text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#app{background-color:var(--bg-app);min-height:100vh;transition:background-color var(--dur-base) var(--ease-standard)}html.reduce-motion *,html.reduce-motion *:before,html.reduce-motion *:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}.leaflet-container{background:var(--surface-inset);font-family:var(--font-sans)}.leaflet-control-attribution{background:color-mix(in srgb,var(--surface) 82%,transparent)!important;color:var(--text-tertiary)!important}.leaflet-control-attribution a{color:var(--text-secondary)!important}.placeholder\:text-ink-muted::-moz-placeholder{color:var(--text-tertiary)}.placeholder\:text-ink-muted::placeholder{color:var(--text-tertiary)}.first\:mt-0:first-child{margin-top:0}.last\:border-0:last-child{border-width:0px}.hover\:border-line-strong:hover{border-color:var(--border-strong)}.hover\:bg-danger-soft:hover{background-color:var(--danger-soft)}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:text-ink:hover{color:var(--text-primary)}.hover\:text-ink-secondary:hover{color:var(--text-secondary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.enabled\:hover\:brightness-110:hover:enabled{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(max-width:1100px){.max-\[1100px\]\:hidden{display:none}.max-\[1100px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[1100px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:900px){.max-\[900px\]\:hidden{display:none}.max-\[900px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[900px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:820px){.max-\[820px\]\:col-span-1{grid-column:span 1 / span 1}.max-\[820px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media(max-width:760px){.max-\[760px\]\:col-span-1{grid-column:span 1 / span 1}.max-\[760px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[760px\]\:flex-row{flex-direction:row}.max-\[760px\]\:overflow-x-auto{overflow-x:auto}}@media(max-width:560px){.max-\[560px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media(min-width:640px){.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}.fade-enter-active[data-v-7522b856],.fade-leave-active[data-v-7522b856]{transition:opacity .2s}.fade-enter-from[data-v-7522b856],.fade-leave-to[data-v-7522b856]{opacity:0} +:root,[data-theme=light]{--navy-950: #0B1730;--navy-900: #0F1E3D;--navy-800: #1B2E52;--navy-700: #26406E;--blue-50: #EAF1FE;--blue-100: #D6E3FD;--blue-200: #B4CDFA;--blue-300: #8FB4F6;--blue-400: #5B93F5;--blue-500: #3D7BF0;--blue-600: #2B62CC;--blue-700: #1F4CA0;--slate-0: #FFFFFF;--slate-50: #F6F7F9;--slate-100: #EEF0F3;--slate-150: #E6E9EE;--slate-200: #DCE0E7;--slate-300: #C5CCD7;--slate-400: #97A1B0;--slate-500: #6B7688;--slate-600: #4C5566;--slate-700: #333B4A;--slate-800: #1E2635;--slate-900: #131A28;--slate-950: #0B111C;--steel: #5A6B85;--green-500: #1F8A5B;--green-100: #DCF1E7;--green-600:#177049;--amber-500: #D9852B;--amber-100: #FBEBD5;--amber-600:#B86C1B;--red-500: #D64545;--red-100: #FBE0E0;--red-600: #B83232;--bg-app: var(--slate-100);--bg-subtle: var(--slate-50);--surface: var(--slate-0);--surface-2: var(--slate-50);--surface-inset: var(--slate-100);--border: var(--slate-200);--border-strong: var(--slate-300);--border-subtle: var(--slate-150);--text-primary: var(--navy-900);--text-secondary:var(--steel);--text-tertiary: var(--slate-400);--text-inverse: var(--slate-0);--text-on-accent:#FFFFFF;--accent: var(--blue-500);--accent-hover: var(--blue-600);--accent-active: var(--blue-700);--accent-soft: var(--blue-50);--accent-soft-fg:var(--blue-700);--focus-ring: color-mix(in srgb, var(--blue-500) 45%, transparent);--success: var(--green-500);--success-soft: var(--green-100);--success-fg: var(--green-600);--warning: var(--amber-500);--warning-soft: var(--amber-100);--warning-fg: var(--amber-600);--danger: var(--red-500);--danger-soft: var(--red-100);--danger-fg: var(--red-600);--overlay: color-mix(in srgb, var(--navy-950) 55%, transparent);--font-sans: "Space Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono: "Space Mono", ui-monospace, "SF Mono", "JetBrains Mono", monospace;--radius-xs: 4px;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--radius-xl: 20px;--radius-pill: 999px;--shadow-xs: 0 1px 2px rgba(15,30,61,.06);--shadow-sm: 0 1px 2px rgba(15,30,61,.06), 0 1px 3px rgba(15,30,61,.04);--shadow-md: 0 2px 4px rgba(15,30,61,.06), 0 6px 16px rgba(15,30,61,.08);--shadow-lg: 0 8px 24px rgba(15,30,61,.1), 0 2px 6px rgba(15,30,61,.06);--ease-standard: cubic-bezier(.4, 0, .2, 1);--ease-out: cubic-bezier(.16, 1, .3, 1);--dur-fast: .12s;--dur-base: .2s;color-scheme:light}[data-theme=dark]{--bg-app: var(--navy-950);--bg-subtle: var(--slate-950);--surface: #10203F;--surface-2: #142748;--surface-inset: var(--navy-950);--border: color-mix(in srgb, #FFFFFF 10%, transparent);--border-strong: color-mix(in srgb, #FFFFFF 18%, transparent);--border-subtle: color-mix(in srgb, #FFFFFF 6%, transparent);--text-primary: #F4F7FC;--text-secondary:#8FA0BE;--text-tertiary: #5E6E8C;--text-inverse: var(--navy-900);--text-on-accent:#FFFFFF;--accent: var(--blue-400);--accent-hover: var(--blue-300);--accent-active: var(--blue-200);--accent-soft: color-mix(in srgb, var(--blue-500) 18%, transparent);--accent-soft-fg:var(--blue-300);--focus-ring: color-mix(in srgb, var(--blue-400) 55%, transparent);--success:var(--green-500);--success-soft: color-mix(in srgb, var(--green-500) 22%, transparent);--success-fg:#5FD3A0;--warning:var(--amber-500);--warning-soft: color-mix(in srgb, var(--amber-500) 22%, transparent);--warning-fg:#F0B26A;--danger: var(--red-500);--danger-soft: color-mix(in srgb, var(--red-500) 22%, transparent);--danger-fg: #F08A8A;--overlay: color-mix(in srgb, #000000 62%, transparent);--shadow-xs: 0 1px 2px rgba(0,0,0,.35);--shadow-sm: 0 1px 3px rgba(0,0,0,.4);--shadow-md: 0 4px 12px rgba(0,0,0,.45);--shadow-lg: 0 12px 32px rgba(0,0,0,.5);color-scheme:dark}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Space Grotesk,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tabular{font-variant-numeric:tabular-nums}.eyebrow{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-size:11px;text-transform:uppercase;letter-spacing:.14em;color:var(--text-tertiary)}.readout{font-variant-numeric:tabular-nums;font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace;font-size:30px;line-height:1;font-weight:500;color:var(--text-primary)}.panel{border-radius:14px;border-width:1px;border-color:var(--border);background-color:var(--surface);--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.pill{border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface-2);padding:.5rem .75rem}.field{width:100%;border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface-2);padding:.625rem .75rem;font-size:.875rem;line-height:1.25rem;color:var(--text-primary);outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.field::-moz-placeholder{color:var(--text-tertiary)}.field::placeholder{color:var(--text-tertiary)}.field{transition-duration:var(--dur-fast)}.field:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring)}.btn-accent{border-radius:10px;background-color:var(--accent);padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-accent:hover{background-color:var(--accent-hover)}.btn-accent:active{--tw-translate-y: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn-accent:disabled{opacity:.5}.btn-accent{transition-duration:var(--dur-fast)}.btn-ghost{border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface);padding:.375rem .75rem;font-size:.875rem;line-height:1.25rem;color:var(--text-secondary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{border-color:var(--border-strong);color:var(--text-primary)}.btn-ghost:active{--tw-translate-y: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn-ghost{transition-duration:var(--dur-fast)}.btn-icon{display:grid;height:2.25rem;width:2.25rem;place-items:center;border-radius:10px;border-width:1px;border-color:var(--border);background-color:var(--surface);color:var(--text-secondary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-icon:hover{border-color:var(--border-strong);color:var(--text-primary)}.btn-icon{transition-duration:var(--dur-fast)}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-5{bottom:1.25rem}.right-0{right:0}.right-5{right:1.25rem}.top-0{top:0}.top-5{top:1.25rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1190\]{z-index:1190}.z-\[1200\]{z-index:1200}.col-span-2{grid-column:span 2 / span 2}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-28{height:7rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[180px\]{height:180px}.h-\[18px\]{height:18px}.h-\[320px\]{height:320px}.h-\[74vh\]{height:74vh}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-\[16px\]{min-height:16px}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[18px\]{width:18px}.w-\[380px\]{width:380px}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[1240px\]{max-width:1240px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[220px\]{max-width:220px}.max-w-\[280px\]{max-width:280px}.max-w-\[360px\]{max-width:360px}.max-w-\[420px\]{max-width:420px}.max-w-\[520px\]{max-width:520px}.max-w-\[920px\]{max-width:920px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x: 1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.grid-cols-\[210px_1fr\]{grid-template-columns:210px 1fr}.grid-cols-\[248px_1fr\]{grid-template-columns:248px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1\.5{row-gap:.375rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded,.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:14px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-none{border-style:none}.border-accent{border-color:var(--accent)}.border-line{border-color:var(--border)}.border-line-strong{border-color:var(--border-strong)}.border-transparent{border-color:transparent}.bg-\[var\(--navy-800\)\]{background-color:var(--navy-800)}.bg-accent{background-color:var(--accent)}.bg-accent-soft{background-color:var(--accent-soft)}.bg-amber{background-color:var(--warning)}.bg-amber-soft{background-color:var(--warning-soft)}.bg-caution{background-color:var(--warning)}.bg-current{background-color:currentColor}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-ink-muted{background-color:var(--text-tertiary)}.bg-line{background-color:var(--border)}.bg-ready,.bg-success{background-color:var(--success)}.bg-success-soft{background-color:var(--success-soft)}.bg-surface-1{background-color:var(--surface)}.bg-surface-2{background-color:var(--surface-2)}.bg-transparent{background-color:transparent}.bg-warning{background-color:var(--danger)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-10{padding:2.5rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-8{padding-bottom:2rem}.pr-10{padding-right:2.5rem}.pr-4{padding-right:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Space Mono,ui-monospace,SF Mono,JetBrains Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[30px\]{font-size:30px}.text-\[34px\]{font-size:34px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-mode{font-size:18px;line-height:1.2;letter-spacing:-.02em;font-weight:600}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-caps{letter-spacing:.14em}.tracking-tightest{letter-spacing:-.02em}.text-accent{color:var(--accent)}.text-accent-soft-fg{color:var(--accent-soft-fg)}.text-amber-fg{color:var(--warning-fg)}.text-danger-fg{color:var(--danger-fg)}.text-ink{color:var(--text-primary)}.text-ink-muted{color:var(--text-tertiary)}.text-ink-secondary{color:var(--text-secondary)}.text-success-fg{color:var(--success-fg)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.accent-\[var\(--accent\)\]{accent-color:var(--accent)}.accent-\[var\(--danger\)\]{accent-color:var(--danger)}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--shadow-lg);--tw-shadow-colored: var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--shadow-md);--tw-shadow-colored: var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}html,body,#app{height:100%}html{background-color:var(--bg-app);transition:background-color var(--dur-base) var(--ease-standard)}body{font-family:Space Grotesk,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;color:var(--text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#app{background-color:var(--bg-app);min-height:100vh;transition:background-color var(--dur-base) var(--ease-standard)}html.reduce-motion *,html.reduce-motion *:before,html.reduce-motion *:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}.leaflet-container{background:var(--surface-inset);font-family:var(--font-sans)}.leaflet-control-attribution{background:color-mix(in srgb,var(--surface) 82%,transparent)!important;color:var(--text-tertiary)!important}.leaflet-control-attribution a{color:var(--text-secondary)!important}.placeholder\:text-ink-muted::-moz-placeholder{color:var(--text-tertiary)}.placeholder\:text-ink-muted::placeholder{color:var(--text-tertiary)}.first\:mt-0:first-child{margin-top:0}.last\:border-0:last-child{border-width:0px}.hover\:border-line-strong:hover{border-color:var(--border-strong)}.hover\:bg-danger-soft:hover{background-color:var(--danger-soft)}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:text-ink:hover{color:var(--text-primary)}.hover\:text-ink-secondary:hover{color:var(--text-secondary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.enabled\:hover\:brightness-110:hover:enabled{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(max-width:1100px){.max-\[1100px\]\:hidden{display:none}.max-\[1100px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[1100px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:900px){.max-\[900px\]\:hidden{display:none}.max-\[900px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[900px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:820px){.max-\[820px\]\:col-span-1{grid-column:span 1 / span 1}.max-\[820px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media(max-width:760px){.max-\[760px\]\:col-span-1{grid-column:span 1 / span 1}.max-\[760px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[760px\]\:flex-row{flex-direction:row}.max-\[760px\]\:overflow-x-auto{overflow-x:auto}}@media(max-width:560px){.max-\[560px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media(min-width:640px){.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}.fade-enter-active[data-v-7522b856],.fade-leave-active[data-v-7522b856]{transition:opacity .2s}.fade-enter-from[data-v-7522b856],.fade-leave-to[data-v-7522b856]{opacity:0} diff --git a/Web App/server/dist/assets/index-DwIAtafL.js b/Web App/server/dist/assets/index-DwIAtafL.js new file mode 100644 index 0000000..4224688 --- /dev/null +++ b/Web App/server/dist/assets/index-DwIAtafL.js @@ -0,0 +1,20 @@ +(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))l(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const h of f.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&l(h)}).observe(document,{childList:!0,subtree:!0});function s(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function l(u){if(u.ep)return;u.ep=!0;const f=s(u);fetch(u.href,f)}})();/** +* @vue/shared v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Xr(t){const i=Object.create(null);for(const s of t.split(","))i[s]=1;return s=>s in i}const vt={},es=[],ci=()=>{},zu=()=>!1,ja=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),Wa=t=>t.startsWith("onUpdate:"),Kt=Object.assign,Qr=(t,i)=>{const s=t.indexOf(i);s>-1&&t.splice(s,1)},pd=Object.prototype.hasOwnProperty,ct=(t,i)=>pd.call(t,i),Ne=Array.isArray,ts=t=>ea(t)==="[object Map]",ls=t=>ea(t)==="[object Set]",Al=t=>ea(t)==="[object Date]",je=t=>typeof t=="function",Tt=t=>typeof t=="string",Qn=t=>typeof t=="symbol",dt=t=>t!==null&&typeof t=="object",$u=t=>(dt(t)||je(t))&&je(t.then)&&je(t.catch),Iu=Object.prototype.toString,ea=t=>Iu.call(t),md=t=>ea(t).slice(8,-1),Nu=t=>ea(t)==="[object Object]",el=t=>Tt(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,Rs=Xr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ka=t=>{const i=Object.create(null);return(s=>i[s]||(i[s]=t(s)))},gd=/-\w/g,Jn=Ka(t=>t.replace(gd,i=>i.slice(1).toUpperCase())),vd=/\B([A-Z])/g,to=Ka(t=>t.replace(vd,"-$1").toLowerCase()),Fu=Ka(t=>t.charAt(0).toUpperCase()+t.slice(1)),xr=Ka(t=>t?`on${Fu(t)}`:""),ui=(t,i)=>!Object.is(t,i),Ea=(t,...i)=>{for(let s=0;s{Object.defineProperty(t,i,{configurable:!0,enumerable:!1,writable:l,value:s})},Ga=t=>{const i=parseFloat(t);return isNaN(i)?t:i},_d=t=>{const i=Tt(t)?Number(t):NaN;return isNaN(i)?t:i};let Ml;const qa=()=>Ml||(Ml=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Eo(t){if(Ne(t)){const i={};for(let s=0;s{if(s){const l=s.split(yd);l.length>1&&(i[l[0].trim()]=l[1].trim())}}),i}function Pe(t){let i="";if(Tt(t))i=t;else if(Ne(t))for(let s=0;sXi(s,i))}const Bu=t=>!!(t&&t.__v_isRef===!0),x=t=>Tt(t)?t:t==null?"":Ne(t)||dt(t)&&(t.toString===Iu||!je(t.toString))?Bu(t)?x(t.value):JSON.stringify(t,Uu,2):String(t),Uu=(t,i)=>Bu(i)?Uu(t,i.value):ts(i)?{[`Map(${i.size})`]:[...i.entries()].reduce((s,[l,u],f)=>(s[wr(l,f)+" =>"]=u,s),{})}:ls(i)?{[`Set(${i.size})`]:[...i.values()].map(s=>wr(s))}:Qn(i)?wr(i):dt(i)&&!Ne(i)&&!Nu(i)?String(i):i,wr=(t,i="")=>{var s;return Qn(t)?`Symbol(${(s=t.description)!=null?s:i})`:t};/** +* @vue/reactivity v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Yt;class Pd{constructor(i=!1){this.detached=i,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!i&&Yt&&(Yt.active?(this.parent=Yt,this.index=(Yt.scopes||(Yt.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let i,s;if(this.scopes)for(i=0,s=this.scopes.length;i0&&--this._on===0){if(Yt===this)Yt=this.prevScope;else{let i=Yt;for(;i;){if(i.prevScope===this){i.prevScope=this.prevScope;break}i=i.prevScope}}this.prevScope=void 0}}stop(i){if(this._active){this._active=!1;let s,l;for(s=0,l=this.effects.length;s0)return;if(Us){let i=Us;for(Us=void 0;i;){const s=i.next;i.next=void 0,i.flags&=-9,i=s}}let t;for(;Bs;){let i=Bs;for(Bs=void 0;i;){const s=i.next;if(i.next=void 0,i.flags&=-9,i.flags&1)try{i.trigger()}catch(l){t||(t=l)}i=s}}if(t)throw t}function ju(t){for(let i=t.deps;i;i=i.nextDep)i.version=-1,i.prevActiveLink=i.dep.activeLink,i.dep.activeLink=i}function Wu(t){let i,s=t.depsTail,l=s;for(;l;){const u=l.prevDep;l.version===-1?(l===s&&(s=u),ol(l),Ld(l)):i=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=u}t.deps=i,t.depsTail=s}function Ir(t){for(let i=t.deps;i;i=i.nextDep)if(i.dep.version!==i.version||i.dep.computed&&(Ku(i.dep.computed)||i.dep.version!==i.version))return!0;return!!t._dirty}function Ku(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===Ws)||(t.globalVersion=Ws,!t.isSSR&&t.flags&128&&(!t.deps&&!t._dirty||!Ir(t))))return;t.flags|=2;const i=t.dep,s=xt,l=Xn;xt=t,Xn=!0;try{ju(t);const u=t.fn(t._value);(i.version===0||ui(u,t._value))&&(t.flags|=128,t._value=u,i.version++)}catch(u){throw i.version++,u}finally{xt=s,Xn=l,Wu(t),t.flags&=-3}}function ol(t,i=!1){const{dep:s,prevSub:l,nextSub:u}=t;if(l&&(l.nextSub=u,t.prevSub=void 0),u&&(u.prevSub=l,t.nextSub=void 0),s.subs===t&&(s.subs=l,!l&&s.computed)){s.computed.flags&=-5;for(let f=s.computed.deps;f;f=f.nextDep)ol(f,!0)}!i&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ld(t){const{prevDep:i,nextDep:s}=t;i&&(i.nextDep=s,t.prevDep=void 0),s&&(s.prevDep=i,t.nextDep=void 0)}let Xn=!0;const Gu=[];function di(){Gu.push(Xn),Xn=!1}function fi(){const t=Gu.pop();Xn=t===void 0?!0:t}function El(t){const{cleanup:i}=t;if(t.cleanup=void 0,i){const s=xt;xt=void 0;try{i()}finally{xt=s}}}let Ws=0;class Ad{constructor(i,s){this.sub=i,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class sl{constructor(i){this.computed=i,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(i){if(!xt||!Xn||xt===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==xt)s=this.activeLink=new Ad(xt,this),xt.deps?(s.prevDep=xt.depsTail,xt.depsTail.nextDep=s,xt.depsTail=s):xt.deps=xt.depsTail=s,qu(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const l=s.nextDep;l.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=l),s.prevDep=xt.depsTail,s.nextDep=void 0,xt.depsTail.nextDep=s,xt.depsTail=s,xt.deps===s&&(xt.deps=l)}return s}trigger(i){this.version++,Ws++,this.notify(i)}notify(i){nl();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{il()}}}function qu(t){if(t.dep.sc++,t.sub.flags&4){const i=t.dep.computed;if(i&&!t.dep.subs){i.flags|=20;for(let l=i.deps;l;l=l.nextDep)qu(l)}const s=t.dep.subs;s!==t&&(t.prevSub=s,s&&(s.nextSub=t)),t.dep.subs=t}}const Nr=new WeakMap,Ao=Symbol(""),Fr=Symbol(""),Ks=Symbol("");function on(t,i,s){if(Xn&&xt){let l=Nr.get(t);l||Nr.set(t,l=new Map);let u=l.get(s);u||(l.set(s,u=new sl),u.map=l,u.key=s),u.track()}}function Li(t,i,s,l,u,f){const h=Nr.get(t);if(!h){Ws++;return}const _=b=>{b&&b.trigger()};if(nl(),i==="clear")h.forEach(_);else{const b=Ne(t),C=b&&el(s);if(b&&s==="length"){const T=Number(l);h.forEach((M,H)=>{(H==="length"||H===Ks||!Qn(H)&&H>=T)&&_(M)})}else switch((s!==void 0||h.has(void 0))&&_(h.get(s)),C&&_(h.get(Ks)),i){case"add":b?C&&_(h.get("length")):(_(h.get(Ao)),ts(t)&&_(h.get(Fr)));break;case"delete":b||(_(h.get(Ao)),ts(t)&&_(h.get(Fr)));break;case"set":ts(t)&&_(h.get(Ao));break}}il()}function Xo(t){const i=ut(t);return i===t?i:(on(i,"iterate",Ks),Vn(t)?i:i.map(ei))}function Ya(t){return on(t=ut(t),"iterate",Ks),t}function ri(t,i){return Ei(t)?as(Mo(t)?ei(i):i):ei(i)}const Md={__proto__:null,[Symbol.iterator](){return Sr(this,Symbol.iterator,t=>ri(this,t))},concat(...t){return Xo(this).concat(...t.map(i=>Ne(i)?Xo(i):i))},entries(){return Sr(this,"entries",t=>(t[1]=ri(this,t[1]),t))},every(t,i){return Si(this,"every",t,i,void 0,arguments)},filter(t,i){return Si(this,"filter",t,i,s=>s.map(l=>ri(this,l)),arguments)},find(t,i){return Si(this,"find",t,i,s=>ri(this,s),arguments)},findIndex(t,i){return Si(this,"findIndex",t,i,void 0,arguments)},findLast(t,i){return Si(this,"findLast",t,i,s=>ri(this,s),arguments)},findLastIndex(t,i){return Si(this,"findLastIndex",t,i,void 0,arguments)},forEach(t,i){return Si(this,"forEach",t,i,void 0,arguments)},includes(...t){return Tr(this,"includes",t)},indexOf(...t){return Tr(this,"indexOf",t)},join(t){return Xo(this).join(t)},lastIndexOf(...t){return Tr(this,"lastIndexOf",t)},map(t,i){return Si(this,"map",t,i,void 0,arguments)},pop(){return Es(this,"pop")},push(...t){return Es(this,"push",t)},reduce(t,...i){return Ol(this,"reduce",t,i)},reduceRight(t,...i){return Ol(this,"reduceRight",t,i)},shift(){return Es(this,"shift")},some(t,i){return Si(this,"some",t,i,void 0,arguments)},splice(...t){return Es(this,"splice",t)},toReversed(){return Xo(this).toReversed()},toSorted(t){return Xo(this).toSorted(t)},toSpliced(...t){return Xo(this).toSpliced(...t)},unshift(...t){return Es(this,"unshift",t)},values(){return Sr(this,"values",t=>ri(this,t))}};function Sr(t,i,s){const l=Ya(t),u=l[i]();return l!==t&&!Vn(t)&&(u._next=u.next,u.next=()=>{const f=u._next();return f.done||(f.value=s(f.value)),f}),u}const Ed=Array.prototype;function Si(t,i,s,l,u,f){const h=Ya(t),_=h!==t&&!Vn(t),b=h[i];if(b!==Ed[i]){const M=b.apply(t,f);return _?ei(M):M}let C=s;h!==t&&(_?C=function(M,H){return s.call(this,ri(t,M),H,t)}:s.length>2&&(C=function(M,H){return s.call(this,M,H,t)}));const T=b.call(h,C,l);return _&&u?u(T):T}function Ol(t,i,s,l){const u=Ya(t),f=u!==t&&!Vn(t);let h=s,_=!1;u!==t&&(f?(_=l.length===0,h=function(C,T,M){return _&&(_=!1,C=ri(t,C)),s.call(this,C,ri(t,T),M,t)}):s.length>3&&(h=function(C,T,M){return s.call(this,C,T,M,t)}));const b=u[i](h,...l);return _?ri(t,b):b}function Tr(t,i,s){const l=ut(t);on(l,"iterate",Ks);const u=l[i](...s);return(u===-1||u===!1)&&ll(s[0])?(s[0]=ut(s[0]),l[i](...s)):u}function Es(t,i,s=[]){di(),nl();const l=ut(t)[i].apply(t,s);return il(),fi(),l}const Od=Xr("__proto__,__v_isRef,__isVue"),Yu=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(Qn));function zd(t){Qn(t)||(t=String(t));const i=ut(this);return on(i,"has",t),i.hasOwnProperty(t)}class Ju{constructor(i=!1,s=!1){this._isReadonly=i,this._isShallow=s}get(i,s,l){if(s==="__v_skip")return i.__v_skip;const u=this._isReadonly,f=this._isShallow;if(s==="__v_isReactive")return!u;if(s==="__v_isReadonly")return u;if(s==="__v_isShallow")return f;if(s==="__v_raw")return l===(u?f?Zd:tc:f?ec:Qu).get(i)||Object.getPrototypeOf(i)===Object.getPrototypeOf(l)?i:void 0;const h=Ne(i);if(!u){let b;if(h&&(b=Md[s]))return b;if(s==="hasOwnProperty")return zd}const _=Reflect.get(i,s,rn(i)?i:l);if((Qn(s)?Yu.has(s):Od(s))||(u||on(i,"get",s),f))return _;if(rn(_)){const b=h&&el(s)?_:_.value;return u&&dt(b)?Rr(b):b}return dt(_)?u?Rr(_):gt(_):_}}class Xu extends Ju{constructor(i=!1){super(!1,i)}set(i,s,l,u){let f=i[s];const h=Ne(i)&&el(s);if(!this._isShallow){const C=Ei(f);if(!Vn(l)&&!Ei(l)&&(f=ut(f),l=ut(l)),!h&&rn(f)&&!rn(l))return C||(f.value=l),!0}const _=h?Number(s)t,Ta=t=>Reflect.getPrototypeOf(t);function Dd(t,i,s){return function(...l){const u=this.__v_raw,f=ut(u),h=ts(f),_=t==="entries"||t===Symbol.iterator&&h,b=t==="keys"&&h,C=u[t](...l),T=s?Dr:i?as:ei;return!i&&on(f,"iterate",b?Fr:Ao),Kt(Object.create(C),{next(){const{value:M,done:H}=C.next();return H?{value:M,done:H}:{value:_?[T(M[0]),T(M[1])]:T(M),done:H}}})}}function Pa(t){return function(...i){return t==="delete"?!1:t==="clear"?void 0:this}}function Rd(t,i){const s={get(u){const f=this.__v_raw,h=ut(f),_=ut(u);t||(ui(u,_)&&on(h,"get",u),on(h,"get",_));const{has:b}=Ta(h),C=i?Dr:t?as:ei;if(b.call(h,u))return C(f.get(u));if(b.call(h,_))return C(f.get(_));f!==h&&f.get(u)},get size(){const u=this.__v_raw;return!t&&on(ut(u),"iterate",Ao),u.size},has(u){const f=this.__v_raw,h=ut(f),_=ut(u);return t||(ui(u,_)&&on(h,"has",u),on(h,"has",_)),u===_?f.has(u):f.has(u)||f.has(_)},forEach(u,f){const h=this,_=h.__v_raw,b=ut(_),C=i?Dr:t?as:ei;return!t&&on(b,"iterate",Ao),_.forEach((T,M)=>u.call(f,C(T),C(M),h))}};return Kt(s,t?{add:Pa("add"),set:Pa("set"),delete:Pa("delete"),clear:Pa("clear")}:{add(u){const f=ut(this),h=Ta(f),_=ut(u),b=!i&&!Vn(u)&&!Ei(u)?_:u;return h.has.call(f,b)||ui(u,b)&&h.has.call(f,u)||ui(_,b)&&h.has.call(f,_)||(f.add(b),Li(f,"add",b,b)),this},set(u,f){!i&&!Vn(f)&&!Ei(f)&&(f=ut(f));const h=ut(this),{has:_,get:b}=Ta(h);let C=_.call(h,u);C||(u=ut(u),C=_.call(h,u));const T=b.call(h,u);return h.set(u,f),C?ui(f,T)&&Li(h,"set",u,f):Li(h,"add",u,f),this},delete(u){const f=ut(this),{has:h,get:_}=Ta(f);let b=h.call(f,u);b||(u=ut(u),b=h.call(f,u)),_&&_.call(f,u);const C=f.delete(u);return b&&Li(f,"delete",u,void 0),C},clear(){const u=ut(this),f=u.size!==0,h=u.clear();return f&&Li(u,"clear",void 0,void 0),h}}),["keys","values","entries",Symbol.iterator].forEach(u=>{s[u]=Dd(u,t,i)}),s}function al(t,i){const s=Rd(t,i);return(l,u,f)=>u==="__v_isReactive"?!t:u==="__v_isReadonly"?t:u==="__v_raw"?l:Reflect.get(ct(s,u)&&u in l?s:l,u,f)}const Bd={get:al(!1,!1)},Ud={get:al(!1,!0)},Vd={get:al(!0,!1)};const Qu=new WeakMap,ec=new WeakMap,tc=new WeakMap,Zd=new WeakMap;function Hd(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function gt(t){return Ei(t)?t:rl(t,!1,Id,Bd,Qu)}function jd(t){return rl(t,!1,Fd,Ud,ec)}function Rr(t){return rl(t,!0,Nd,Vd,tc)}function rl(t,i,s,l,u){if(!dt(t)||t.__v_raw&&!(i&&t.__v_isReactive)||t.__v_skip||!Object.isExtensible(t))return t;const f=u.get(t);if(f)return f;const h=Hd(md(t));if(h===0)return t;const _=new Proxy(t,h===2?l:s);return u.set(t,_),_}function Mo(t){return Ei(t)?Mo(t.__v_raw):!!(t&&t.__v_isReactive)}function Ei(t){return!!(t&&t.__v_isReadonly)}function Vn(t){return!!(t&&t.__v_isShallow)}function ll(t){return t?!!t.__v_raw:!1}function ut(t){const i=t&&t.__v_raw;return i?ut(i):t}function Wd(t){return!ct(t,"__v_skip")&&Object.isExtensible(t)&&Du(t,"__v_skip",!0),t}const ei=t=>dt(t)?gt(t):t,as=t=>dt(t)?Rr(t):t;function rn(t){return t?t.__v_isRef===!0:!1}function Y(t){return Kd(t,!1)}function Kd(t,i){return rn(t)?t:new Gd(t,i)}class Gd{constructor(i,s){this.dep=new sl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?i:ut(i),this._value=s?i:ei(i),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(i){const s=this._rawValue,l=this.__v_isShallow||Vn(i)||Ei(i);i=l?i:ut(i),ui(i,s)&&(this._rawValue=i,this._value=l?i:ei(i),this.dep.trigger())}}function $e(t){return rn(t)?t.value:t}const qd={get:(t,i,s)=>i==="__v_raw"?t:$e(Reflect.get(t,i,s)),set:(t,i,s,l)=>{const u=t[i];return rn(u)&&!rn(s)?(u.value=s,!0):Reflect.set(t,i,s,l)}};function nc(t){return Mo(t)?t:new Proxy(t,qd)}class Yd{constructor(i,s,l){this.fn=i,this.setter=s,this._value=void 0,this.dep=new sl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ws-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=l}notify(){if(this.flags|=16,!(this.flags&8)&&xt!==this)return Hu(this,!0),!0}get value(){const i=this.dep.track();return Ku(this),i&&(i.version=this.dep.version),this._value}set value(i){this.setter&&this.setter(i)}}function Jd(t,i,s=!1){let l,u;return je(t)?l=t:(l=t.get,u=t.set),new Yd(l,u,s)}const Ca={},za=new WeakMap;let Po;function Xd(t,i=!1,s=Po){if(s){let l=za.get(s);l||za.set(s,l=[]),l.push(t)}}function Qd(t,i,s=vt){const{immediate:l,deep:u,once:f,scheduler:h,augmentJob:_,call:b}=s,C=ue=>u?ue:Vn(ue)||u===!1||u===0?Ai(ue,1):Ai(ue);let T,M,H,j,G=!1,N=!1;if(rn(t)?(M=()=>t.value,G=Vn(t)):Mo(t)?(M=()=>C(t),G=!0):Ne(t)?(N=!0,G=t.some(ue=>Mo(ue)||Vn(ue)),M=()=>t.map(ue=>{if(rn(ue))return ue.value;if(Mo(ue))return C(ue);if(je(ue))return b?b(ue,2):ue()})):je(t)?i?M=b?()=>b(t,2):t:M=()=>{if(H){di();try{H()}finally{fi()}}const ue=Po;Po=T;try{return b?b(t,3,[j]):t(j)}finally{Po=ue}}:M=ci,i&&u){const ue=M,ke=u===!0?1/0:u;M=()=>Ai(ue(),ke)}const U=Cd(),R=()=>{T.stop(),U&&U.active&&Qr(U.effects,T)};if(f&&i){const ue=i;i=(...ke)=>{const Ce=ue(...ke);return R(),Ce}}let oe=N?new Array(t.length).fill(Ca):Ca;const we=ue=>{if(!(!(T.flags&1)||!T.dirty&&!ue))if(i){const ke=T.run();if(ue||u||G||(N?ke.some((Ce,Le)=>ui(Ce,oe[Le])):ui(ke,oe))){H&&H();const Ce=Po;Po=T;try{const Le=[ke,oe===Ca?void 0:N&&oe[0]===Ca?[]:oe,j];oe=ke,b?b(i,3,Le):i(...Le)}finally{Po=Ce}}}else T.run()};return _&&_(we),T=new Vu(M),T.scheduler=h?()=>h(we,!1):we,j=ue=>Xd(ue,!1,T),H=T.onStop=()=>{const ue=za.get(T);if(ue){if(b)b(ue,4);else for(const ke of ue)ke();za.delete(T)}},i?l?we(!0):oe=T.run():h?h(we.bind(null,!0),!0):T.run(),R.pause=T.pause.bind(T),R.resume=T.resume.bind(T),R.stop=R,R}function Ai(t,i=1/0,s){if(i<=0||!dt(t)||t.__v_skip||(s=s||new Map,(s.get(t)||0)>=i))return t;if(s.set(t,i),i--,rn(t))Ai(t.value,i,s);else if(Ne(t))for(let l=0;l{Ai(l,i,s)});else if(Nu(t)){for(const l in t)Ai(t[l],i,s);for(const l of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,l)&&Ai(t[l],i,s)}return t}/** +* @vue/runtime-core v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ta(t,i,s,l){try{return l?t(...l):t()}catch(u){Ja(u,i,s)}}function Hn(t,i,s,l){if(je(t)){const u=ta(t,i,s,l);return u&&$u(u)&&u.catch(f=>{Ja(f,i,s)}),u}if(Ne(t)){const u=[];for(let f=0;f>>1,u=fn[l],f=Gs(u);f=Gs(s)?fn.push(t):fn.splice(tf(i),0,t),t.flags|=1,sc()}}function sc(){$a||($a=ic.then(rc))}function nf(t){Ne(t)?ns.push(...t):Ji&&t.id===-1?Ji.splice(Qo+1,0,t):t.flags&1||(ns.push(t),t.flags|=1),sc()}function zl(t,i,s=ai+1){for(;sGs(s)-Gs(l));if(ns.length=0,Ji){Ji.push(...i);return}for(Ji=i,Qo=0;Qot.id==null?t.flags&2?-1:1/0:t.id;function rc(t){try{for(ai=0;ai{l._d&&Da(-1);const f=Ia(i);let h;try{h=t(...u)}finally{Ia(f),l._d&&Da(1)}return h};return l._n=!0,l._c=!0,l._d=!0,l}function ie(t,i){if(an===null)return t;const s=nr(an),l=t.dirs||(t.dirs=[]);for(let u=0;u1)return s&&je(i)?i.call(l&&l.proxy):i}}const of=Symbol.for("v-scx"),sf=()=>Vs(of);function Bt(t,i,s){return cc(t,i,s)}function cc(t,i,s=vt){const{immediate:l,deep:u,flush:f,once:h}=s,_=Kt({},s),b=i&&l||!i&&f!=="post";let C;if(Xs){if(f==="sync"){const j=sf();C=j.__watcherHandles||(j.__watcherHandles=[])}else if(!b){const j=()=>{};return j.stop=ci,j.resume=ci,j.pause=ci,j}}const T=hn;_.call=(j,G,N)=>Hn(j,T,G,N);let M=!1;f==="post"?_.scheduler=j=>{dn(j,T&&T.suspense)}:f!=="sync"&&(M=!0,_.scheduler=(j,G)=>{G?j():ul(j)}),_.augmentJob=j=>{i&&(j.flags|=4),M&&(j.flags|=2,T&&(j.id=T.uid,j.i=T))};const H=Qd(t,i,_);return Xs&&(C?C.push(H):b&&H()),H}function af(t,i,s){const l=this.proxy,u=Tt(t)?t.includes(".")?dc(l,t):()=>l[t]:t.bind(l,l);let f;je(i)?f=i:(f=i.handler,s=i);const h=na(this),_=cc(u,f.bind(l),s);return h(),_}function dc(t,i){const s=i.split(".");return()=>{let l=t;for(let u=0;ut.__isTeleport,Co=t=>t&&(t.disabled||t.disabled===""),rf=t=>t&&(t.defer||t.defer===""),$l=t=>typeof SVGElement<"u"&&t instanceof SVGElement,Il=t=>typeof MathMLElement=="function"&&t instanceof MathMLElement,Br=(t,i)=>{const s=t&&t.to;return Tt(s)?i?i(s):null:s},lf={name:"Teleport",__isTeleport:!0,process(t,i,s,l,u,f,h,_,b,C){const{mc:T,pc:M,pbc:H,o:{insert:j,querySelector:G,createText:N,createComment:U,parentNode:R}}=C,oe=Co(i.props);let{dynamicChildren:we}=i;const ue=(Le,Ze,he)=>{Le.shapeFlag&16&&T(Le.children,Ze,he,u,f,h,_,b)},ke=(Le=i)=>{const Ze=Co(Le.props),he=Le.target=Br(Le.props,G),ee=Ur(he,Le,N,j);he&&(h!=="svg"&&$l(he)?h="svg":h!=="mathml"&&Il(he)&&(h="mathml"),u&&u.isCE&&(u.ce._teleportTargets||(u.ce._teleportTargets=new Set)).add(he),Ze||(ue(Le,he,ee),Is(Le,!1)))},Ce=Le=>{const Ze=()=>{if(Yi.get(Le)===Ze){if(Yi.delete(Le),Co(Le.props)){const he=R(Le.el)||s;ue(Le,he,Le.anchor),Is(Le,!0)}ke(Le)}};Yi.set(Le,Ze),dn(Ze,f)};if(t==null){const Le=i.el=N(""),Ze=i.anchor=N("");if(j(Le,s,l),j(Ze,s,l),rf(i.props)||f&&f.pendingBranch){Ce(i);return}oe&&(ue(i,s,Ze),Is(i,!0)),ke()}else{i.el=t.el;const Le=i.anchor=t.anchor,Ze=Yi.get(t);if(Ze){Ze.flags|=8,Yi.delete(t),Ce(i);return}i.targetStart=t.targetStart;const he=i.target=t.target,ee=i.targetAnchor=t.targetAnchor,V=Co(t.props),O=V?s:he,F=V?Le:ee;if(h==="svg"||$l(he)?h="svg":(h==="mathml"||Il(he))&&(h="mathml"),we?(H(t.dynamicChildren,we,O,u,f,h,_),fl(t,i,!0)):b||M(t,i,O,F,u,f,h,_,!1),oe)V?i.props&&t.props&&i.props.to!==t.props.to&&(i.props.to=t.props.to):La(i,s,Le,C,1);else if((i.props&&i.props.to)!==(t.props&&t.props.to)){const $=Br(i.props,G);$&&(i.target=$,La(i,$,null,C,0))}else V&&La(i,he,ee,C,1);Is(i,oe)}},remove(t,i,s,{um:l,o:{remove:u}},f){const{shapeFlag:h,children:_,anchor:b,targetStart:C,targetAnchor:T,target:M,props:H}=t,j=Co(H),G=f||!j,N=Yi.get(t);if(N&&(N.flags|=8,Yi.delete(t)),M&&(u(C),u(T)),f&&u(b),!N&&(j||M)&&h&16)for(let U=0;U<_.length;U++){const R=_[U];l(R,i,s,G,!!R.dynamicChildren)}},move:La,hydrate:uf};function La(t,i,s,{o:{insert:l},m:u},f=2){f===0&&l(t.targetAnchor,i,s);const{el:h,anchor:_,shapeFlag:b,children:C,props:T}=t,M=f===2;if(M&&l(h,i,s),!Yi.has(t)&&(!M||Co(T))&&b&16)for(let H=0;H{t.isMounted=!0}),us(()=>{t.isUnmounting=!0}),t}const Bn=[Function,Array],pc={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Bn,onEnter:Bn,onAfterEnter:Bn,onEnterCancelled:Bn,onBeforeLeave:Bn,onLeave:Bn,onAfterLeave:Bn,onLeaveCancelled:Bn,onBeforeAppear:Bn,onAppear:Bn,onAfterAppear:Bn,onAppearCancelled:Bn},mc=t=>{const i=t.subTree;return i.component?mc(i.component):i},ff={name:"BaseTransition",props:pc,setup(t,{slots:i}){const s=Uc(),l=df();return()=>{const u=i.default&&_c(i.default(),!0),f=u&&u.length?gc(u):s.subTree?I():void 0;if(!f)return;const h=ut(t),{mode:_}=h;if(l.isLeaving)return Pr(f);const b=Nl(f);if(!b)return Pr(f);let C=Vr(b,h,l,s,M=>C=M);b.type!==sn&&qs(b,C);let T=s.subTree&&Nl(s.subTree);if(T&&T.type!==sn&&!Lo(T,b)&&mc(s).type!==sn){let M=Vr(T,h,l,s);if(qs(T,M),_==="out-in"&&b.type!==sn)return l.isLeaving=!0,M.afterLeave=()=>{l.isLeaving=!1,s.job.flags&8||s.update(),delete M.afterLeave,T=void 0},Pr(f);_==="in-out"&&b.type!==sn?M.delayLeave=(H,j,G)=>{const N=vc(l,T);N[String(T.key)]=T,H[Un]=()=>{j(),H[Un]=void 0,delete C.delayedLeave,T=void 0},C.delayedLeave=()=>{G(),delete C.delayedLeave,T=void 0}}:T=void 0}else T&&(T=void 0);return f}}};function gc(t){let i=t[0];if(t.length>1){for(const s of t)if(s.type!==sn){i=s;break}}return i}const hf=ff;function vc(t,i){const{leavingVNodes:s}=t;let l=s.get(i.type);return l||(l=Object.create(null),s.set(i.type,l)),l}function Vr(t,i,s,l,u){const{appear:f,mode:h,persisted:_=!1,onBeforeEnter:b,onEnter:C,onAfterEnter:T,onEnterCancelled:M,onBeforeLeave:H,onLeave:j,onAfterLeave:G,onLeaveCancelled:N,onBeforeAppear:U,onAppear:R,onAfterAppear:oe,onAppearCancelled:we}=i,ue=String(t.key),ke=vc(s,t),Ce=(he,ee)=>{he&&Hn(he,l,9,ee)},Le=(he,ee)=>{const V=ee[1];Ce(he,ee),Ne(he)?he.every(O=>O.length<=1)&&V():he.length<=1&&V()},Ze={mode:h,persisted:_,beforeEnter(he){let ee=b;if(!s.isMounted)if(f)ee=U||b;else return;he[Un]&&he[Un](!0);const V=ke[ue];V&&Lo(t,V)&&V.el[Un]&&V.el[Un](),Ce(ee,[he])},enter(he){if(ke[ue]===t)return;let ee=C,V=T,O=M;if(!s.isMounted)if(f)ee=R||C,V=oe||T,O=we||M;else return;let F=!1;he[Os]=Ye=>{F||(F=!0,Ye?Ce(O,[he]):Ce(V,[he]),Ze.delayedLeave&&Ze.delayedLeave(),he[Os]=void 0)};const $=he[Os].bind(null,!1);ee?Le(ee,[he,$]):$()},leave(he,ee){const V=String(t.key);if(he[Os]&&he[Os](!0),s.isUnmounting)return ee();Ce(H,[he]);let O=!1;he[Un]=$=>{O||(O=!0,ee(),$?Ce(N,[he]):Ce(G,[he]),he[Un]=void 0,ke[V]===t&&delete ke[V])};const F=he[Un].bind(null,!1);ke[V]=t,j?Le(j,[he,F]):F()},clone(he){const ee=Vr(he,i,s,l,u);return u&&u(ee),ee}};return Ze}function Pr(t){if(Xa(t))return t=Qi(t),t.children=null,t}function Nl(t){if(!Xa(t))return hc(t.type)&&t.children?gc(t.children):t;if(t.component)return t.component.subTree;const{shapeFlag:i,children:s}=t;if(s){if(i&16)return s[0];if(i&32&&je(s.default))return s.default()}}function qs(t,i){t.shapeFlag&6&&t.component?(t.transition=i,qs(t.component.subTree,i)):t.shapeFlag&128?(t.ssContent.transition=i.clone(t.ssContent),t.ssFallback.transition=i.clone(t.ssFallback)):t.transition=i}function _c(t,i=!1,s){let l=[],u=0;for(let f=0;f1)for(let f=0;fZs(N,i&&(Ne(i)?i[U]:i),s,l,u));return}if(is(l)&&!u){l.shapeFlag&512&&l.type.__asyncResolved&&l.component.subTree.component&&Zs(t,i,s,l.component.subTree);return}const f=l.shapeFlag&4?nr(l.component):l.el,h=u?null:f,{i:_,r:b}=t,C=i&&i.r,T=_.refs===vt?_.refs={}:_.refs,M=_.setupState,H=ut(M),j=M===vt?zu:N=>Fl(T,N)?!1:ct(H,N),G=(N,U)=>!(U&&Fl(T,U));if(C!=null&&C!==b){if(Dl(i),Tt(C))T[C]=null,j(C)&&(M[C]=null);else if(rn(C)){const N=i;G(C,N.k)&&(C.value=null),N.k&&(T[N.k]=null)}}if(je(b)){di();try{ta(b,_,12,[h,T])}finally{fi()}}else{const N=Tt(b),U=rn(b);if(N||U){const R=()=>{if(t.f){const oe=N?j(b)?M[b]:T[b]:G()||!t.k?b.value:T[t.k];if(u)Ne(oe)&&Qr(oe,f);else if(Ne(oe))oe.includes(f)||oe.push(f);else if(N)T[b]=[f],j(b)&&(M[b]=T[b]);else{const we=[f];G(b,t.k)&&(b.value=we),t.k&&(T[t.k]=we)}}else N?(T[b]=h,j(b)&&(M[b]=h)):U&&(G(b,t.k)&&(b.value=h),t.k&&(T[t.k]=h))};if(h){const oe=()=>{R(),Na.delete(t)};oe.id=-1,Na.set(t,oe),dn(oe,s)}else Dl(t),R()}}}function Dl(t){const i=Na.get(t);i&&(i.flags|=8,Na.delete(t))}qa().requestIdleCallback;qa().cancelIdleCallback;const is=t=>!!t.type.__asyncLoader,Xa=t=>t.type.__isKeepAlive;function pf(t,i){yc(t,"a",i)}function mf(t,i){yc(t,"da",i)}function yc(t,i,s=hn){const l=t.__wdc||(t.__wdc=()=>{let u=s;for(;u;){if(u.isDeactivated)return;u=u.parent}return t()});if(Qa(i,l,s),s){let u=s.parent;for(;u&&u.parent;)Xa(u.parent.vnode)&&gf(l,i,s,u),u=u.parent}}function gf(t,i,s,l){const u=Qa(i,t,l,!0);xc(()=>{Qr(l[i],u)},s)}function Qa(t,i,s=hn,l=!1){if(s){const u=s[t]||(s[t]=[]),f=i.__weh||(i.__weh=(...h)=>{di();const _=na(s),b=Hn(i,s,t,h);return _(),fi(),b});return l?u.unshift(f):u.push(f),f}}const Oi=t=>(i,s=hn)=>{(!Xs||t==="sp")&&Qa(t,(...l)=>i(...l),s)},vf=Oi("bm"),ti=Oi("m"),_f=Oi("bu"),bf=Oi("u"),us=Oi("bum"),xc=Oi("um"),yf=Oi("sp"),xf=Oi("rtg"),wf=Oi("rtc");function kf(t,i=hn){Qa("ec",t,i)}const Sf=Symbol.for("v-ndc");function ze(t,i,s,l){let u;const f=s,h=Ne(t);if(h||Tt(t)){const _=h&&Mo(t);let b=!1,C=!1;_&&(b=!Vn(t),C=Ei(t),t=Ya(t)),u=new Array(t.length);for(let T=0,M=t.length;Ti(_,b,void 0,f));else{const _=Object.keys(t);u=new Array(_.length);for(let b=0,C=_.length;b0;return p(),nt(ae,null,[A("slot",s,l)],C?-2:64)}let f=t[i];f&&f._c&&(f._d=!1),p();const h=f&&wc(f(s)),_=s.key||h&&h.key,b=nt(ae,{key:(_&&!Qn(_)?_:`_${i}`)+(!h&&l?"_fb":"")},h||[],h&&t._===1?64:-2);return b.scopeId&&(b.slotScopeIds=[b.scopeId+"-s"]),f&&f._c&&(f._d=!0),b}function wc(t){return t.some(i=>Js(i)?!(i.type===sn||i.type===ae&&!wc(i.children)):!0)?t:null}const Zr=t=>t?Vc(t)?nr(t):Zr(t.parent):null,Hs=Kt(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Zr(t.parent),$root:t=>Zr(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>Sc(t),$forceUpdate:t=>t.f||(t.f=()=>{ul(t.update)}),$nextTick:t=>t.n||(t.n=oc.bind(t.proxy)),$watch:t=>af.bind(t)}),Cr=(t,i)=>t!==vt&&!t.__isScriptSetup&&ct(t,i),Pf={get({_:t},i){if(i==="__v_skip")return!0;const{ctx:s,setupState:l,data:u,props:f,accessCache:h,type:_,appContext:b}=t;if(i[0]!=="$"){const H=h[i];if(H!==void 0)switch(H){case 1:return l[i];case 2:return u[i];case 4:return s[i];case 3:return f[i]}else{if(Cr(l,i))return h[i]=1,l[i];if(u!==vt&&ct(u,i))return h[i]=2,u[i];if(ct(f,i))return h[i]=3,f[i];if(s!==vt&&ct(s,i))return h[i]=4,s[i];Hr&&(h[i]=0)}}const C=Hs[i];let T,M;if(C)return i==="$attrs"&&on(t.attrs,"get",""),C(t);if((T=_.__cssModules)&&(T=T[i]))return T;if(s!==vt&&ct(s,i))return h[i]=4,s[i];if(M=b.config.globalProperties,ct(M,i))return M[i]},set({_:t},i,s){const{data:l,setupState:u,ctx:f}=t;return Cr(u,i)?(u[i]=s,!0):l!==vt&&ct(l,i)?(l[i]=s,!0):ct(t.props,i)||i[0]==="$"&&i.slice(1)in t?!1:(f[i]=s,!0)},has({_:{data:t,setupState:i,accessCache:s,ctx:l,appContext:u,props:f,type:h}},_){let b;return!!(s[_]||t!==vt&&_[0]!=="$"&&ct(t,_)||Cr(i,_)||ct(f,_)||ct(l,_)||ct(Hs,_)||ct(u.config.globalProperties,_)||(b=h.__cssModules)&&b[_])},defineProperty(t,i,s){return s.get!=null?t._.accessCache[i]=0:ct(s,"value")&&this.set(t,i,s.value,null),Reflect.defineProperty(t,i,s)}};function Rl(t){return Ne(t)?t.reduce((i,s)=>(i[s]=null,i),{}):t}let Hr=!0;function Cf(t){const i=Sc(t),s=t.proxy,l=t.ctx;Hr=!1,i.beforeCreate&&Bl(i.beforeCreate,t,"bc");const{data:u,computed:f,methods:h,watch:_,provide:b,inject:C,created:T,beforeMount:M,mounted:H,beforeUpdate:j,updated:G,activated:N,deactivated:U,beforeDestroy:R,beforeUnmount:oe,destroyed:we,unmounted:ue,render:ke,renderTracked:Ce,renderTriggered:Le,errorCaptured:Ze,serverPrefetch:he,expose:ee,inheritAttrs:V,components:O,directives:F,filters:$}=i;if(C&&Lf(C,l,null),h)for(const ge in h){const fe=h[ge];je(fe)&&(l[ge]=fe.bind(s))}if(u){const ge=u.call(s,s);dt(ge)&&(t.data=gt(ge))}if(Hr=!0,f)for(const ge in f){const fe=f[ge],ft=je(fe)?fe.bind(s,s):je(fe.get)?fe.get.bind(s,s):ci,pe=!je(fe)&&je(fe.set)?fe.set.bind(s):ci,Ue=de({get:ft,set:pe});Object.defineProperty(l,ge,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Ve=>Ue.value=Ve})}if(_)for(const ge in _)kc(_[ge],l,s,ge);if(b){const ge=je(b)?b.call(s):b;Reflect.ownKeys(ge).forEach(fe=>{uc(fe,ge[fe])})}T&&Bl(T,t,"c");function Se(ge,fe){Ne(fe)?fe.forEach(ft=>ge(ft.bind(s))):fe&&ge(fe.bind(s))}if(Se(vf,M),Se(ti,H),Se(_f,j),Se(bf,G),Se(pf,N),Se(mf,U),Se(kf,Ze),Se(wf,Ce),Se(xf,Le),Se(us,oe),Se(xc,ue),Se(yf,he),Ne(ee))if(ee.length){const ge=t.exposed||(t.exposed={});ee.forEach(fe=>{Object.defineProperty(ge,fe,{get:()=>s[fe],set:ft=>s[fe]=ft,enumerable:!0})})}else t.exposed||(t.exposed={});ke&&t.render===ci&&(t.render=ke),V!=null&&(t.inheritAttrs=V),O&&(t.components=O),F&&(t.directives=F),he&&bc(t)}function Lf(t,i,s=ci){Ne(t)&&(t=jr(t));for(const l in t){const u=t[l];let f;dt(u)?"default"in u?f=Vs(u.from||l,u.default,!0):f=Vs(u.from||l):f=Vs(u),rn(f)?Object.defineProperty(i,l,{enumerable:!0,configurable:!0,get:()=>f.value,set:h=>f.value=h}):i[l]=f}}function Bl(t,i,s){Hn(Ne(t)?t.map(l=>l.bind(i.proxy)):t.bind(i.proxy),i,s)}function kc(t,i,s,l){let u=l.includes(".")?dc(s,l):()=>s[l];if(Tt(t)){const f=i[t];je(f)&&Bt(u,f)}else if(je(t))Bt(u,t.bind(s));else if(dt(t))if(Ne(t))t.forEach(f=>kc(f,i,s,l));else{const f=je(t.handler)?t.handler.bind(s):i[t.handler];je(f)&&Bt(u,f,t)}}function Sc(t){const i=t.type,{mixins:s,extends:l}=i,{mixins:u,optionsCache:f,config:{optionMergeStrategies:h}}=t.appContext,_=f.get(i);let b;return _?b=_:!u.length&&!s&&!l?b=i:(b={},u.length&&u.forEach(C=>Fa(b,C,h,!0)),Fa(b,i,h)),dt(i)&&f.set(i,b),b}function Fa(t,i,s,l=!1){const{mixins:u,extends:f}=i;f&&Fa(t,f,s,!0),u&&u.forEach(h=>Fa(t,h,s,!0));for(const h in i)if(!(l&&h==="expose")){const _=Af[h]||s&&s[h];t[h]=_?_(t[h],i[h]):i[h]}return t}const Af={data:Ul,props:Vl,emits:Vl,methods:Ns,computed:Ns,beforeCreate:cn,created:cn,beforeMount:cn,mounted:cn,beforeUpdate:cn,updated:cn,beforeDestroy:cn,beforeUnmount:cn,destroyed:cn,unmounted:cn,activated:cn,deactivated:cn,errorCaptured:cn,serverPrefetch:cn,components:Ns,directives:Ns,watch:Ef,provide:Ul,inject:Mf};function Ul(t,i){return i?t?function(){return Kt(je(t)?t.call(this,this):t,je(i)?i.call(this,this):i)}:i:t}function Mf(t,i){return Ns(jr(t),jr(i))}function jr(t){if(Ne(t)){const i={};for(let s=0;si==="modelValue"||i==="model-value"?t.modelModifiers:t[`${i}Modifiers`]||t[`${Jn(i)}Modifiers`]||t[`${to(i)}Modifiers`];function If(t,i,...s){if(t.isUnmounted)return;const l=t.vnode.props||vt;let u=s;const f=i.startsWith("update:"),h=f&&$f(l,i.slice(7));h&&(h.trim&&(u=s.map(T=>Tt(T)?T.trim():T)),h.number&&(u=s.map(Ga)));let _,b=l[_=xr(i)]||l[_=xr(Jn(i))];!b&&f&&(b=l[_=xr(to(i))]),b&&Hn(b,t,6,u);const C=l[_+"Once"];if(C){if(!t.emitted)t.emitted={};else if(t.emitted[_])return;t.emitted[_]=!0,Hn(C,t,6,u)}}const Nf=new WeakMap;function Pc(t,i,s=!1){const l=s?Nf:i.emitsCache,u=l.get(t);if(u!==void 0)return u;const f=t.emits;let h={},_=!1;if(!je(t)){const b=C=>{const T=Pc(C,i,!0);T&&(_=!0,Kt(h,T))};!s&&i.mixins.length&&i.mixins.forEach(b),t.extends&&b(t.extends),t.mixins&&t.mixins.forEach(b)}return!f&&!_?(dt(t)&&l.set(t,null),null):(Ne(f)?f.forEach(b=>h[b]=null):Kt(h,f),dt(t)&&l.set(t,h),h)}function er(t,i){return!t||!ja(i)?!1:(i=i.slice(2),i=i==="Once"?i:i.replace(/Once$/,""),ct(t,i[0].toLowerCase()+i.slice(1))||ct(t,to(i))||ct(t,i))}function Zl(t){const{type:i,vnode:s,proxy:l,withProxy:u,propsOptions:[f],slots:h,attrs:_,emit:b,render:C,renderCache:T,props:M,data:H,setupState:j,ctx:G,inheritAttrs:N}=t,U=Ia(t);let R,oe;try{if(s.shapeFlag&4){const ue=u||l,ke=ue;R=li(C.call(ke,ue,T,M,j,H,G)),oe=_}else{const ue=i;R=li(ue.length>1?ue(M,{attrs:_,slots:h,emit:b}):ue(M,null)),oe=i.props?_:Ff(_)}}catch(ue){js.length=0,Ja(ue,t,1),R=A(sn)}let we=R;if(oe&&N!==!1){const ue=Object.keys(oe),{shapeFlag:ke}=we;ue.length&&ke&7&&(f&&ue.some(Wa)&&(oe=Df(oe,f)),we=Qi(we,oe,!1,!0))}return s.dirs&&(we=Qi(we,null,!1,!0),we.dirs=we.dirs?we.dirs.concat(s.dirs):s.dirs),s.transition&&qs(we,s.transition),R=we,Ia(U),R}const Ff=t=>{let i;for(const s in t)(s==="class"||s==="style"||ja(s))&&((i||(i={}))[s]=t[s]);return i},Df=(t,i)=>{const s={};for(const l in t)(!Wa(l)||!(l.slice(9)in i))&&(s[l]=t[l]);return s};function Rf(t,i,s){const{props:l,children:u,component:f}=t,{props:h,children:_,patchFlag:b}=i,C=f.emitsOptions;if(i.dirs||i.transition)return!0;if(s&&b>=0){if(b&1024)return!0;if(b&16)return l?Hl(l,h,C):!!h;if(b&8){const T=i.dynamicProps;for(let M=0;MObject.create(Lc),Mc=t=>Object.getPrototypeOf(t)===Lc;function Uf(t,i,s,l=!1){const u={},f=Ac();t.propsDefaults=Object.create(null),Ec(t,i,u,f);for(const h in t.propsOptions[0])h in u||(u[h]=void 0);s?t.props=l?u:jd(u):t.type.props?t.props=u:t.props=f,t.attrs=f}function Vf(t,i,s,l){const{props:u,attrs:f,vnode:{patchFlag:h}}=t,_=ut(u),[b]=t.propsOptions;let C=!1;if((l||h>0)&&!(h&16)){if(h&8){const T=t.vnode.dynamicProps;for(let M=0;M{b=!0;const[H,j]=Oc(M,i,!0);Kt(h,H),j&&_.push(...j)};!s&&i.mixins.length&&i.mixins.forEach(T),t.extends&&T(t.extends),t.mixins&&t.mixins.forEach(T)}if(!f&&!b)return dt(t)&&l.set(t,es),es;if(Ne(f))for(let T=0;Tt==="_"||t==="_ctx"||t==="$stable",dl=t=>Ne(t)?t.map(li):[li(t)],Hf=(t,i,s)=>{if(i._n)return i;const l=ye((...u)=>dl(i(...u)),s);return l._c=!1,l},zc=(t,i,s)=>{const l=t._ctx;for(const u in t){if(cl(u))continue;const f=t[u];if(je(f))i[u]=Hf(u,f,l);else if(f!=null){const h=dl(f);i[u]=()=>h}}},$c=(t,i)=>{const s=dl(i);t.slots.default=()=>s},Ic=(t,i,s)=>{for(const l in i)(s||!cl(l))&&(t[l]=i[l])},jf=(t,i,s)=>{const l=t.slots=Ac();if(t.vnode.shapeFlag&32){const u=i._;u?(Ic(l,i,s),s&&Du(l,"_",u,!0)):zc(i,l)}else i&&$c(t,i)},Wf=(t,i,s)=>{const{vnode:l,slots:u}=t;let f=!0,h=vt;if(l.shapeFlag&32){const _=i._;_?s&&_===1?f=!1:Ic(u,i,s):(f=!i.$stable,zc(i,u)),h=i}else i&&($c(t,i),h={default:1});if(f)for(const _ in u)!cl(_)&&h[_]==null&&delete u[_]},dn=Jf;function Kf(t){return Gf(t)}function Gf(t,i){const s=qa();s.__VUE__=!0;const{insert:l,remove:u,patchProp:f,createElement:h,createText:_,createComment:b,setText:C,setElementText:T,parentNode:M,nextSibling:H,setScopeId:j=ci,insertStaticContent:G}=t,N=(w,y,S,q=null,W=null,J=null,ce=void 0,le=null,se=!!y.dynamicChildren)=>{if(w===y)return;w&&!Lo(w,y)&&(q=zt(w),Ve(w,W,J,!0),w=null),y.patchFlag===-2&&(se=!1,y.dynamicChildren=null);const{type:te,ref:ve,shapeFlag:re}=y;switch(te){case tr:U(w,y,S,q);break;case sn:R(w,y,S,q);break;case Ar:w==null&&oe(y,S,q,ce);break;case ae:O(w,y,S,q,W,J,ce,le,se);break;default:re&1?ke(w,y,S,q,W,J,ce,le,se):re&6?F(w,y,S,q,W,J,ce,le,se):(re&64||re&128)&&te.process(w,y,S,q,W,J,ce,le,se,Pt)}ve!=null&&W?Zs(ve,w&&w.ref,J,y||w,!y):ve==null&&w&&w.ref!=null&&Zs(w.ref,null,J,w,!0)},U=(w,y,S,q)=>{if(w==null)l(y.el=_(y.children),S,q);else{const W=y.el=w.el;y.children!==w.children&&C(W,y.children)}},R=(w,y,S,q)=>{w==null?l(y.el=b(y.children||""),S,q):y.el=w.el},oe=(w,y,S,q)=>{[w.el,w.anchor]=G(w.children,y,S,q,w.el,w.anchor)},we=({el:w,anchor:y},S,q)=>{let W;for(;w&&w!==y;)W=H(w),l(w,S,q),w=W;l(y,S,q)},ue=({el:w,anchor:y})=>{let S;for(;w&&w!==y;)S=H(w),u(w),w=S;u(y)},ke=(w,y,S,q,W,J,ce,le,se)=>{if(y.type==="svg"?ce="svg":y.type==="math"&&(ce="mathml"),w==null)Ce(y,S,q,W,J,ce,le,se);else{const te=w.el&&w.el._isVueCE?w.el:null;try{te&&te._beginPatch(),he(w,y,W,J,ce,le,se)}finally{te&&te._endPatch()}}},Ce=(w,y,S,q,W,J,ce,le)=>{let se,te;const{props:ve,shapeFlag:re,transition:Te,dirs:Ae}=w;if(se=w.el=h(w.type,J,ve&&ve.is,ve),re&8?T(se,w.children):re&16&&Ze(w.children,se,null,q,W,Lr(w,J),ce,le),Ae&&wo(w,null,q,"created"),Le(se,w,w.scopeId,ce,q),ve){for(const Ke in ve)Ke!=="value"&&!Rs(Ke)&&f(se,Ke,null,ve[Ke],J,q);"value"in ve&&f(se,"value",null,ve.value,J),(te=ve.onVnodeBeforeMount)&&si(te,q,w)}Ae&&wo(w,null,q,"beforeMount");const Re=qf(W,Te);Re&&Te.beforeEnter(se),l(se,y,S),((te=ve&&ve.onVnodeMounted)||Re||Ae)&&dn(()=>{try{te&&si(te,q,w),Re&&Te.enter(se),Ae&&wo(w,null,q,"mounted")}finally{}},W)},Le=(w,y,S,q,W)=>{if(S&&j(w,S),q)for(let J=0;J{for(let te=se;te{const le=y.el=w.el;let{patchFlag:se,dynamicChildren:te,dirs:ve}=y;se|=w.patchFlag&16;const re=w.props||vt,Te=y.props||vt;let Ae;if(S&&ko(S,!1),(Ae=Te.onVnodeBeforeUpdate)&&si(Ae,S,y,w),ve&&wo(y,w,S,"beforeUpdate"),S&&ko(S,!0),te&&(!w.dynamicChildren||w.dynamicChildren.length!==te.length)&&(se=0,ce=!1,te=null),(re.innerHTML&&Te.innerHTML==null||re.textContent&&Te.textContent==null)&&T(le,""),te?ee(w.dynamicChildren,te,le,S,q,Lr(y,W),J):ce||fe(w,y,le,null,S,q,Lr(y,W),J,!1),se>0){if(se&16)V(le,re,Te,S,W);else if(se&2&&re.class!==Te.class&&f(le,"class",null,Te.class,W),se&4&&f(le,"style",re.style,Te.style,W),se&8){const Re=y.dynamicProps;for(let Ke=0;Ke{Ae&&si(Ae,S,y,w),ve&&wo(y,w,S,"updated")},q)},ee=(w,y,S,q,W,J,ce)=>{for(let le=0;le{if(y!==S){if(y!==vt)for(const J in y)!Rs(J)&&!(J in S)&&f(w,J,y[J],null,W,q);for(const J in S){if(Rs(J))continue;const ce=S[J],le=y[J];ce!==le&&J!=="value"&&f(w,J,le,ce,W,q)}"value"in S&&f(w,"value",y.value,S.value,W)}},O=(w,y,S,q,W,J,ce,le,se)=>{const te=y.el=w?w.el:_(""),ve=y.anchor=w?w.anchor:_("");let{patchFlag:re,dynamicChildren:Te,slotScopeIds:Ae}=y;Ae&&(le=le?le.concat(Ae):Ae),w==null?(l(te,S,q),l(ve,S,q),Ze(y.children||[],S,ve,W,J,ce,le,se)):re>0&&re&64&&Te&&w.dynamicChildren&&w.dynamicChildren.length===Te.length?(ee(w.dynamicChildren,Te,S,W,J,ce,le),(y.key!=null||W&&y===W.subTree)&&fl(w,y,!0)):fe(w,y,S,ve,W,J,ce,le,se)},F=(w,y,S,q,W,J,ce,le,se)=>{y.slotScopeIds=le,w==null?y.shapeFlag&512?W.ctx.activate(y,S,q,ce,se):$(y,S,q,W,J,ce,se):Ye(w,y,se)},$=(w,y,S,q,W,J,ce)=>{const le=w.component=oh(w,q,W);if(Xa(w)&&(le.ctx.renderer=Pt),sh(le,!1,ce),le.asyncDep){if(W&&W.registerDep(le,Se,ce),!w.el){const se=le.subTree=A(sn);R(null,se,y,S),w.placeholder=se.el}}else Se(le,w,y,S,W,J,ce)},Ye=(w,y,S)=>{const q=y.component=w.component;if(Rf(w,y,S))if(q.asyncDep&&!q.asyncResolved){ge(q,y,S);return}else q.next=y,q.update();else y.el=w.el,q.vnode=y},Se=(w,y,S,q,W,J,ce)=>{const le=()=>{if(w.isMounted){let{next:re,bu:Te,u:Ae,parent:Re,vnode:Ke}=w;{const Jt=Nc(w);if(Jt){re&&(re.el=Ke.el,ge(w,re,ce)),Jt.asyncDep.then(()=>{dn(()=>{w.isUnmounted||te()},W)});return}}let Ge=re,pt;ko(w,!1),re?(re.el=Ke.el,ge(w,re,ce)):re=Ke,Te&&Ea(Te),(pt=re.props&&re.props.onVnodeBeforeUpdate)&&si(pt,Re,re,Ke),ko(w,!0);const ht=Zl(w),Vt=w.subTree;w.subTree=ht,N(Vt,ht,M(Vt.el),zt(Vt),w,W,J),re.el=ht.el,Ge===null&&Bf(w,ht.el),Ae&&dn(Ae,W),(pt=re.props&&re.props.onVnodeUpdated)&&dn(()=>si(pt,Re,re,Ke),W)}else{let re;const{el:Te,props:Ae}=y,{bm:Re,m:Ke,parent:Ge,root:pt,type:ht}=w,Vt=is(y);ko(w,!1),Re&&Ea(Re),!Vt&&(re=Ae&&Ae.onVnodeBeforeMount)&&si(re,Ge,y),ko(w,!0);{pt.ce&&pt.ce._hasShadowRoot()&&pt.ce._injectChildStyle(ht,w.parent?w.parent.type:void 0);const Jt=w.subTree=Zl(w);N(null,Jt,S,q,w,W,J),y.el=Jt.el}if(Ke&&dn(Ke,W),!Vt&&(re=Ae&&Ae.onVnodeMounted)){const Jt=y;dn(()=>si(re,Ge,Jt),W)}(y.shapeFlag&256||Ge&&is(Ge.vnode)&&Ge.vnode.shapeFlag&256)&&w.a&&dn(w.a,W),w.isMounted=!0,y=S=q=null}};w.scope.on();const se=w.effect=new Vu(le);w.scope.off();const te=w.update=se.run.bind(se),ve=w.job=se.runIfDirty.bind(se);ve.i=w,ve.id=w.uid,se.scheduler=()=>ul(ve),ko(w,!0),te()},ge=(w,y,S)=>{y.component=w;const q=w.vnode.props;w.vnode=y,w.next=null,Vf(w,y.props,q,S),Wf(w,y.children,S),di(),zl(w),fi()},fe=(w,y,S,q,W,J,ce,le,se=!1)=>{const te=w&&w.children,ve=w?w.shapeFlag:0,re=y.children,{patchFlag:Te,shapeFlag:Ae}=y;if(Te>0){if(Te&128){pe(te,re,S,q,W,J,ce,le,se);return}else if(Te&256){ft(te,re,S,q,W,J,ce,le,se);return}}Ae&8?(ve&16&&De(te,W,J),re!==te&&T(S,re)):ve&16?Ae&16?pe(te,re,S,q,W,J,ce,le,se):De(te,W,J,!0):(ve&8&&T(S,""),Ae&16&&Ze(re,S,q,W,J,ce,le,se))},ft=(w,y,S,q,W,J,ce,le,se)=>{w=w||es,y=y||es;const te=w.length,ve=y.length,re=Math.min(te,ve);let Te;for(Te=0;Teve?De(w,W,J,!0,!1,re):Ze(y,S,q,W,J,ce,le,se,re)},pe=(w,y,S,q,W,J,ce,le,se)=>{let te=0;const ve=y.length;let re=w.length-1,Te=ve-1;for(;te<=re&&te<=Te;){const Ae=w[te],Re=y[te]=se?Ci(y[te]):li(y[te]);if(Lo(Ae,Re))N(Ae,Re,S,null,W,J,ce,le,se);else break;te++}for(;te<=re&&te<=Te;){const Ae=w[re],Re=y[Te]=se?Ci(y[Te]):li(y[Te]);if(Lo(Ae,Re))N(Ae,Re,S,null,W,J,ce,le,se);else break;re--,Te--}if(te>re){if(te<=Te){const Ae=Te+1,Re=AeTe)for(;te<=re;)Ve(w[te],W,J,!0),te++;else{const Ae=te,Re=te,Ke=new Map;for(te=Re;te<=Te;te++){const Ct=y[te]=se?Ci(y[te]):li(y[te]);Ct.key!=null&&Ke.set(Ct.key,te)}let Ge,pt=0;const ht=Te-Re+1;let Vt=!1,Jt=0;const Zt=new Array(ht);for(te=0;te=ht){Ve(Ct,W,J,!0);continue}let $t;if(Ct.key!=null)$t=Ke.get(Ct.key);else for(Ge=Re;Ge<=Te;Ge++)if(Zt[Ge-Re]===0&&Lo(Ct,y[Ge])){$t=Ge;break}$t===void 0?Ve(Ct,W,J,!0):(Zt[$t-Re]=te+1,$t>=Jt?Jt=$t:Vt=!0,N(Ct,y[$t],S,null,W,J,ce,le,se),pt++)}const pn=Vt?Yf(Zt):es;for(Ge=pn.length-1,te=ht-1;te>=0;te--){const Ct=Re+te,$t=y[Ct],kn=y[Ct+1],zi=Ct+1{const{el:J,type:ce,transition:le,children:se,shapeFlag:te}=w;if(te&6){Ue(w.component.subTree,y,S,q);return}if(te&128){w.suspense.move(y,S,q);return}if(te&64){ce.move(w,y,S,Pt);return}if(ce===ae){l(J,y,S);for(let re=0;rele.enter(J),W));else{const{leave:re,delayLeave:Te,afterLeave:Ae}=le,Re=()=>{w.ctx.isUnmounted?u(J):l(J,y,S)},Ke=()=>{const Ge=J._isLeaving||!!J[Un];J._isLeaving&&J[Un](!0),le.persisted&&!Ge?Re():re(J,()=>{Re(),Ae&&Ae()})};Te?Te(J,Re,Ke):Ke()}else l(J,y,S)},Ve=(w,y,S,q=!1,W=!1)=>{const{type:J,props:ce,ref:le,children:se,dynamicChildren:te,shapeFlag:ve,patchFlag:re,dirs:Te,cacheIndex:Ae,memo:Re}=w;if(re===-2&&(W=!1),le!=null&&(di(),Zs(le,null,S,w,!0),fi()),Ae!=null&&(y.renderCache[Ae]=void 0),ve&256){y.ctx.deactivate(w);return}const Ke=ve&1&&Te,Ge=!is(w);let pt;if(Ge&&(pt=ce&&ce.onVnodeBeforeUnmount)&&si(pt,y,w),ve&6)Me(w.component,S,q);else{if(ve&128){w.suspense.unmount(S,q);return}Ke&&wo(w,null,y,"beforeUnmount"),ve&64?w.type.remove(w,y,S,Pt,q):te&&!te.hasOnce&&(J!==ae||re>0&&re&64)?De(te,y,S,!1,!0):(J===ae&&re&384||!W&&ve&16)&&De(se,y,S),q&&wt(w)}const ht=Re!=null&&Ae==null;(Ge&&(pt=ce&&ce.onVnodeUnmounted)||Ke||ht)&&dn(()=>{pt&&si(pt,y,w),Ke&&wo(w,null,y,"unmounted"),ht&&(w.el=null)},S)},wt=w=>{const{type:y,el:S,anchor:q,transition:W}=w;if(y===ae){st(S,q);return}if(y===Ar){ue(w);return}const J=()=>{u(S),W&&!W.persisted&&W.afterLeave&&W.afterLeave()};if(w.shapeFlag&1&&W&&!W.persisted){const{leave:ce,delayLeave:le}=W,se=()=>ce(S,J);le?le(w.el,J,se):se()}else J()},st=(w,y)=>{let S;for(;w!==y;)S=H(w),u(w),w=S;u(y)},Me=(w,y,S)=>{const{bum:q,scope:W,job:J,subTree:ce,um:le,m:se,a:te}=w;Wl(se),Wl(te),q&&Ea(q),W.stop(),J&&(J.flags|=8,Ve(ce,w,y,S)),le&&dn(le,y),dn(()=>{w.isUnmounted=!0},y)},De=(w,y,S,q=!1,W=!1,J=0)=>{for(let ce=J;ce{if(w.shapeFlag&6)return zt(w.component.subTree);if(w.shapeFlag&128)return w.suspense.next();const y=H(w.anchor||w.el),S=y&&y[fc];return S?H(S):y};let At=!1;const Ut=(w,y,S)=>{let q;w==null?y._vnode&&(Ve(y._vnode,null,null,!0),q=y._vnode.component):N(y._vnode||null,w,y,null,null,null,S),y._vnode=w,At||(At=!0,zl(q),ac(),At=!1)},Pt={p:N,um:Ve,m:Ue,r:wt,mt:$,mc:Ze,pc:fe,pbc:ee,n:zt,o:t};return{render:Ut,hydrate:void 0,createApp:zf(Ut)}}function Lr({type:t,props:i},s){return s==="svg"&&t==="foreignObject"||s==="mathml"&&t==="annotation-xml"&&i&&i.encoding&&i.encoding.includes("html")?void 0:s}function ko({effect:t,job:i},s){s?(t.flags|=32,i.flags|=4):(t.flags&=-33,i.flags&=-5)}function qf(t,i){return(!t||t&&!t.pendingBranch)&&i&&!i.persisted}function fl(t,i,s=!1){const l=t.children,u=i.children;if(Ne(l)&&Ne(u))for(let f=0;f>1,t[s[_]]0&&(i[l]=s[f-1]),s[f]=l)}}for(f=s.length,h=s[f-1];f-- >0;)s[f]=h,h=i[h];return s}function Nc(t){const i=t.subTree.component;if(i)return i.asyncDep&&!i.asyncResolved?i:Nc(i)}function Wl(t){if(t)for(let i=0;it.__isSuspense;function Jf(t,i){i&&i.pendingBranch?Ne(t)?i.effects.push(...t):i.effects.push(t):nf(t)}const ae=Symbol.for("v-fgt"),tr=Symbol.for("v-txt"),sn=Symbol.for("v-cmt"),Ar=Symbol.for("v-stc"),js=[];let zn=null;function p(t=!1){js.push(zn=t?null:[])}function Xf(){js.pop(),zn=js[js.length-1]||null}let Ys=1;function Da(t,i=!1){Ys+=t,t<0&&zn&&i&&(zn.hasOnce=!0)}function Rc(t){return t.dynamicChildren=Ys>0?zn||es:null,Xf(),Ys>0&&zn&&zn.push(t),t}function m(t,i,s,l,u,f){return Rc(a(t,i,s,l,u,f,!0))}function nt(t,i,s,l,u){return Rc(A(t,i,s,l,u,!0))}function Js(t){return t?t.__v_isVNode===!0:!1}function Lo(t,i){return t.type===i.type&&t.key===i.key}const Bc=({key:t})=>t??null,Oa=({ref:t,ref_key:i,ref_for:s})=>(typeof t=="number"&&(t=""+t),t!=null?Tt(t)||rn(t)||je(t)?{i:an,r:t,k:i,f:!!s}:t:null);function a(t,i=null,s=null,l=0,u=null,f=t===ae?0:1,h=!1,_=!1){const b={__v_isVNode:!0,__v_skip:!0,type:t,props:i,key:i&&Bc(i),ref:i&&Oa(i),scopeId:lc,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:f,patchFlag:l,dynamicProps:u,dynamicChildren:null,appContext:null,ctx:an};return _?(Ra(b,s),f&128&&t.normalize(b)):s&&(b.shapeFlag|=Tt(s)?8:16),Ys>0&&!h&&zn&&(b.patchFlag>0||f&6)&&b.patchFlag!==32&&zn.push(b),b}const A=Qf;function Qf(t,i=null,s=null,l=0,u=null,f=!1){if((!t||t===Sf)&&(t=sn),Js(t)){const _=Qi(t,i,!0);return s&&Ra(_,s),Ys>0&&!f&&zn&&(_.shapeFlag&6?zn[zn.indexOf(t)]=_:zn.push(_)),_.patchFlag=-2,_}if(uh(t)&&(t=t.__vccOpts),i){i=eh(i);let{class:_,style:b}=i;_&&!Tt(_)&&(i.class=Pe(_)),dt(b)&&(ll(b)&&!Ne(b)&&(b=Kt({},b)),i.style=Eo(b))}const h=Tt(t)?1:Dc(t)?128:hc(t)?64:dt(t)?4:je(t)?2:0;return a(t,i,s,l,u,h,f,!0)}function eh(t){return t?ll(t)||Mc(t)?Kt({},t):t:null}function Qi(t,i,s=!1,l=!1){const{props:u,ref:f,patchFlag:h,children:_,transition:b}=t,C=i?th(u||{},i):u,T={__v_isVNode:!0,__v_skip:!0,type:t.type,props:C,key:C&&Bc(C),ref:i&&i.ref?s&&f?Ne(f)?f.concat(Oa(i)):[f,Oa(i)]:Oa(i):f,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:_,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:i&&t.type!==ae?h===-1?16:h|16:h,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:b,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&Qi(t.ssContent),ssFallback:t.ssFallback&&Qi(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return b&&l&&qs(T,b.clone(T)),T}function z(t=" ",i=0){return A(tr,null,t,i)}function I(t="",i=!1){return i?(p(),nt(sn,null,t)):A(sn,null,t)}function li(t){return t==null||typeof t=="boolean"?A(sn):Ne(t)?A(ae,null,t.slice()):Js(t)?Ci(t):A(tr,null,String(t))}function Ci(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:Qi(t)}function Ra(t,i){let s=0;const{shapeFlag:l}=t;if(i==null)i=null;else if(Ne(i))s=16;else if(typeof i=="object")if(l&65){const u=i.default;u&&(u._c&&(u._d=!1),Ra(t,u()),u._c&&(u._d=!0));return}else{s=32;const u=i._;!u&&!Mc(i)?i._ctx=an:u===3&&an&&(an.slots._===1?i._=1:(i._=2,t.patchFlag|=1024))}else if(je(i)){if(l&65){Ra(t,{default:i});return}i={default:i,_ctx:an},s=32}else i=String(i),l&64?(s=16,i=[z(i)]):s=8;t.children=i,t.shapeFlag|=s}function th(...t){const i={};for(let s=0;shn||an;let Ba,Kr;{const t=qa(),i=(s,l)=>{let u;return(u=t[s])||(u=t[s]=[]),u.push(l),f=>{u.length>1?u.forEach(h=>h(f)):u[0](f)}};Ba=i("__VUE_INSTANCE_SETTERS__",s=>hn=s),Kr=i("__VUE_SSR_SETTERS__",s=>Xs=s)}const na=t=>{const i=hn;return Ba(t),t.scope.on(),()=>{t.scope.off(),Ba(i)}},Kl=()=>{hn&&hn.scope.off(),Ba(null)};function Vc(t){return t.vnode.shapeFlag&4}let Xs=!1;function sh(t,i=!1,s=!1){i&&Kr(i);const{props:l,children:u}=t.vnode,f=Vc(t);Uf(t,l,f,i),jf(t,u,s||i);const h=f?ah(t,i):void 0;return i&&Kr(!1),h}function ah(t,i){const s=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,Pf);const{setup:l}=s;if(l){di();const u=t.setupContext=l.length>1?lh(t):null,f=na(t),h=ta(l,t,0,[t.props,u]),_=$u(h);if(fi(),f(),(_||t.sp)&&!is(t)&&bc(t),_){if(h.then(Kl,Kl),i)return h.then(b=>{Gl(t,b)}).catch(b=>{Ja(b,t,0)});t.asyncDep=h}else Gl(t,h)}else Zc(t)}function Gl(t,i,s){je(i)?t.type.__ssrInlineRender?t.ssrRender=i:t.render=i:dt(i)&&(t.setupState=nc(i)),Zc(t)}function Zc(t,i,s){const l=t.type;t.render||(t.render=l.render||ci);{const u=na(t);di();try{Cf(t)}finally{fi(),u()}}}const rh={get(t,i){return on(t,"get",""),t[i]}};function lh(t){const i=s=>{t.exposed=s||{}};return{attrs:new Proxy(t.attrs,rh),slots:t.slots,emit:t.emit,expose:i}}function nr(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(nc(Wd(t.exposed)),{get(i,s){if(s in i)return i[s];if(s in Hs)return Hs[s](t)},has(i,s){return s in i||s in Hs}})):t.proxy}function uh(t){return je(t)&&"__vccOpts"in t}const de=(t,i)=>Jd(t,i,Xs);function ch(t,i,s){try{Da(-1);const l=arguments.length;return l===2?dt(i)&&!Ne(i)?Js(i)?A(t,null,[i]):A(t,i):A(t,null,i):(l>3?s=Array.prototype.slice.call(arguments,2):l===3&&Js(s)&&(s=[s]),A(t,i,s))}finally{Da(1)}}const dh="3.5.39";/** +* @vue/runtime-dom v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Gr;const ql=typeof window<"u"&&window.trustedTypes;if(ql)try{Gr=ql.createPolicy("vue",{createHTML:t=>t})}catch{}const Hc=Gr?t=>Gr.createHTML(t):t=>t,fh="http://www.w3.org/2000/svg",hh="http://www.w3.org/1998/Math/MathML",Pi=typeof document<"u"?document:null,Yl=Pi&&Pi.createElement("template"),ph={insert:(t,i,s)=>{i.insertBefore(t,s||null)},remove:t=>{const i=t.parentNode;i&&i.removeChild(t)},createElement:(t,i,s,l)=>{const u=i==="svg"?Pi.createElementNS(fh,t):i==="mathml"?Pi.createElementNS(hh,t):s?Pi.createElement(t,{is:s}):Pi.createElement(t);return t==="select"&&l&&l.multiple!=null&&u.setAttribute("multiple",l.multiple),u},createText:t=>Pi.createTextNode(t),createComment:t=>Pi.createComment(t),setText:(t,i)=>{t.nodeValue=i},setElementText:(t,i)=>{t.textContent=i},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Pi.querySelector(t),setScopeId(t,i){t.setAttribute(i,"")},insertStaticContent(t,i,s,l,u,f){const h=s?s.previousSibling:i.lastChild;if(u&&(u===f||u.nextSibling))for(;i.insertBefore(u.cloneNode(!0),s),!(u===f||!(u=u.nextSibling)););else{Yl.innerHTML=Hc(l==="svg"?`${t}`:l==="mathml"?`${t}`:t);const _=Yl.content;if(l==="svg"||l==="mathml"){const b=_.firstChild;for(;b.firstChild;)_.appendChild(b.firstChild);_.removeChild(b)}i.insertBefore(_,s)}return[h?h.nextSibling:i.firstChild,s?s.previousSibling:i.lastChild]}},Gi="transition",zs="animation",Qs=Symbol("_vtc"),jc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},mh=Kt({},pc,jc),gh=t=>(t.displayName="Transition",t.props=mh,t),vh=gh((t,{slots:i})=>ch(hf,_h(t),i)),So=(t,i=[])=>{Ne(t)?t.forEach(s=>s(...i)):t&&t(...i)},Jl=t=>t?Ne(t)?t.some(i=>i.length>1):t.length>1:!1;function _h(t){const i={};for(const O in t)O in jc||(i[O]=t[O]);if(t.css===!1)return i;const{name:s="v",type:l,duration:u,enterFromClass:f=`${s}-enter-from`,enterActiveClass:h=`${s}-enter-active`,enterToClass:_=`${s}-enter-to`,appearFromClass:b=f,appearActiveClass:C=h,appearToClass:T=_,leaveFromClass:M=`${s}-leave-from`,leaveActiveClass:H=`${s}-leave-active`,leaveToClass:j=`${s}-leave-to`}=t,G=bh(u),N=G&&G[0],U=G&&G[1],{onBeforeEnter:R,onEnter:oe,onEnterCancelled:we,onLeave:ue,onLeaveCancelled:ke,onBeforeAppear:Ce=R,onAppear:Le=oe,onAppearCancelled:Ze=we}=i,he=(O,F,$,Ye)=>{O._enterCancelled=Ye,To(O,F?T:_),To(O,F?C:h),$&&$()},ee=(O,F)=>{O._isLeaving=!1,To(O,M),To(O,j),To(O,H),F&&F()},V=O=>(F,$)=>{const Ye=O?Le:oe,Se=()=>he(F,O,$);So(Ye,[F,Se]),Xl(()=>{To(F,O?b:f),Ti(F,O?T:_),Jl(Ye)||Ql(F,l,N,Se)})};return Kt(i,{onBeforeEnter(O){So(R,[O]),Ti(O,f),Ti(O,h)},onBeforeAppear(O){So(Ce,[O]),Ti(O,b),Ti(O,C)},onEnter:V(!1),onAppear:V(!0),onLeave(O,F){O._isLeaving=!0;const $=()=>ee(O,F);Ti(O,M),O._enterCancelled?(Ti(O,H),nu(O)):(nu(O),Ti(O,H)),Xl(()=>{O._isLeaving&&(To(O,M),Ti(O,j),Jl(ue)||Ql(O,l,U,$))}),So(ue,[O,$])},onEnterCancelled(O){he(O,!1,void 0,!0),So(we,[O])},onAppearCancelled(O){he(O,!0,void 0,!0),So(Ze,[O])},onLeaveCancelled(O){ee(O),So(ke,[O])}})}function bh(t){if(t==null)return null;if(dt(t))return[Mr(t.enter),Mr(t.leave)];{const i=Mr(t);return[i,i]}}function Mr(t){return _d(t)}function Ti(t,i){i.split(/\s+/).forEach(s=>s&&t.classList.add(s)),(t[Qs]||(t[Qs]=new Set)).add(i)}function To(t,i){i.split(/\s+/).forEach(l=>l&&t.classList.remove(l));const s=t[Qs];s&&(s.delete(i),s.size||(t[Qs]=void 0))}function Xl(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let yh=0;function Ql(t,i,s,l){const u=t._endId=++yh,f=()=>{u===t._endId&&l()};if(s!=null)return setTimeout(f,s);const{type:h,timeout:_,propCount:b}=xh(t,i);if(!h)return l();const C=h+"end";let T=0;const M=()=>{t.removeEventListener(C,H),f()},H=j=>{j.target===t&&++T>=b&&M()};setTimeout(()=>{T(s[G]||"").split(", "),u=l(`${Gi}Delay`),f=l(`${Gi}Duration`),h=eu(u,f),_=l(`${zs}Delay`),b=l(`${zs}Duration`),C=eu(_,b);let T=null,M=0,H=0;i===Gi?h>0&&(T=Gi,M=h,H=f.length):i===zs?C>0&&(T=zs,M=C,H=b.length):(M=Math.max(h,C),T=M>0?h>C?Gi:zs:null,H=T?T===Gi?f.length:b.length:0);const j=T===Gi&&/\b(?:transform|all)(?:,|$)/.test(l(`${Gi}Property`).toString());return{type:T,timeout:M,propCount:H,hasTransform:j}}function eu(t,i){for(;t.lengthtu(s)+tu(t[l])))}function tu(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function nu(t){return(t?t.ownerDocument:document).body.offsetHeight}function wh(t,i,s){const l=t[Qs];l&&(i=(i?[i,...l]:[...l]).join(" ")),i==null?t.removeAttribute("class"):s?t.setAttribute("class",i):t.className=i}const Ua=Symbol("_vod"),Wc=Symbol("_vsh"),kh={name:"show",beforeMount(t,{value:i},{transition:s}){t[Ua]=t.style.display==="none"?"":t.style.display,s&&i?s.beforeEnter(t):$s(t,i)},mounted(t,{value:i},{transition:s}){s&&i&&s.enter(t)},updated(t,{value:i,oldValue:s},{transition:l}){!i!=!s&&(l?i?(l.beforeEnter(t),$s(t,!0),l.enter(t)):l.leave(t,()=>{$s(t,!1)}):$s(t,i))},beforeUnmount(t,{value:i}){$s(t,i)}};function $s(t,i){t.style.display=i?t[Ua]:"none",t[Wc]=!i}const Sh=Symbol(""),Th=/(?:^|;)\s*display\s*:/;function Ph(t,i,s){const l=t.style,u=Tt(s);let f=!1;if(s&&!u){if(i)if(Tt(i))for(const h of i.split(";")){const _=h.slice(0,h.indexOf(":")).trim();s[_]==null&&Fs(l,_,"")}else for(const h in i)s[h]==null&&Fs(l,h,"");for(const h in s){h==="display"&&(f=!0);const _=s[h];_!=null?Lh(t,h,!Tt(i)&&i?i[h]:void 0,_)||Fs(l,h,_):Fs(l,h,"")}}else if(u){if(i!==s){const h=l[Sh];h&&(s+=";"+h),l.cssText=s,f=Th.test(s)}}else i&&t.removeAttribute("style");Ua in t&&(t[Ua]=f?l.display:"",t[Wc]&&(l.display="none"))}const iu=/\s*!important$/;function Fs(t,i,s){if(Ne(s))s.forEach(l=>Fs(t,i,l));else if(s==null&&(s=""),i.startsWith("--"))t.setProperty(i,s);else{const l=Ch(t,i);iu.test(s)?t.setProperty(to(l),s.replace(iu,""),"important"):t[l]=s}}const ou=["Webkit","Moz","ms"],Er={};function Ch(t,i){const s=Er[i];if(s)return s;let l=Jn(i);if(l!=="filter"&&l in t)return Er[i]=l;l=Fu(l);for(let u=0;uOr||($h.then(()=>Or=0),Or=Date.now());function Nh(t,i){const s=l=>{if(!l._vts)l._vts=Date.now();else if(l._vts<=s.attached)return;const u=s.value;if(Ne(u)){const f=l.stopImmediatePropagation;l.stopImmediatePropagation=()=>{f.call(l),l._stopped=!0};const h=u.slice(),_=[l];for(let b=0;bt.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,Fh=(t,i,s,l,u,f)=>{const h=u==="svg";i==="class"?wh(t,l,h):i==="style"?Ph(t,s,l):ja(i)?Wa(i)||Mh(t,i,s,l,f):(i[0]==="."?(i=i.slice(1),!0):i[0]==="^"?(i=i.slice(1),!1):Dh(t,i,l,h))?(ru(t,i,l),!t.tagName.includes("-")&&(i==="value"||i==="checked"||i==="selected")&&au(t,i,l,h,f,i!=="value")):t._isVueCE&&(Rh(t,i)||t._def.__asyncLoader&&(/[A-Z]/.test(i)||!Tt(l)))?ru(t,Jn(i),l,f,i):(i==="true-value"?t._trueValue=l:i==="false-value"&&(t._falseValue=l),au(t,i,l,h))};function Dh(t,i,s,l){if(l)return!!(i==="innerHTML"||i==="textContent"||i in t&&uu(i)&&je(s));if(i==="spellcheck"||i==="draggable"||i==="translate"||i==="autocorrect"||i==="sandbox"&&t.tagName==="IFRAME"||i==="form"||i==="list"&&t.tagName==="INPUT"||i==="type"&&t.tagName==="TEXTAREA")return!1;if(i==="width"||i==="height"){const u=t.tagName;if(u==="IMG"||u==="VIDEO"||u==="CANVAS"||u==="SOURCE")return!1}return uu(i)&&Tt(s)?!1:i in t}function Rh(t,i){const s=t._def.props;if(!s)return!1;const l=Jn(i);return Array.isArray(s)?s.some(u=>Jn(u)===l):Object.keys(s).some(u=>Jn(u)===l)}const eo=t=>{const i=t.props["onUpdate:modelValue"]||!1;return Ne(i)?s=>Ea(i,s):i};function Bh(t){t.target.composing=!0}function cu(t){const i=t.target;i.composing&&(i.composing=!1,i.dispatchEvent(new Event("input")))}const Zn=Symbol("_assign");function du(t,i,s){return i&&(t=t.trim()),s&&(t=Ga(t)),t}const me={created(t,{modifiers:{lazy:i,trim:s,number:l}},u){t[Zn]=eo(u);const f=l||u.props&&u.props.type==="number";Mi(t,i?"change":"input",h=>{h.target.composing||t[Zn](du(t.value,s,f))}),(s||f)&&Mi(t,"change",()=>{t.value=du(t.value,s,f)}),i||(Mi(t,"compositionstart",Bh),Mi(t,"compositionend",cu),Mi(t,"change",cu))},mounted(t,{value:i}){t.value=i??""},beforeUpdate(t,{value:i,oldValue:s,modifiers:{lazy:l,trim:u,number:f}},h){if(t[Zn]=eo(h),t.composing)return;const _=(f||t.type==="number")&&!/^0\d/.test(t.value)?Ga(t.value):t.value,b=i??"";if(_===b)return;const C=t.getRootNode();(C instanceof Document||C instanceof ShadowRoot)&&C.activeElement===t&&t.type!=="range"&&(l&&i===s||u&&t.value.trim()===b)||(t.value=b)}},Va={deep:!0,created(t,i,s){t[Zn]=eo(s),Mi(t,"change",()=>{const l=t._modelValue,u=rs(t),f=t.checked,h=t[Zn];if(Ne(l)){const _=tl(l,u),b=_!==-1;if(f&&!b)h(l.concat(u));else if(!f&&b){const C=[...l];C.splice(_,1),h(C)}}else if(ls(l)){const _=new Set(l);f?_.add(u):_.delete(u),h(_)}else h(Kc(t,f))})},mounted:fu,beforeUpdate(t,i,s){t[Zn]=eo(s),fu(t,i,s)}};function fu(t,{value:i,oldValue:s},l){t._modelValue=i;let u;if(Ne(i))u=tl(i,l.props.value)>-1;else if(ls(i))u=i.has(l.props.value);else{if(i===s)return;u=Xi(i,Kc(t,!0))}t.checked!==u&&(t.checked=u)}const Uh={created(t,{value:i},s){t.checked=Xi(i,s.props.value),t[Zn]=eo(s),Mi(t,"change",()=>{t[Zn](rs(t))})},beforeUpdate(t,{value:i,oldValue:s},l){t[Zn]=eo(l),i!==s&&(t.checked=Xi(i,l.props.value))}},Ot={deep:!0,created(t,{value:i,modifiers:{number:s}},l){const u=ls(i);Mi(t,"change",()=>{const f=Array.prototype.filter.call(t.options,h=>h.selected).map(h=>s?Ga(rs(h)):rs(h));t[Zn](t.multiple?u?new Set(f):f:f[0]),t._assigning=!0,oc(()=>{t._assigning=!1})}),t[Zn]=eo(l)},mounted(t,{value:i}){hu(t,i)},beforeUpdate(t,i,s){t[Zn]=eo(s)},updated(t,{value:i}){t._assigning||hu(t,i)}};function hu(t,i){const s=t.multiple,l=Ne(i);if(!(s&&!l&&!ls(i))){for(let u=0,f=t.options.length;uString(C)===String(_)):h.selected=tl(i,_)>-1}else h.selected=i.has(_);else if(Xi(rs(h),i)){t.selectedIndex!==u&&(t.selectedIndex=u);return}}!s&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function rs(t){return"_value"in t?t._value:t.value}function Kc(t,i){const s=i?"_trueValue":"_falseValue";return s in t?t[s]:i}const Vh={created(t,i,s){Aa(t,i,s,null,"created")},mounted(t,i,s){Aa(t,i,s,null,"mounted")},beforeUpdate(t,i,s,l){Aa(t,i,s,l,"beforeUpdate")},updated(t,i,s,l){Aa(t,i,s,l,"updated")}};function Zh(t,i){switch(t){case"SELECT":return Ot;case"TEXTAREA":return me;default:switch(i){case"checkbox":return Va;case"radio":return Uh;default:return me}}}function Aa(t,i,s,l,u){const h=Zh(t.tagName,s.props&&s.props.type)[u];h&&h(t,i,s,l)}const Hh=["ctrl","shift","alt","meta"],jh={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,i)=>Hh.some(s=>t[`${s}Key`]&&!i.includes(s))},hl=(t,i)=>{if(!t)return t;const s=t._withMods||(t._withMods={}),l=i.join(".");return s[l]||(s[l]=((u,...f)=>{for(let h=0;h{const s=t._withKeys||(t._withKeys={}),l=i.join(".");return s[l]||(s[l]=(u=>{if(!("key"in u))return;const f=to(u.key);if(i.some(h=>h===f||Wh[h]===f))return t(u)}))},Kh=Kt({patchProp:Fh},ph);let mu;function Gh(){return mu||(mu=Kf(Kh))}const qh=((...t)=>{const i=Gh().createApp(...t),{mount:s}=i;return i.mount=l=>{const u=Jh(l);if(!u)return;const f=i._component;!je(f)&&!f.render&&!f.template&&(f.template=u.innerHTML),u.nodeType===1&&(u.textContent="");const h=s(u,!1,Yh(u));return u instanceof Element&&(u.removeAttribute("v-cloak"),u.setAttribute("data-v-app","")),h},i});function Yh(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function Jh(t){return Tt(t)?document.querySelector(t):t}const Gc="pv_theme",gu={light:"#EEF0F3",dark:"#0B1730"},Za=typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null;function qc(){return Za&&Za.matches?"dark":"light"}function Xh(){try{return localStorage.getItem(Gc)||"light"}catch{return"light"}}function Yc(t){return t==="system"?qc():t}function Jc(t){const i=document.documentElement;i.setAttribute("data-theme",t),i.style.backgroundColor=gu[t]||gu.light}const Oo=Y(Xh()),ss=Y(Yc(Oo.value));function Ha(t){Oo.value=t;const i=Yc(t);ss.value=i,Jc(i);try{localStorage.setItem(Gc,t)}catch{}}function vu(){Ha(ss.value==="dark"?"light":"dark")}Za&&Za.addEventListener("change",()=>{if(Oo.value==="system"){const t=qc();ss.value=t,Jc(t)}});async function Qh(){try{const t=await fetch("/bff/config");return t.ok?await t.json():{apiBase:""}}catch{return{apiBase:""}}}async function _u(){try{const t=await fetch("/bff/me");return t.ok?await t.json():null}catch{return null}}async function ep(t,i,s){const l=await fetch("/bff/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,password:i,apiBase:s})});return{ok:l.ok,status:l.status,body:await l.json().catch(()=>({}))}}async function tp(){try{await fetch("/bff/logout",{method:"POST"})}catch{}}async function np(){try{const t=await fetch("/bff/devices");return t.ok?await t.json():[]}catch{return[]}}async function ip(){try{const t=await fetch("/bff/users");return t.ok?{ok:!0,status:200,users:(await t.json()).users||[]}:{ok:!1,status:t.status,users:[]}}catch{return{ok:!1,status:0,users:[]}}}async function op(t,i,s,l){const u=await fetch("/bff/users",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,password:i,role:s,organization:l})});return{ok:u.ok,status:u.status,body:await u.json().catch(()=>({}))}}async function sp(t,i){const s=await fetch(`/bff/users/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function ap(t){const i=await fetch(`/bff/users/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function rp(){try{const t=await fetch("/bff/orgs");return t.ok?{ok:!0,status:200,organizations:(await t.json()).organizations||[]}:{ok:!1,status:t.status,organizations:[]}}catch{return{ok:!1,status:0,organizations:[]}}}async function lp(t){const i=await fetch("/bff/orgs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t})});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function up(t,i){const s=await fetch(`/bff/orgs/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:i})});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function cp(t){const i=await fetch(`/bff/orgs/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function dp(){try{const t=await fetch("/bff/preferences");if(!t.ok)return null;const i=await t.json();return i&&typeof i.preferences=="object"?i.preferences:null}catch{return null}}async function fp(t){try{return(await fetch("/bff/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({preferences:t})})).ok}catch{return!1}}async function hp(){try{const t=await fetch("/bff/integrations/opensky");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function bu(t){const i=await fetch("/bff/integrations/opensky",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function pp(t){const i=t?`?bbox=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/integrations/opensky/health${i}`,{method:"POST"});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function mp(t){try{const i=t?`?bbox=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/integrations/opensky/states${i}`);if(!s.ok)return{states:[],unavailable:!0,detail:"OpenSky unavailable"};const l=await s.json();return{states:l.states||[],time:l.time,unavailable:!!l.unavailable,detail:l.detail||"",plan:l.plan||"",recommendedInterval:l.recommendedInterval||0}}catch{return{states:[],unavailable:!0,detail:"OpenSky unavailable"}}}async function gp(){try{const t=await fetch("/bff/integrations/filetransfer");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function yu(t){const i=await fetch("/bff/integrations/filetransfer",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function vp(){const t=await fetch("/bff/integrations/filetransfer/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function _p(){try{const t=await fetch("/bff/integrations/localstorage");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function Ma(t){const i=await fetch("/bff/integrations/localstorage",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function bp(){const t=await fetch("/bff/integrations/localstorage/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function yp(){try{const t=await fetch("/bff/integrations/webdav");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function xu(t){const i=await fetch("/bff/integrations/webdav",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function xp(){const t=await fetch("/bff/integrations/webdav/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function wp(){try{const t=await fetch("/bff/integrations/openweather");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function wu(t){const i=await fetch("/bff/integrations/openweather",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function kp(){const t=await fetch("/bff/integrations/openweather/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function Sp(t,i){try{const s=t!=null&&i!=null?`?lat=${encodeURIComponent(t)}&lon=${encodeURIComponent(i)}`:"",l=await fetch(`/bff/integrations/openweather/current${s}`);return l.ok?await l.json():{unavailable:!0,detail:"Weather unavailable"}}catch{return{unavailable:!0,detail:"Weather unavailable"}}}async function pl(){try{const t=await fetch("/bff/drones");return t.ok?{ok:!0,status:200,drones:(await t.json()).drones||[]}:{ok:!1,status:t.status,drones:[]}}catch{return{ok:!1,status:0,drones:[]}}}async function Tp(t){const i=await fetch("/bff/drones",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Pp(t){try{const i=await fetch("/bff/drones/auto",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function Cp(t,i){const s=await fetch(`/bff/drones/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Lp(t){const i=await fetch(`/bff/drones/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Ap(){try{const t=await fetch("/bff/flights");return t.ok?{ok:!0,status:200,flights:(await t.json()).flights||[]}:{ok:!1,status:t.status,flights:[]}}catch{return{ok:!1,status:0,flights:[]}}}async function Mp(t){const i=await fetch("/bff/flights",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Ep(t,i){const s=await fetch(`/bff/flights/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Op(t){const i=await fetch(`/bff/flights/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}function zp(){return"/bff/logbook/export"}async function $p(){try{const t=await fetch("/bff/routes");return t.ok?{ok:!0,status:200,routes:(await t.json()).routes||[]}:{ok:!1,status:t.status,routes:[]}}catch{return{ok:!1,status:0,routes:[]}}}async function Ip(t){try{const i=t!=null&&t!==""?`?expiring=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/documents${i}`);return s.ok?{ok:!0,status:200,documents:(await s.json()).documents||[]}:{ok:!1,status:s.status,documents:[]}}catch{return{ok:!1,status:0,documents:[]}}}async function Np(t,i){const s=new FormData;Object.entries(t).forEach(([u,f])=>{f!=null&&f!==""&&s.append(u,f)}),i&&s.append("file",i);const l=await fetch("/bff/documents",{method:"POST",body:s});return{ok:l.ok,status:l.status,body:await l.json().catch(()=>({}))}}async function Fp(t,i){const s=await fetch(`/bff/documents/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Dp(t){const i=await fetch(`/bff/documents/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}function zr(t){return`/bff/documents/${encodeURIComponent(t)}/file`}function Rp(t){return`/bff/documents/${encodeURIComponent(t)}/file?inline=1`}async function Bp(t,i,s){const l=await fetch(`/bff/devices/${encodeURIComponent(t)}/command`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:i,payload:s})});return{ok:l.ok,body:await l.json().catch(()=>({}))}}const Xc="pv_prefs",qr={name:"",username:"",displayName:"",bio:"",avatar:"",showEmail:!1,fontSize:"md",language:"en",region:"US",dateFormat:"MDY",timeFormat:"24",reduceMotion:!1,showAirTraffic:!0,autoBbox:!0,airTrafficInterval:"auto",twoFactor:!1};function Up(){try{return{...qr,...JSON.parse(localStorage.getItem(Xc)||"{}")||{}}}catch{return{...qr}}}const be=gt(Up());function Qc(){try{localStorage.setItem(Xc,JSON.stringify(be))}catch{}}function ed(t){if(!t||typeof t!="object")return!1;for(const i of Object.keys(qr))i in t&&(be[i]=t[i]);return!0}const Vp={sm:15,md:16,lg:18};function ml(t){document.documentElement.style.fontSize=(Vp[t]||16)+"px"}function gl(t){document.documentElement.classList.toggle("reduce-motion",!!t)}function td(t){const i=new Date(t),s=i.getFullYear(),l=String(i.getMonth()+1).padStart(2,"0"),u=String(i.getDate()).padStart(2,"0");let f;switch(be.dateFormat){case"DMY":f=`${u}/${l}/${s}`;break;case"YMD":f=`${s}/${l}/${u}`;break;case"ISO":f=`${s}-${l}-${u}`;break;default:f=`${l}/${u}/${s}`}let h;return be.timeFormat==="12"?h=i.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0}):h=`${String(i.getHours()).padStart(2,"0")}:${String(i.getMinutes()).padStart(2,"0")}:${String(i.getSeconds()).padStart(2,"0")}`,{date:f,time:h}}function ku(t){return td(t).time}function Su(t){const i=td(t);return`${i.date} ${i.time}`}let vl=!1,Yr=!1,Jr=null;function Zp(){return{...JSON.parse(JSON.stringify(be)),themeMode:Oo.value}}function _l(){!vl||Yr||(clearTimeout(Jr),Jr=setTimeout(()=>{fp(Zp())},600))}function Hp(t){Yr=!0;try{ed(t),t.themeMode&&Ha(t.themeMode),ml(be.fontSize),gl(be.reduceMotion),Qc()}finally{Yr=!1}}async function Tu(){vl=!0;const t=await dp();t&&Object.keys(t).length?Hp(t):_l()}function jp(){vl=!1,clearTimeout(Jr)}Bt(be,()=>{Qc(),_l()},{deep:!0});Bt(Oo,_l);Bt(()=>be.fontSize,ml,{immediate:!0});Bt(()=>be.reduceMotion,gl,{immediate:!0});const Wp=["width","height"],nd={__name:"BrandMark",props:{size:{type:[Number,String],default:28}},setup(t){return(i,s)=>(p(),m("svg",{width:t.size,height:t.size,viewBox:"0 0 48 48",fill:"none","aria-hidden":"true"},[...s[0]||(s[0]=[a("g",{"stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"},[a("polyline",{points:"8,30 19,17 30,30",stroke:"var(--accent)"}),a("polyline",{points:"18,33 29,20 40,33",stroke:"currentColor"})],-1)])],8,Wp))}},Kp=["title","aria-label"],Gp={key:0,width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},qp={key:1,width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Yp={__name:"ThemeToggle",setup(t){return(i,s)=>(p(),m("button",{class:"btn-icon",type:"button",title:$e(ss)==="dark"?"Switch to light":"Switch to dark","aria-label":$e(ss)==="dark"?"Switch to light theme":"Switch to dark theme",onClick:s[0]||(s[0]=(...l)=>$e(vu)&&$e(vu)(...l))},[$e(ss)==="dark"?(p(),m("svg",Gp,[...s[1]||(s[1]=[a("circle",{cx:"12",cy:"12",r:"4"},null,-1),a("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"},null,-1)])])):(p(),m("svg",qp,[...s[2]||(s[2]=[a("path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"},null,-1)])]))],8,Kp))}},Jp={class:"relative grid h-full place-items-center p-5"},Xp={class:"absolute right-5 top-5"},Qp={class:"mb-6 flex items-center gap-3 text-ink"},em={class:"relative mb-1"},tm=["type"],nm=["aria-label","title"],im={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-[18px] w-[18px]"},om={key:1,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-[18px] w-[18px]"},sm={key:0,class:"mt-4"},am={key:1,class:"mt-4 rounded border border-line bg-danger-soft px-3 py-2 text-sm text-danger-fg"},rm=["disabled"],lm={__name:"LoginView",props:{defaultApiBase:{type:String,default:""}},emits:["signed-in"],setup(t,{emit:i}){const s=t,l=i,u=Y(""),f=Y(""),h=Y(localStorage.getItem("api_url")||s.defaultApiBase||"http://localhost:8080"),_=Y(!1),b=Y(!1),C=Y(!1),T=Y("");async function M(){C.value=!0,T.value="",localStorage.setItem("api_url",h.value.trim());const{ok:H,status:j,body:G}=await ep(u.value.trim(),f.value,h.value.trim());if(C.value=!1,H){l("signed-in",G.email);return}T.value=j===400?"Invalid email or password.":j===502?"API server can't reach PocketBase.":G.message||G.error||"Cannot reach the API server."}return(H,j)=>(p(),m("div",Jp,[a("div",Xp,[A(Yp)]),a("form",{class:"panel w-[380px] p-8 shadow-md",onSubmit:hl(M,["prevent"])},[a("div",Qp,[A(nd,{size:34}),j[5]||(j[5]=a("div",{class:"leading-tight"},[a("div",{class:"text-mode"},"PilotVault"),a("div",{class:"eyebrow mt-0.5"},"Control panel")],-1))]),j[9]||(j[9]=a("label",{class:"eyebrow mb-1.5 block"},"Email",-1)),ie(a("input",{"onUpdate:modelValue":j[0]||(j[0]=G=>u.value=G),type:"email",autocomplete:"username",required:"",class:"field mb-4",placeholder:"you@example.com"},null,512),[[me,u.value]]),j[10]||(j[10]=a("label",{class:"eyebrow mb-1.5 block"},"Password",-1)),a("div",em,[ie(a("input",{"onUpdate:modelValue":j[1]||(j[1]=G=>f.value=G),type:b.value?"text":"password",autocomplete:"current-password",required:"",class:"field w-full pr-10",placeholder:"••••••••"},null,8,tm),[[Vh,f.value]]),a("button",{type:"button",class:"absolute inset-y-0 right-0 grid w-10 place-items-center text-ink-muted transition hover:text-ink-secondary","aria-label":b.value?"Hide password":"Show password",title:b.value?"Hide password":"Show password",onClick:j[2]||(j[2]=G=>b.value=!b.value)},[b.value?(p(),m("svg",im,[...j[6]||(j[6]=[a("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"},null,-1),a("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1)])])):(p(),m("svg",om,[...j[7]||(j[7]=[a("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1),a("circle",{cx:"12",cy:"12",r:"3"},null,-1)])]))],8,nm)]),_.value?(p(),m("div",sm,[j[8]||(j[8]=a("label",{class:"eyebrow mb-1.5 block"},"API Server",-1)),ie(a("input",{"onUpdate:modelValue":j[3]||(j[3]=G=>h.value=G),type:"text",class:"field font-mono",placeholder:"10.2.1.101:8080"},null,512),[[me,h.value]])])):I("",!0),T.value?(p(),m("p",am,x(T.value),1)):I("",!0),a("button",{type:"submit",class:"btn-accent mt-6 w-full",disabled:C.value},x(C.value?"Signing in…":"Sign in"),9,rm),a("button",{type:"button",class:"mx-auto mt-3 block text-xs text-ink-muted transition hover:text-ink-secondary",onClick:j[4]||(j[4]=G=>_.value=!_.value)},x(_.value?"Hide server settings":"Server settings"),1)],32)]))}};function um(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Ds={exports:{}};/* @preserve + * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com + * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */var cm=Ds.exports,Pu;function dm(){return Pu||(Pu=1,(function(t,i){(function(s,l){l(i)})(cm,(function(s){var l="1.9.4";function u(e){var n,o,r,d;for(o=1,r=arguments.length;o"u"||!L||!L.Mixin)){e=we(e)?e:[e];for(var n=0;n0?Math.floor(e):Math.ceil(e)};fe.prototype={clone:function(){return new fe(this.x,this.y)},add:function(e){return this.clone()._add(pe(e))},_add:function(e){return this.x+=e.x,this.y+=e.y,this},subtract:function(e){return this.clone()._subtract(pe(e))},_subtract:function(e){return this.x-=e.x,this.y-=e.y,this},divideBy:function(e){return this.clone()._divideBy(e)},_divideBy:function(e){return this.x/=e,this.y/=e,this},multiplyBy:function(e){return this.clone()._multiplyBy(e)},_multiplyBy:function(e){return this.x*=e,this.y*=e,this},scaleBy:function(e){return new fe(this.x*e.x,this.y*e.y)},unscaleBy:function(e){return new fe(this.x/e.x,this.y/e.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=ft(this.x),this.y=ft(this.y),this},distanceTo:function(e){e=pe(e);var n=e.x-this.x,o=e.y-this.y;return Math.sqrt(n*n+o*o)},equals:function(e){return e=pe(e),e.x===this.x&&e.y===this.y},contains:function(e){return e=pe(e),Math.abs(e.x)<=Math.abs(this.x)&&Math.abs(e.y)<=Math.abs(this.y)},toString:function(){return"Point("+H(this.x)+", "+H(this.y)+")"}};function pe(e,n,o){return e instanceof fe?e:we(e)?new fe(e[0],e[1]):e==null?e:typeof e=="object"&&"x"in e&&"y"in e?new fe(e.x,e.y):new fe(e,n,o)}function Ue(e,n){if(e)for(var o=n?[e,n]:e,r=0,d=o.length;r=this.min.x&&o.x<=this.max.x&&n.y>=this.min.y&&o.y<=this.max.y},intersects:function(e){e=Ve(e);var n=this.min,o=this.max,r=e.min,d=e.max,v=d.x>=n.x&&r.x<=o.x,P=d.y>=n.y&&r.y<=o.y;return v&&P},overlaps:function(e){e=Ve(e);var n=this.min,o=this.max,r=e.min,d=e.max,v=d.x>n.x&&r.xn.y&&r.y=n.lat&&d.lat<=o.lat&&r.lng>=n.lng&&d.lng<=o.lng},intersects:function(e){e=st(e);var n=this._southWest,o=this._northEast,r=e.getSouthWest(),d=e.getNorthEast(),v=d.lat>=n.lat&&r.lat<=o.lat,P=d.lng>=n.lng&&r.lng<=o.lng;return v&&P},overlaps:function(e){e=st(e);var n=this._southWest,o=this._northEast,r=e.getSouthWest(),d=e.getNorthEast(),v=d.lat>n.lat&&r.latn.lng&&r.lng1,jn=(function(){var e=!1;try{var n=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("testPassiveEventSupport",M,n),window.removeEventListener("testPassiveEventSupport",M,n)}catch{}return e})(),Z=(function(){return!!document.createElement("canvas").getContext})(),E=!!(document.createElementNS&&q("svg").createSVGRect),Oe=!!E&&(function(){var e=document.createElement("div");return e.innerHTML="",(e.firstChild&&e.firstChild.namespaceURI)==="http://www.w3.org/2000/svg"})(),tt=!E&&(function(){try{var e=document.createElement("div");e.innerHTML='';var n=e.firstChild;return n.style.behavior="url(#default#VML)",n&&typeof n.adj=="object"}catch{return!1}})(),It=navigator.platform.indexOf("Mac")===0,St=navigator.platform.indexOf("Linux")===0;function Et(e){return navigator.userAgent.toLowerCase().indexOf(e)>=0}var K={ie:ce,ielt9:le,edge:se,webkit:te,android:ve,android23:re,androidStock:Ae,opera:Re,chrome:Ke,gecko:Ge,safari:pt,phantom:ht,opera12:Vt,win:Jt,ie3d:Zt,webkit3d:pn,gecko3d:Ct,any3d:$t,mobile:kn,mobileWebkit:zi,mobileWebkit3d:at,msPointer:Sn,pointer:$i,touch:hi,touchNative:rt,mobileOpera:pi,mobileGecko:Ii,retina:Gt,passiveEvents:jn,canvas:Z,svg:E,vml:tt,inlineSvg:Oe,mac:It,linux:St},_t=K.msPointer?"MSPointerDown":"pointerdown",bt=K.msPointer?"MSPointerMove":"pointermove",oa=K.msPointer?"MSPointerUp":"pointerup",cs=K.msPointer?"MSPointerCancel":"pointercancel",no={touchstart:_t,touchmove:bt,touchend:oa,touchcancel:cs},sa={touchstart:ds,touchmove:Wn,touchend:Wn,touchcancel:Wn},Ni={},aa=!1;function ir(e,n,o){return n==="touchstart"&<(),sa[n]?(o=sa[n].bind(this,o),e.addEventListener(no[n],o,!1),o):(console.warn("wrong event specified:",n),M)}function ra(e,n,o){if(!no[n]){console.warn("wrong event specified:",n);return}e.removeEventListener(no[n],o,!1)}function or(e){Ni[e.pointerId]=e}function sr(e){Ni[e.pointerId]&&(Ni[e.pointerId]=e)}function la(e){delete Ni[e.pointerId]}function lt(){aa||(document.addEventListener(_t,or,!0),document.addEventListener(bt,sr,!0),document.addEventListener(oa,la,!0),document.addEventListener(cs,la,!0),aa=!0)}function Wn(e,n){if(n.pointerType!==(n.MSPOINTER_TYPE_MOUSE||"mouse")){n.touches=[];for(var o in Ni)n.touches.push(Ni[o]);n.changedTouches=[n],e(n)}}function ds(e,n){n.MSPOINTER_TYPE_TOUCH&&n.pointerType===n.MSPOINTER_TYPE_TOUCH&&Dt(n),Wn(e,n)}function Xt(e){var n={},o,r;for(r in e)o=e[r],n[r]=o&&o.bind?o.bind(e):o;return e=n,n.type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}var io=200;function zo(e,n){e.addEventListener("dblclick",n);var o=0,r;function d(v){if(v.detail!==1){r=v.detail;return}if(!(v.pointerType==="mouse"||v.sourceCapabilities&&!v.sourceCapabilities.firesTouchEvents)){var P=da(v);if(!(P.some(function(B){return B instanceof HTMLLabelElement&&B.attributes.for})&&!P.some(function(B){return B instanceof HTMLInputElement||B instanceof HTMLSelectElement}))){var D=Date.now();D-o<=io?(r++,r===2&&n(Xt(v))):r=1,o=D}}}return e.addEventListener("click",d),{dblclick:n,simDblclick:d}}function $o(e,n){e.removeEventListener("dblclick",n.dblclick),e.removeEventListener("click",n.simDblclick)}var Tn=Do(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),$n=Do(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ua=$n==="webkitTransition"||$n==="OTransition"?$n+"End":"transitionend";function Io(e){return typeof e=="string"?document.getElementById(e):e}function mi(e,n){var o=e.style[n]||e.currentStyle&&e.currentStyle[n];if((!o||o==="auto")&&document.defaultView){var r=document.defaultView.getComputedStyle(e,null);o=r?r[n]:null}return o==="auto"?null:o}function it(e,n,o){var r=document.createElement(e);return r.className=n||"",o&&o.appendChild(r),r}function ot(e){var n=e.parentNode;n&&n.removeChild(e)}function Pn(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function Cn(e){var n=e.parentNode;n&&n.lastChild!==e&&n.appendChild(e)}function qt(e){var n=e.parentNode;n&&n.firstChild!==e&&n.insertBefore(e,n.firstChild)}function No(e,n){if(e.classList!==void 0)return e.classList.contains(n);var o=Fo(e);return o.length>0&&new RegExp("(^|\\s)"+n+"(\\s|$)").test(o)}function He(e,n){if(e.classList!==void 0)for(var o=G(n),r=0,d=o.length;r0?2*window.devicePixelRatio:1;function fa(e){return K.edge?e.wheelDeltaY/2:e.deltaY&&e.deltaMode===0?-e.deltaY/vs:e.deltaY&&e.deltaMode===1?-e.deltaY*20:e.deltaY&&e.deltaMode===2?-e.deltaY*60:e.deltaX||e.deltaZ?0:e.wheelDelta?(e.wheelDeltaY||e.wheelDelta)/2:e.detail&&Math.abs(e.detail)<32765?-e.detail*20:e.detail?e.detail/-32765*60:0}function Ee(e,n){var o=n.relatedTarget;if(!o)return!0;try{for(;o&&o!==e;)o=o.parentNode}catch{return!1}return o!==e}var Vi={__proto__:null,on:Ie,off:Je,stopPropagation:_i,disableScrollPropagation:gs,disableClickPropagation:Bi,preventDefault:Dt,stop:bi,getPropagationPath:da,getMousePosition:Ui,getWheelDelta:fa,isExternalTarget:Ee,addListener:Ie,removeListener:Je},so=ge.extend({run:function(e,n,o,r){this.stop(),this._el=e,this._inProgress=!0,this._duration=o||.25,this._easeOutPower=1/Math.max(r||.5,.2),this._startPos=Xe(e),this._offset=n.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=V(this._animate,this),this._step()},_step:function(e){var n=+new Date-this._startTime,o=this._duration*1e3;nthis.options.maxZoom)?this.setZoom(e):this},panInsideBounds:function(e,n){this._enforcingBounds=!0;var o=this.getCenter(),r=this._limitCenter(o,this._zoom,st(e));return o.equals(r)||this.panTo(r,n),this._enforcingBounds=!1,this},panInside:function(e,n){n=n||{};var o=pe(n.paddingTopLeft||n.padding||[0,0]),r=pe(n.paddingBottomRight||n.padding||[0,0]),d=this.project(this.getCenter()),v=this.project(e),P=this.getPixelBounds(),D=Ve([P.min.add(o),P.max.subtract(r)]),B=D.getSize();if(!D.contains(v)){this._enforcingBounds=!0;var ne=v.subtract(D.getCenter()),_e=D.extend(v).getSize().subtract(B);d.x+=ne.x<0?-_e.x:_e.x,d.y+=ne.y<0?-_e.y:_e.y,this.panTo(this.unproject(d),n),this._enforcingBounds=!1}return this},invalidateSize:function(e){if(!this._loaded)return this;e=u({animate:!1,pan:!0},e===!0?{animate:!0}:e);var n=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),r=n.divideBy(2).round(),d=o.divideBy(2).round(),v=r.subtract(d);return!v.x&&!v.y?this:(e.animate&&e.pan?this.panBy(v):(e.pan&&this._rawPanBy(v),this.fire("move"),e.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(h(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:n,newSize:o}))},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(e){if(e=this._locateOptions=u({timeout:1e4,watch:!1},e),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var n=h(this._handleGeolocationResponse,this),o=h(this._handleGeolocationError,this);return e.watch?this._locationWatchId=navigator.geolocation.watchPosition(n,o,e):navigator.geolocation.getCurrentPosition(n,o,e),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(e){if(this._container._leaflet_id){var n=e.code,o=e.message||(n===1?"permission denied":n===2?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:n,message:"Geolocation error: "+o+"."})}},_handleGeolocationResponse:function(e){if(this._container._leaflet_id){var n=e.coords.latitude,o=e.coords.longitude,r=new Me(n,o),d=r.toBounds(e.coords.accuracy*2),v=this._locateOptions;if(v.setView){var P=this.getBoundsZoom(d);this.setView(r,v.maxZoom?Math.min(P,v.maxZoom):P)}var D={latlng:r,bounds:d,timestamp:e.timestamp};for(var B in e.coords)typeof e.coords[B]=="number"&&(D[B]=e.coords[B]);this.fire("locationfound",D)}},addHandler:function(e,n){if(!n)return this;var o=this[e]=new n(this);return this._handlers.push(o),this.options[e]&&o.enable(),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch{this._container._leaflet_id=void 0,this._containerId=void 0}this._locationWatchId!==void 0&&this.stopLocate(),this._stop(),ot(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(O(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload");var e;for(e in this._layers)this._layers[e].remove();for(e in this._panes)ot(this._panes[e]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(e,n){var o="leaflet-pane"+(e?" leaflet-"+e.replace("Pane","")+"-pane":""),r=it("div",o,n||this._mapPane);return e&&(this._panes[e]=r),r},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var e=this.getPixelBounds(),n=this.unproject(e.getBottomLeft()),o=this.unproject(e.getTopRight());return new wt(n,o)},getMinZoom:function(){return this.options.minZoom===void 0?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===void 0?this._layersMaxZoom===void 0?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(e,n,o){e=st(e),o=pe(o||[0,0]);var r=this.getZoom()||0,d=this.getMinZoom(),v=this.getMaxZoom(),P=e.getNorthWest(),D=e.getSouthEast(),B=this.getSize().subtract(o),ne=Ve(this.project(D,r),this.project(P,r)).getSize(),_e=K.any3d?this.options.zoomSnap:1,Fe=B.x/ne.x,et=B.y/ne.y,un=n?Math.max(Fe,et):Math.min(Fe,et);return r=this.getScaleZoom(un,r),_e&&(r=Math.round(r/(_e/100))*(_e/100),r=n?Math.ceil(r/_e)*_e:Math.floor(r/_e)*_e),Math.max(d,Math.min(v,r))},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new fe(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(e,n){var o=this._getTopLeftPoint(e,n);return new Ue(o,o.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(e){return this.options.crs.getProjectedBounds(e===void 0?this.getZoom():e)},getPane:function(e){return typeof e=="string"?this._panes[e]:e},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(e,n){var o=this.options.crs;return n=n===void 0?this._zoom:n,o.scale(e)/o.scale(n)},getScaleZoom:function(e,n){var o=this.options.crs;n=n===void 0?this._zoom:n;var r=o.zoom(e*o.scale(n));return isNaN(r)?1/0:r},project:function(e,n){return n=n===void 0?this._zoom:n,this.options.crs.latLngToPoint(De(e),n)},unproject:function(e,n){return n=n===void 0?this._zoom:n,this.options.crs.pointToLatLng(pe(e),n)},layerPointToLatLng:function(e){var n=pe(e).add(this.getPixelOrigin());return this.unproject(n)},latLngToLayerPoint:function(e){var n=this.project(De(e))._round();return n._subtract(this.getPixelOrigin())},wrapLatLng:function(e){return this.options.crs.wrapLatLng(De(e))},wrapLatLngBounds:function(e){return this.options.crs.wrapLatLngBounds(st(e))},distance:function(e,n){return this.options.crs.distance(De(e),De(n))},containerPointToLayerPoint:function(e){return pe(e).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(e){return pe(e).add(this._getMapPanePos())},containerPointToLatLng:function(e){var n=this.containerPointToLayerPoint(pe(e));return this.layerPointToLatLng(n)},latLngToContainerPoint:function(e){return this.layerPointToContainerPoint(this.latLngToLayerPoint(De(e)))},mouseEventToContainerPoint:function(e){return Ui(e,this._container)},mouseEventToLayerPoint:function(e){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e))},mouseEventToLatLng:function(e){return this.layerPointToLatLng(this.mouseEventToLayerPoint(e))},_initContainer:function(e){var n=this._container=Io(e);if(n){if(n._leaflet_id)throw new Error("Map container is already initialized.")}else throw new Error("Map container not found.");Ie(n,"scroll",this._onScroll,this),this._containerId=b(n)},_initLayout:function(){var e=this._container;this._fadeAnimated=this.options.fadeAnimation&&K.any3d,He(e,"leaflet-container"+(K.touch?" leaflet-touch":"")+(K.retina?" leaflet-retina":"")+(K.ielt9?" leaflet-oldie":"")+(K.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var n=mi(e,"position");n!=="absolute"&&n!=="relative"&&n!=="fixed"&&n!=="sticky"&&(e.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var e=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Mt(this._mapPane,new fe(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(He(e.markerPane,"leaflet-zoom-hide"),He(e.shadowPane,"leaflet-zoom-hide"))},_resetView:function(e,n,o){Mt(this._mapPane,new fe(0,0));var r=!this._loaded;this._loaded=!0,n=this._limitZoom(n),this.fire("viewprereset");var d=this._zoom!==n;this._moveStart(d,o)._move(e,n)._moveEnd(d),this.fire("viewreset"),r&&this.fire("load")},_moveStart:function(e,n){return e&&this.fire("zoomstart"),n||this.fire("movestart"),this},_move:function(e,n,o,r){n===void 0&&(n=this._zoom);var d=this._zoom!==n;return this._zoom=n,this._lastCenter=e,this._pixelOrigin=this._getNewPixelOrigin(e),r?o&&o.pinch&&this.fire("zoom",o):((d||o&&o.pinch)&&this.fire("zoom",o),this.fire("move",o)),this},_moveEnd:function(e){return e&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return O(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(e){Mt(this._mapPane,this._getMapPanePos().subtract(e))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){this._targets={},this._targets[b(this._container)]=this;var n=e?Je:Ie;n(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&n(window,"resize",this._onResize,this),K.any3d&&this.options.transform3DLimit&&(e?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){O(this._resizeRequest),this._resizeRequest=V(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var e=this._getMapPanePos();Math.max(Math.abs(e.x),Math.abs(e.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(e,n){for(var o=[],r,d=n==="mouseout"||n==="mouseover",v=e.target||e.srcElement,P=!1;v;){if(r=this._targets[b(v)],r&&(n==="click"||n==="preclick")&&this._draggableMoved(r)){P=!0;break}if(r&&r.listens(n,!0)&&(d&&!Ee(v,e)||(o.push(r),d))||v===this._container)break;v=v.parentNode}return!o.length&&!P&&!d&&this.listens(n,!0)&&(o=[this]),o},_isClickDisabled:function(e){for(;e&&e!==this._container;){if(e._leaflet_disable_click)return!0;e=e.parentNode}},_handleDOMEvent:function(e){var n=e.target||e.srcElement;if(!(!this._loaded||n._leaflet_disable_events||e.type==="click"&&this._isClickDisabled(n))){var o=e.type;o==="mousedown"&&Ro(n),this._fireDOMEvent(e,o)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(e,n,o){if(e.type==="click"){var r=u({},e);r.type="preclick",this._fireDOMEvent(r,r.type,o)}var d=this._findEventTargets(e,n);if(o){for(var v=[],P=0;P0?Math.round(e-n)/2:Math.max(0,Math.ceil(e))-Math.max(0,Math.floor(n))},_limitZoom:function(e){var n=this.getMinZoom(),o=this.getMaxZoom(),r=K.any3d?this.options.zoomSnap:1;return r&&(e=Math.round(e/r)*r),Math.max(n,Math.min(o,e))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){Lt(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(e,n){var o=this._getCenterOffset(e)._trunc();return(n&&n.animate)!==!0&&!this.getSize().contains(o)?!1:(this.panBy(o,n),!0)},_createAnimProxy:function(){var e=this._proxy=it("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(e),this.on("zoomanim",function(n){var o=Tn,r=this._proxy.style[o];gi(this._proxy,this.project(n.center,n.zoom),this.getZoomScale(n.zoom,1)),r===this._proxy.style[o]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ot(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var e=this.getCenter(),n=this.getZoom();gi(this._proxy,this.project(e,n),this.getZoomScale(n,1))},_catchTransitionEnd:function(e){this._animatingZoom&&e.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(e,n,o){if(this._animatingZoom)return!0;if(o=o||{},!this._zoomAnimated||o.animate===!1||this._nothingToAnimate()||Math.abs(n-this._zoom)>this.options.zoomAnimationThreshold)return!1;var r=this.getZoomScale(n),d=this._getCenterOffset(e)._divideBy(1-1/r);return o.animate!==!0&&!this.getSize().contains(d)?!1:(V(function(){this._moveStart(!0,o.noMoveStart||!1)._animateZoom(e,n,!0)},this),!0)},_animateZoom:function(e,n,o,r){this._mapPane&&(o&&(this._animatingZoom=!0,this._animateToCenter=e,this._animateToZoom=n,He(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:e,zoom:n,noUpdate:r}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(h(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&Lt(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Vo(e,n){return new qe(e,n)}var en=$.extend({options:{position:"topright"},initialize:function(e){N(this,e)},getPosition:function(){return this.options.position},setPosition:function(e){var n=this._map;return n&&n.removeControl(this),this.options.position=e,n&&n.addControl(this),this},getContainer:function(){return this._container},addTo:function(e){this.remove(),this._map=e;var n=this._container=this.onAdd(e),o=this.getPosition(),r=e._controlCorners[o];return He(n,"leaflet-control"),o.indexOf("bottom")!==-1?r.insertBefore(n,r.firstChild):r.appendChild(n),this._map.on("unload",this.remove,this),this},remove:function(){return this._map?(ot(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null,this):this},_refocusOnMap:function(e){this._map&&e&&e.screenX>0&&e.screenY>0&&this._map.getContainer().focus()}}),ln=function(e){return new en(e)};qe.include({addControl:function(e){return e.addTo(this),this},removeControl:function(e){return e.remove(),this},_initControlPos:function(){var e=this._controlCorners={},n="leaflet-",o=this._controlContainer=it("div",n+"control-container",this._container);function r(d,v){var P=n+d+" "+n+v;e[d+v]=it("div",P,o)}r("top","left"),r("top","right"),r("bottom","left"),r("bottom","right")},_clearControlPos:function(){for(var e in this._controlCorners)ot(this._controlCorners[e]);ot(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var yi=en.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(e,n,o,r){return o1,this._baseLayersList.style.display=e?"":"none"),this._separator.style.display=n&&e?"":"none",this},_onLayerChange:function(e){this._handlingClick||this._update();var n=this._getLayer(b(e.target)),o=n.overlay?e.type==="add"?"overlayadd":"overlayremove":e.type==="add"?"baselayerchange":null;o&&this._map.fire(o,n)},_createRadioElement:function(e,n){var o='",r=document.createElement("div");return r.innerHTML=o,r.firstChild},_addItem:function(e){var n=document.createElement("label"),o=this._map.hasLayer(e.layer),r;e.overlay?(r=document.createElement("input"),r.type="checkbox",r.className="leaflet-control-layers-selector",r.defaultChecked=o):r=this._createRadioElement("leaflet-base-layers_"+b(this),o),this._layerControlInputs.push(r),r.layerId=b(e.layer),Ie(r,"click",this._onInputClick,this);var d=document.createElement("span");d.innerHTML=" "+e.name;var v=document.createElement("span");n.appendChild(v),v.appendChild(r),v.appendChild(d);var P=e.overlay?this._overlaysList:this._baseLayersList;return P.appendChild(n),this._checkDisabledLayers(),n},_onInputClick:function(){if(!this._preventClick){var e=this._layerControlInputs,n,o,r=[],d=[];this._handlingClick=!0;for(var v=e.length-1;v>=0;v--)n=e[v],o=this._getLayer(n.layerId).layer,n.checked?r.push(o):n.checked||d.push(o);for(v=0;v=0;d--)n=e[d],o=this._getLayer(n.layerId).layer,n.disabled=o.options.minZoom!==void 0&&ro.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var e=this._section;this._preventClick=!0,Ie(e,"click",Dt),this.expand();var n=this;setTimeout(function(){Je(e,"click",Dt),n._preventClick=!1})}}),ao=function(e,n,o){return new yi(e,n,o)},Zo=en.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(e){var n="leaflet-control-zoom",o=it("div",n+" leaflet-bar"),r=this.options;return this._zoomInButton=this._createButton(r.zoomInText,r.zoomInTitle,n+"-in",o,this._zoomIn),this._zoomOutButton=this._createButton(r.zoomOutText,r.zoomOutTitle,n+"-out",o,this._zoomOut),this._updateDisabled(),e.on("zoomend zoomlevelschange",this._updateDisabled,this),o},onRemove:function(e){e.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(e){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(e.shiftKey?3:1))},_createButton:function(e,n,o,r,d){var v=it("a",o,r);return v.innerHTML=e,v.href="#",v.title=n,v.setAttribute("role","button"),v.setAttribute("aria-label",n),Bi(v),Ie(v,"click",bi),Ie(v,"click",d,this),Ie(v,"click",this._refocusOnMap,this),v},_updateDisabled:function(){var e=this._map,n="leaflet-disabled";Lt(this._zoomInButton,n),Lt(this._zoomOutButton,n),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),(this._disabled||e._zoom===e.getMinZoom())&&(He(this._zoomOutButton,n),this._zoomOutButton.setAttribute("aria-disabled","true")),(this._disabled||e._zoom===e.getMaxZoom())&&(He(this._zoomInButton,n),this._zoomInButton.setAttribute("aria-disabled","true"))}});qe.mergeOptions({zoomControl:!0}),qe.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Zo,this.addControl(this.zoomControl))});var _s=function(e){return new Zo(e)},Ho=en.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(e){var n="leaflet-control-scale",o=it("div",n),r=this.options;return this._addScales(r,n+"-line",o),e.on(r.updateWhenIdle?"moveend":"move",this._update,this),e.whenReady(this._update,this),o},onRemove:function(e){e.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(e,n,o){e.metric&&(this._mScale=it("div",n,o)),e.imperial&&(this._iScale=it("div",n,o))},_update:function(){var e=this._map,n=e.getSize().y/2,o=e.distance(e.containerPointToLatLng([0,n]),e.containerPointToLatLng([this.options.maxWidth,n]));this._updateScales(o)},_updateScales:function(e){this.options.metric&&e&&this._updateMetric(e),this.options.imperial&&e&&this._updateImperial(e)},_updateMetric:function(e){var n=this._getRoundNum(e),o=n<1e3?n+" m":n/1e3+" km";this._updateScale(this._mScale,o,n/e)},_updateImperial:function(e){var n=e*3.2808399,o,r,d;n>5280?(o=n/5280,r=this._getRoundNum(o),this._updateScale(this._iScale,r+" mi",r/o)):(d=this._getRoundNum(n),this._updateScale(this._iScale,d+" ft",d/n))},_updateScale:function(e,n,o){e.style.width=Math.round(this.options.maxWidth*o)+"px",e.innerHTML=n},_getRoundNum:function(e){var n=Math.pow(10,(Math.floor(e)+"").length-1),o=e/n;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,n*o}}),ar=function(e){return new Ho(e)},gn='',Zi=en.extend({options:{position:"bottomright",prefix:''+(K.inlineSvg?gn+" ":"")+"Leaflet"},initialize:function(e){N(this,e),this._attributions={}},onAdd:function(e){e.attributionControl=this,this._container=it("div","leaflet-control-attribution"),Bi(this._container);for(var n in e._layers)e._layers[n].getAttribution&&this.addAttribution(e._layers[n].getAttribution());return this._update(),e.on("layeradd",this._addAttribution,this),this._container},onRemove:function(e){e.off("layeradd",this._addAttribution,this)},_addAttribution:function(e){e.layer.getAttribution&&(this.addAttribution(e.layer.getAttribution()),e.layer.once("remove",function(){this.removeAttribution(e.layer.getAttribution())},this))},setPrefix:function(e){return this.options.prefix=e,this._update(),this},addAttribution:function(e){return e?(this._attributions[e]||(this._attributions[e]=0),this._attributions[e]++,this._update(),this):this},removeAttribution:function(e){return e?(this._attributions[e]&&(this._attributions[e]--,this._update()),this):this},_update:function(){if(this._map){var e=[];for(var n in this._attributions)this._attributions[n]&&e.push(n);var o=[];this.options.prefix&&o.push(this.options.prefix),e.length&&o.push(e.join(", ")),this._container.innerHTML=o.join(' ')}}});qe.mergeOptions({attributionControl:!0}),qe.addInitHook(function(){this.options.attributionControl&&new Zi().addTo(this)});var ha=function(e){return new Zi(e)};en.Layers=yi,en.Zoom=Zo,en.Scale=Ho,en.Attribution=Zi,ln.layers=ao,ln.zoom=_s,ln.scale=ar,ln.attribution=ha;var An=$.extend({initialize:function(e){this._map=e},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});An.addTo=function(e,n){return e.addHandler(n,this),this};var rr={Events:Se},bs=K.touch?"touchstart mousedown":"mousedown",vn=ge.extend({options:{clickTolerance:3},initialize:function(e,n,o,r){N(this,r),this._element=e,this._dragStartTarget=n||e,this._preventOutline=o},enable:function(){this._enabled||(Ie(this._dragStartTarget,bs,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(vn._dragging===this&&this.finishDrag(!0),Je(this._dragStartTarget,bs,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(e){if(this._enabled&&(this._moved=!1,!No(this._element,"leaflet-zoom-anim"))){if(e.touches&&e.touches.length!==1){vn._dragging===this&&this.finishDrag();return}if(!(vn._dragging||e.shiftKey||e.which!==1&&e.button!==1&&!e.touches)&&(vn._dragging=this,this._preventOutline&&Ro(this._element),Fi(),In(),!this._moving)){this.fire("down");var n=e.touches?e.touches[0]:e,o=Bo(this._element);this._startPoint=new fe(n.clientX,n.clientY),this._startPos=Xe(this._element),this._parentScale=hs(o);var r=e.type==="mousedown";Ie(document,r?"mousemove":"touchmove",this._onMove,this),Ie(document,r?"mouseup":"touchend touchcancel",this._onUp,this)}}},_onMove:function(e){if(this._enabled){if(e.touches&&e.touches.length>1){this._moved=!0;return}var n=e.touches&&e.touches.length===1?e.touches[0]:e,o=new fe(n.clientX,n.clientY)._subtract(this._startPoint);!o.x&&!o.y||Math.abs(o.x)+Math.abs(o.y)v&&(P=D,v=B);v>o&&(n[P]=1,ws(e,n,o,r,P),ws(e,n,o,P,d))}function va(e,n){for(var o=[e[0]],r=1,d=0,v=e.length;rn&&(o.push(e[r]),d=r);return dn.max.x&&(o|=2),e.yn.max.y&&(o|=8),o}function ks(e,n){var o=n.x-e.x,r=n.y-e.y;return o*o+r*r}function We(e,n,o,r){var d=n.x,v=n.y,P=o.x-d,D=o.y-v,B=P*P+D*D,ne;return B>0&&(ne=((e.x-d)*P+(e.y-v)*D)/B,ne>1?(d=o.x,v=o.y):ne>0&&(d+=P*ne,v+=D*ne)),P=e.x-d,D=e.y-v,r?P*P+D*D:new fe(d,v)}function yt(e){return!we(e[0])||typeof e[0][0]!="object"&&typeof e[0][0]<"u"}function xi(e){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),yt(e)}function Ss(e,n){var o,r,d,v,P,D,B,ne;if(!e||e.length===0)throw new Error("latlngs not passed");yt(e)||(console.warn("latlngs are not flat! Only the first ring will be used"),e=e[0]);var _e=De([0,0]),Fe=st(e),et=Fe.getNorthWest().distanceTo(Fe.getSouthWest())*Fe.getNorthEast().distanceTo(Fe.getNorthWest());et<1700&&(_e=ys(e));var un=e.length,Wt=[];for(o=0;or){B=(v-r)/d,ne=[D.x-B*(D.x-P.x),D.y-B*(D.y-P.y)];break}var xn=n.unproject(pe(ne));return De([xn.lat+_e.lat,xn.lng+_e.lng])}var dr={__proto__:null,simplify:xs,pointToSegmentDistance:ga,closestPointOnSegment:ur,clipSegment:jo,_getEdgeIntersection:Hi,_getBitCode:Nn,_sqClosestPointOnSegment:We,isFlat:yt,_flat:xi,polylineCenter:Ss},ro={project:function(e){return new fe(e.lng,e.lat)},unproject:function(e){return new Me(e.y,e.x)},bounds:new Ue([-180,-90],[180,90])},Ts={R:6378137,R_MINOR:6356752314245179e-9,bounds:new Ue([-2003750834279e-5,-1549657073972e-5],[2003750834279e-5,1876465623138e-5]),project:function(e){var n=Math.PI/180,o=this.R,r=e.lat*n,d=this.R_MINOR/o,v=Math.sqrt(1-d*d),P=v*Math.sin(r),D=Math.tan(Math.PI/4-r/2)/Math.pow((1-P)/(1+P),v/2);return r=-o*Math.log(Math.max(D,1e-10)),new fe(e.lng*n*o,r)},unproject:function(e){for(var n=180/Math.PI,o=this.R,r=this.R_MINOR/o,d=Math.sqrt(1-r*r),v=Math.exp(-e.y/o),P=Math.PI/2-2*Math.atan(v),D=0,B=.1,ne;D<15&&Math.abs(B)>1e-7;D++)ne=d*Math.sin(P),ne=Math.pow((1-ne)/(1+ne),d/2),B=Math.PI/2-2*Math.atan(v*ne)-P,P+=B;return new Me(P*n,e.x*n/o)}},fr={__proto__:null,LonLat:ro,Mercator:Ts,SphericalMercator:Pt},hr=u({},At,{code:"EPSG:3395",projection:Ts,transformation:(function(){var e=.5/(Math.PI*Ts.R);return w(e,.5,-e,.5)})()}),ba=u({},At,{code:"EPSG:4326",projection:ro,transformation:w(1/180,1,-1/180,.5)}),lo=u({},zt,{projection:ro,transformation:w(1,0,-1,0),scale:function(e){return Math.pow(2,e)},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,n){var o=n.lng-e.lng,r=n.lat-e.lat;return Math.sqrt(o*o+r*r)},infinite:!0});zt.Earth=At,zt.EPSG3395=hr,zt.EPSG3857=y,zt.EPSG900913=S,zt.EPSG4326=ba,zt.Simple=lo;var _n=ge.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(e){return e.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(e){return e&&e.removeLayer(this),this},getPane:function(e){return this._map.getPane(e?this.options[e]||e:this.options.pane)},addInteractiveTarget:function(e){return this._map._targets[b(e)]=this,this},removeInteractiveTarget:function(e){return delete this._map._targets[b(e)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(e){var n=e.target;if(n.hasLayer(this)){if(this._map=n,this._zoomAnimated=n._zoomAnimated,this.getEvents){var o=this.getEvents();n.on(o,this),this.once("remove",function(){n.off(o,this)},this)}this.onAdd(n),this.fire("add"),n.fire("layeradd",{layer:this})}}});qe.include({addLayer:function(e){if(!e._layerAdd)throw new Error("The provided object is not a Layer.");var n=b(e);return this._layers[n]?this:(this._layers[n]=e,e._mapToAdd=this,e.beforeAdd&&e.beforeAdd(this),this.whenReady(e._layerAdd,e),this)},removeLayer:function(e){var n=b(e);return this._layers[n]?(this._loaded&&e.onRemove(this),delete this._layers[n],this._loaded&&(this.fire("layerremove",{layer:e}),e.fire("remove")),e._map=e._mapToAdd=null,this):this},hasLayer:function(e){return b(e)in this._layers},eachLayer:function(e,n){for(var o in this._layers)e.call(n,this._layers[o]);return this},_addLayers:function(e){e=e?we(e)?e:[e]:[];for(var n=0,o=e.length;nthis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),this.options.minZoom===void 0&&this._layersMinZoom&&this.getZoom()=2&&n[0]instanceof Me&&n[0].equals(n[o-1])&&n.pop(),n},_setLatLngs:function(e){tn.prototype._setLatLngs.call(this,e),yt(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return yt(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var e=this._renderer._bounds,n=this.options.weight,o=new fe(n,n);if(e=new Ue(e.min.subtract(o),e.max.add(o)),this._parts=[],!(!this._pxBounds||!this._pxBounds.intersects(e))){if(this.options.noClip){this._parts=this._rings;return}for(var r=0,d=this._rings.length,v;re.y!=d.y>e.y&&e.x<(d.x-r.x)*(e.y-r.y)/(d.y-r.y)+r.x&&(n=!n);return n||tn.prototype._containsPoint.call(this,e,!0)}});function ya(e,n){return new Fn(e,n)}var yn=bn.extend({initialize:function(e,n){N(this,n),this._layers={},e&&this.addData(e)},addData:function(e){var n=we(e)?e:e.features,o,r,d;if(n){for(o=0,r=n.length;o0&&d.push(d[0].slice()),d}function Qe(e,n){return e.feature?u({},e.feature,{geometry:n}):En(n)}function En(e){return e.type==="Feature"||e.type==="FeatureCollection"?e:{type:"Feature",properties:{},geometry:e}}var Ki={toGeoJSON:function(e){return Qe(this,{type:"Point",coordinates:Ls(this.getLatLng(),e)})}};Wo.include(Ki),Wi.include(Ki),wi.include(Ki),tn.include({toGeoJSON:function(e){var n=!yt(this._latlngs),o=Go(this._latlngs,n?1:0,!1,e);return Qe(this,{type:(n?"Multi":"")+"LineString",coordinates:o})}}),Fn.include({toGeoJSON:function(e){var n=!yt(this._latlngs),o=n&&!yt(this._latlngs[0]),r=Go(this._latlngs,o?2:n?1:0,!0,e);return n||(r=[r]),Qe(this,{type:(o?"Multi":"")+"Polygon",coordinates:r})}}),qn.include({toMultiPoint:function(e){var n=[];return this.eachLayer(function(o){n.push(o.toGeoJSON(e).geometry.coordinates)}),Qe(this,{type:"MultiPoint",coordinates:n})},toGeoJSON:function(e){var n=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(n==="MultiPoint")return this.toMultiPoint(e);var o=n==="GeometryCollection",r=[];return this.eachLayer(function(d){if(d.toGeoJSON){var v=d.toGeoJSON(e);if(o)r.push(v.geometry);else{var P=En(v);P.type==="FeatureCollection"?r.push.apply(r,P.features):r.push(P)}}}),o?Qe(this,{geometries:r,type:"GeometryCollection"}):{type:"FeatureCollection",features:r}}});function qo(e,n){return new yn(e,n)}var gr=qo,ho=_n.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(e,n,o){this._url=e,this._bounds=st(n),N(this,o)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(He(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ot(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(e){return this.options.opacity=e,this._image&&this._updateOpacity(),this},setStyle:function(e){return e.opacity&&this.setOpacity(e.opacity),this},bringToFront:function(){return this._map&&Cn(this._image),this},bringToBack:function(){return this._map&&qt(this._image),this},setUrl:function(e){return this._url=e,this._image&&(this._image.src=e),this},setBounds:function(e){return this._bounds=st(e),this._map&&this._reset(),this},getEvents:function(){var e={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(e.zoomanim=this._animateZoom),e},setZIndex:function(e){return this.options.zIndex=e,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var e=this._url.tagName==="IMG",n=this._image=e?this._url:it("img");if(He(n,"leaflet-image-layer"),this._zoomAnimated&&He(n,"leaflet-zoom-animated"),this.options.className&&He(n,this.options.className),n.onselectstart=M,n.onmousemove=M,n.onload=h(this.fire,this,"load"),n.onerror=h(this._overlayOnError,this,"error"),(this.options.crossOrigin||this.options.crossOrigin==="")&&(n.crossOrigin=this.options.crossOrigin===!0?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),e){this._url=n.src;return}n.src=this._url,n.alt=this.options.alt},_animateZoom:function(e){var n=this._map.getZoomScale(e.zoom),o=this._map._latLngBoundsToNewLayerBounds(this._bounds,e.zoom,e.center).min;gi(this._image,o,n)},_reset:function(){var e=this._image,n=new Ue(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),o=n.getSize();Mt(e,n.min),e.style.width=o.x+"px",e.style.height=o.y+"px"},_updateOpacity:function(){mn(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&this.options.zIndex!==void 0&&this.options.zIndex!==null&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var e=this.options.errorOverlayUrl;e&&this._url!==e&&(this._url=e,this._image.src=e)},getCenter:function(){return this._bounds.getCenter()}}),vr=function(e,n,o){return new ho(e,n,o)},po=ho.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1,playsInline:!0},_initImage:function(){var e=this._url.tagName==="VIDEO",n=this._image=e?this._url:it("video");if(He(n,"leaflet-image-layer"),this._zoomAnimated&&He(n,"leaflet-zoom-animated"),this.options.className&&He(n,this.options.className),n.onselectstart=M,n.onmousemove=M,n.onloadeddata=h(this.fire,this,"load"),e){for(var o=n.getElementsByTagName("source"),r=[],d=0;d0?r:[n.src];return}we(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(n.style,"objectFit")&&(n.style.objectFit="fill"),n.autoplay=!!this.options.autoplay,n.loop=!!this.options.loop,n.muted=!!this.options.muted,n.playsInline=!!this.options.playsInline;for(var v=0;vd?(n.height=d+"px",He(e,v)):Lt(e,v),this._containerWidth=this._container.offsetWidth},_animateZoom:function(e){var n=this._map._latLngToNewLayerPoint(this._latlng,e.zoom,e.center),o=this._getAnchor();Mt(this._container,n.add(o))},_adjustPan:function(){if(this.options.autoPan){if(this._map._panAnim&&this._map._panAnim.stop(),this._autopanning){this._autopanning=!1;return}var e=this._map,n=parseInt(mi(this._container,"marginBottom"),10)||0,o=this._container.offsetHeight+n,r=this._containerWidth,d=new fe(this._containerLeft,-o-this._containerBottom);d._add(Xe(this._container));var v=e.layerPointToContainerPoint(d),P=pe(this.options.autoPanPadding),D=pe(this.options.autoPanPaddingTopLeft||P),B=pe(this.options.autoPanPaddingBottomRight||P),ne=e.getSize(),_e=0,Fe=0;v.x+r+B.x>ne.x&&(_e=v.x+r-ne.x+B.x),v.x-_e-D.x<0&&(_e=v.x-D.x),v.y+o+B.y>ne.y&&(Fe=v.y+o-ne.y+B.y),v.y-Fe-D.y<0&&(Fe=v.y-D.y),(_e||Fe)&&(this.options.keepInView&&(this._autopanning=!0),e.fire("autopanstart").panBy([_e,Fe]))}},_getAnchor:function(){return pe(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}}),As=function(e,n){return new Dn(e,n)};qe.mergeOptions({closePopupOnClick:!0}),qe.include({openPopup:function(e,n,o){return this._initOverlay(Dn,e,n,o).openOn(this),this},closePopup:function(e){return e=arguments.length?e:this._popup,e&&e.close(),this}}),_n.include({bindPopup:function(e,n){return this._popup=this._initOverlay(Dn,this._popup,e,n),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(e){return this._popup&&(this instanceof bn||(this._popup._source=this),this._popup._prepareOpen(e||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return this._popup?this._popup.isOpen():!1},setPopupContent:function(e){return this._popup&&this._popup.setContent(e),this},getPopup:function(){return this._popup},_openPopup:function(e){if(!(!this._popup||!this._map)){bi(e);var n=e.layer||e.target;if(this._popup._source===n&&!(n instanceof ni)){this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(e.latlng);return}this._popup._source=n,this.openPopup(e.latlng)}},_movePopup:function(e){this._popup.setLatLng(e.latlng)},_onKeyPress:function(e){e.originalEvent.keyCode===13&&this._openPopup(e)}});var _o=Nt.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(e){Nt.prototype.onAdd.call(this,e),this.setOpacity(this.options.opacity),e.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(e){Nt.prototype.onRemove.call(this,e),e.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var e=Nt.prototype.getEvents.call(this);return this.options.permanent||(e.preclick=this.close),e},_initLayout:function(){var e="leaflet-tooltip",n=e+" "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=it("div",n),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+b(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(e){var n,o,r=this._map,d=this._container,v=r.latLngToContainerPoint(r.getCenter()),P=r.layerPointToContainerPoint(e),D=this.options.direction,B=d.offsetWidth,ne=d.offsetHeight,_e=pe(this.options.offset),Fe=this._getAnchor();D==="top"?(n=B/2,o=ne):D==="bottom"?(n=B/2,o=0):D==="center"?(n=B/2,o=ne/2):D==="right"?(n=0,o=ne/2):D==="left"?(n=B,o=ne/2):P.xthis.options.maxZoom||or?this._retainParent(d,v,P,r):!1)},_retainChildren:function(e,n,o,r){for(var d=2*e;d<2*e+2;d++)for(var v=2*n;v<2*n+2;v++){var P=new fe(d,v);P.z=o+1;var D=this._tileCoordsToKey(P),B=this._tiles[D];if(B&&B.active){B.retain=!0;continue}else B&&B.loaded&&(B.retain=!0);o+1this.options.maxZoom||this.options.minZoom!==void 0&&d1){this._setView(e,o);return}for(var Fe=d.min.y;Fe<=d.max.y;Fe++)for(var et=d.min.x;et<=d.max.x;et++){var un=new fe(et,Fe);if(un.z=this._tileZoom,!!this._isValidTile(un)){var Wt=this._tiles[this._tileCoordsToKey(un)];Wt?Wt.current=!0:P.push(un)}}if(P.sort(function(xn,Jo){return xn.distanceTo(v)-Jo.distanceTo(v)}),P.length!==0){this._loading||(this._loading=!0,this.fire("loading"));var Rn=document.createDocumentFragment();for(et=0;eto.max.x)||!n.wrapLat&&(e.yo.max.y))return!1}if(!this.options.bounds)return!0;var r=this._tileCoordsToBounds(e);return st(this.options.bounds).overlaps(r)},_keyToBounds:function(e){return this._tileCoordsToBounds(this._keyToTileCoords(e))},_tileCoordsToNwSe:function(e){var n=this._map,o=this.getTileSize(),r=e.scaleBy(o),d=r.add(o),v=n.unproject(r,e.z),P=n.unproject(d,e.z);return[v,P]},_tileCoordsToBounds:function(e){var n=this._tileCoordsToNwSe(e),o=new wt(n[0],n[1]);return this.options.noWrap||(o=this._map.wrapLatLngBounds(o)),o},_tileCoordsToKey:function(e){return e.x+":"+e.y+":"+e.z},_keyToTileCoords:function(e){var n=e.split(":"),o=new fe(+n[0],+n[1]);return o.z=+n[2],o},_removeTile:function(e){var n=this._tiles[e];n&&(ot(n.el),delete this._tiles[e],this.fire("tileunload",{tile:n.el,coords:this._keyToTileCoords(e)}))},_initTile:function(e){He(e,"leaflet-tile");var n=this.getTileSize();e.style.width=n.x+"px",e.style.height=n.y+"px",e.onselectstart=M,e.onmousemove=M,K.ielt9&&this.options.opacity<1&&mn(e,this.options.opacity)},_addTile:function(e,n){var o=this._getTilePos(e),r=this._tileCoordsToKey(e),d=this.createTile(this._wrapCoords(e),h(this._tileReady,this,e));this._initTile(d),this.createTile.length<2&&V(h(this._tileReady,this,e,null,d)),Mt(d,o),this._tiles[r]={el:d,coords:e,current:!0},n.appendChild(d),this.fire("tileloadstart",{tile:d,coords:e})},_tileReady:function(e,n,o){n&&this.fire("tileerror",{error:n,tile:o,coords:e});var r=this._tileCoordsToKey(e);o=this._tiles[r],o&&(o.loaded=+new Date,this._map._fadeAnimated?(mn(o.el,0),O(this._fadeFrame),this._fadeFrame=V(this._updateOpacity,this)):(o.active=!0,this._pruneTiles()),n||(He(o.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:o.el,coords:e})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),K.ielt9||!this._map._fadeAnimated?V(this._pruneTiles,this):setTimeout(h(this._pruneTiles,this),250)))},_getTilePos:function(e){return e.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(e){var n=new fe(this._wrapX?T(e.x,this._wrapX):e.x,this._wrapY?T(e.y,this._wrapY):e.y);return n.z=e.z,n},_pxBoundsToTileRange:function(e){var n=this.getTileSize();return new Ue(e.min.unscaleBy(n).floor(),e.max.unscaleBy(n).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var e in this._tiles)if(!this._tiles[e].loaded)return!1;return!0}});function br(e){return new bo(e)}var Yn=bo.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(e,n){this._url=e,n=N(this,n),n.detectRetina&&K.retina&&n.maxZoom>0?(n.tileSize=Math.floor(n.tileSize/2),n.zoomReverse?(n.zoomOffset--,n.minZoom=Math.min(n.maxZoom,n.minZoom+1)):(n.zoomOffset++,n.maxZoom=Math.max(n.minZoom,n.maxZoom-1)),n.minZoom=Math.max(0,n.minZoom)):n.zoomReverse?n.minZoom=Math.min(n.maxZoom,n.minZoom):n.maxZoom=Math.max(n.minZoom,n.maxZoom),typeof n.subdomains=="string"&&(n.subdomains=n.subdomains.split("")),this.on("tileunload",this._onTileRemove)},setUrl:function(e,n){return this._url===e&&n===void 0&&(n=!0),this._url=e,n||this.redraw(),this},createTile:function(e,n){var o=document.createElement("img");return Ie(o,"load",h(this._tileOnLoad,this,n,o)),Ie(o,"error",h(this._tileOnError,this,n,o)),(this.options.crossOrigin||this.options.crossOrigin==="")&&(o.crossOrigin=this.options.crossOrigin===!0?"":this.options.crossOrigin),typeof this.options.referrerPolicy=="string"&&(o.referrerPolicy=this.options.referrerPolicy),o.alt="",o.src=this.getTileUrl(e),o},getTileUrl:function(e){var n={r:K.retina?"@2x":"",s:this._getSubdomain(e),x:e.x,y:e.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var o=this._globalTileRange.max.y-e.y;this.options.tms&&(n.y=o),n["-y"]=o}return oe(this._url,u(n,this.options))},_tileOnLoad:function(e,n){K.ielt9?setTimeout(h(e,this,null,n),0):e(null,n)},_tileOnError:function(e,n,o){var r=this.options.errorTileUrl;r&&n.getAttribute("src")!==r&&(n.src=r),e(o,n)},_onTileRemove:function(e){e.tile.onload=null},_getZoomForUrl:function(){var e=this._tileZoom,n=this.options.maxZoom,o=this.options.zoomReverse,r=this.options.zoomOffset;return o&&(e=n-e),e+r},_getSubdomain:function(e){var n=Math.abs(e.x+e.y)%this.options.subdomains.length;return this.options.subdomains[n]},_abortLoading:function(){var e,n;for(e in this._tiles)if(this._tiles[e].coords.z!==this._tileZoom&&(n=this._tiles[e].el,n.onload=M,n.onerror=M,!n.complete)){n.src=ke;var o=this._tiles[e].coords;ot(n),delete this._tiles[e],this.fire("tileabort",{tile:n,coords:o})}},_removeTile:function(e){var n=this._tiles[e];if(n)return n.el.setAttribute("src",ke),bo.prototype._removeTile.call(this,e)},_tileReady:function(e,n,o){if(!(!this._map||o&&o.getAttribute("src")===ke))return bo.prototype._tileReady.call(this,e,n,o)}});function wa(e,n){return new Yn(e,n)}var mt=Yn.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(e,n){this._url=e;var o=u({},this.defaultWmsParams);for(var r in n)r in this.options||(o[r]=n[r]);n=N(this,n);var d=n.detectRetina&&K.retina?2:1,v=this.getTileSize();o.width=v.x*d,o.height=v.y*d,this.wmsParams=o},onAdd:function(e){this._crs=this.options.crs||e.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var n=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[n]=this._crs.code,Yn.prototype.onAdd.call(this,e)},getTileUrl:function(e){var n=this._tileCoordsToNwSe(e),o=this._crs,r=Ve(o.project(n[0]),o.project(n[1])),d=r.min,v=r.max,P=(this._wmsVersion>=1.3&&this._crs===ba?[d.y,d.x,v.y,v.x]:[d.x,d.y,v.x,v.y]).join(","),D=Yn.prototype.getTileUrl.call(this,e);return D+U(this.wmsParams,D,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+P},setParams:function(e,n){return u(this.wmsParams,e),n||this.redraw(),this}});function yo(e,n){return new mt(e,n)}Yn.WMS=mt,wa.wms=yo;var On=_n.extend({options:{padding:.1},initialize:function(e){N(this,e),b(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),He(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var e={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(e.zoomanim=this._onAnimZoom),e},_onAnimZoom:function(e){this._updateTransform(e.center,e.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(e,n){var o=this._map.getZoomScale(n,this._zoom),r=this._map.getSize().multiplyBy(.5+this.options.padding),d=this._map.project(this._center,n),v=r.multiplyBy(-o).add(d).subtract(this._map._getNewPixelOrigin(e,n));K.any3d?gi(this._container,v,o):Mt(this._container,v)},_reset:function(){this._update(),this._updateTransform(this._center,this._zoom);for(var e in this._layers)this._layers[e]._reset()},_onZoomEnd:function(){for(var e in this._layers)this._layers[e]._project()},_updatePaths:function(){for(var e in this._layers)this._layers[e]._update()},_update:function(){var e=this.options.padding,n=this._map.getSize(),o=this._map.containerPointToLayerPoint(n.multiplyBy(-e)).round();this._bounds=new Ue(o,o.add(n.multiplyBy(1+e*2)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),Yo=On.extend({options:{tolerance:0},getEvents:function(){var e=On.prototype.getEvents.call(this);return e.viewprereset=this._onViewPreReset,e},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){On.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var e=this._container=document.createElement("canvas");Ie(e,"mousemove",this._onMouseMove,this),Ie(e,"click dblclick mousedown mouseup contextmenu",this._onClick,this),Ie(e,"mouseout",this._handleMouseOut,this),e._leaflet_disable_events=!0,this._ctx=e.getContext("2d")},_destroyContainer:function(){O(this._redrawRequest),delete this._ctx,ot(this._container),Je(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){var e;this._redrawBounds=null;for(var n in this._layers)e=this._layers[n],e._update();this._redraw()}},_update:function(){if(!(this._map._animatingZoom&&this._bounds)){On.prototype._update.call(this);var e=this._bounds,n=this._container,o=e.getSize(),r=K.retina?2:1;Mt(n,e.min),n.width=r*o.x,n.height=r*o.y,n.style.width=o.x+"px",n.style.height=o.y+"px",K.retina&&this._ctx.scale(2,2),this._ctx.translate(-e.min.x,-e.min.y),this.fire("update")}},_reset:function(){On.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(e){this._updateDashArray(e),this._layers[b(e)]=e;var n=e._order={layer:e,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=n),this._drawLast=n,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(e){this._requestRedraw(e)},_removePath:function(e){var n=e._order,o=n.next,r=n.prev;o?o.prev=r:this._drawLast=r,r?r.next=o:this._drawFirst=o,delete e._order,delete this._layers[b(e)],this._requestRedraw(e)},_updatePath:function(e){this._extendRedrawBounds(e),e._project(),e._update(),this._requestRedraw(e)},_updateStyle:function(e){this._updateDashArray(e),this._requestRedraw(e)},_updateDashArray:function(e){if(typeof e.options.dashArray=="string"){var n=e.options.dashArray.split(/[, ]+/),o=[],r,d;for(d=0;d')}}catch{}return function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}})(),g={_initContainer:function(){this._container=it("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(On.prototype._update.call(this),this.fire("update"))},_initPath:function(e){var n=e._container=xo("shape");He(n,"leaflet-vml-shape "+(this.options.className||"")),n.coordsize="1 1",e._path=xo("path"),n.appendChild(e._path),this._updateStyle(e),this._layers[b(e)]=e},_addPath:function(e){var n=e._container;this._container.appendChild(n),e.options.interactive&&e.addInteractiveTarget(n)},_removePath:function(e){var n=e._container;ot(n),e.removeInteractiveTarget(n),delete this._layers[b(e)]},_updateStyle:function(e){var n=e._stroke,o=e._fill,r=e.options,d=e._container;d.stroked=!!r.stroke,d.filled=!!r.fill,r.stroke?(n||(n=e._stroke=xo("stroke")),d.appendChild(n),n.weight=r.weight+"px",n.color=r.color,n.opacity=r.opacity,r.dashArray?n.dashStyle=we(r.dashArray)?r.dashArray.join(" "):r.dashArray.replace(/( *, *)/g," "):n.dashStyle="",n.endcap=r.lineCap.replace("butt","flat"),n.joinstyle=r.lineJoin):n&&(d.removeChild(n),e._stroke=null),r.fill?(o||(o=e._fill=xo("fill")),d.appendChild(o),o.color=r.fillColor||r.color,o.opacity=r.fillOpacity):o&&(d.removeChild(o),e._fill=null)},_updateCircle:function(e){var n=e._point.round(),o=Math.round(e._radius),r=Math.round(e._radiusY||o);this._setPath(e,e._empty()?"M0 0":"AL "+n.x+","+n.y+" "+o+","+r+" 0,"+65535*360)},_setPath:function(e,n){e._path.v=n},_bringToFront:function(e){Cn(e._container)},_bringToBack:function(e){qt(e._container)}},c=K.vml?xo:q,X=On.extend({_initContainer:function(){this._container=c("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=c("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ot(this._container),Je(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){if(!(this._map._animatingZoom&&this._bounds)){On.prototype._update.call(this);var e=this._bounds,n=e.getSize(),o=this._container;(!this._svgSize||!this._svgSize.equals(n))&&(this._svgSize=n,o.setAttribute("width",n.x),o.setAttribute("height",n.y)),Mt(o,e.min),o.setAttribute("viewBox",[e.min.x,e.min.y,n.x,n.y].join(" ")),this.fire("update")}},_initPath:function(e){var n=e._path=c("path");e.options.className&&He(n,e.options.className),e.options.interactive&&He(n,"leaflet-interactive"),this._updateStyle(e),this._layers[b(e)]=e},_addPath:function(e){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(e._path),e.addInteractiveTarget(e._path)},_removePath:function(e){ot(e._path),e.removeInteractiveTarget(e._path),delete this._layers[b(e)]},_updatePath:function(e){e._project(),e._update()},_updateStyle:function(e){var n=e._path,o=e.options;n&&(o.stroke?(n.setAttribute("stroke",o.color),n.setAttribute("stroke-opacity",o.opacity),n.setAttribute("stroke-width",o.weight),n.setAttribute("stroke-linecap",o.lineCap),n.setAttribute("stroke-linejoin",o.lineJoin),o.dashArray?n.setAttribute("stroke-dasharray",o.dashArray):n.removeAttribute("stroke-dasharray"),o.dashOffset?n.setAttribute("stroke-dashoffset",o.dashOffset):n.removeAttribute("stroke-dashoffset")):n.setAttribute("stroke","none"),o.fill?(n.setAttribute("fill",o.fillColor||o.color),n.setAttribute("fill-opacity",o.fillOpacity),n.setAttribute("fill-rule",o.fillRule||"evenodd")):n.setAttribute("fill","none"))},_updatePoly:function(e,n){this._setPath(e,W(e._parts,n))},_updateCircle:function(e){var n=e._point,o=Math.max(Math.round(e._radius),1),r=Math.max(Math.round(e._radiusY),1)||o,d="a"+o+","+r+" 0 1,0 ",v=e._empty()?"M0 0":"M"+(n.x-o)+","+n.y+d+o*2+",0 "+d+-o*2+",0 ";this._setPath(e,v)},_setPath:function(e,n){e._path.setAttribute("d",n)},_bringToFront:function(e){Cn(e._path)},_bringToBack:function(e){qt(e._path)}});K.vml&&X.include(g);function k(e){return K.svg||K.vml?new X(e):null}qe.include({getRenderer:function(e){var n=e.options.renderer||this._getPaneRenderer(e.options.pane)||this.options.renderer||this._renderer;return n||(n=this._renderer=this._createRenderer()),this.hasLayer(n)||this.addLayer(n),n},_getPaneRenderer:function(e){if(e==="overlayPane"||e===void 0)return!1;var n=this._paneRenderers[e];return n===void 0&&(n=this._createRenderer({pane:e}),this._paneRenderers[e]=n),n},_createRenderer:function(e){return this.options.preferCanvas&&ka(e)||k(e)}});var Be=Fn.extend({initialize:function(e,n){Fn.prototype.initialize.call(this,this._boundsToLatLngs(e),n)},setBounds:function(e){return this.setLatLngs(this._boundsToLatLngs(e))},_boundsToLatLngs:function(e){return e=st(e),[e.getSouthWest(),e.getNorthWest(),e.getNorthEast(),e.getSouthEast()]}});function id(e,n){return new Be(e,n)}X.create=c,X.pointsToPath=W,yn.geometryToLayer=ii,yn.coordsToLatLng=oi,yn.coordsToLatLngs=ki,yn.latLngToCoords=Ls,yn.latLngsToCoords=Go,yn.getFeature=Qe,yn.asFeature=En,qe.mergeOptions({boxZoom:!0});var bl=An.extend({initialize:function(e){this._map=e,this._container=e._container,this._pane=e._panes.overlayPane,this._resetStateTimeout=0,e.on("unload",this._destroy,this)},addHooks:function(){Ie(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Je(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ot(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){this._resetStateTimeout!==0&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(e){if(!e.shiftKey||e.which!==1&&e.button!==1)return!1;this._clearDeferredResetState(),this._resetState(),In(),Fi(),this._startPoint=this._map.mouseEventToContainerPoint(e),Ie(document,{contextmenu:bi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(e){this._moved||(this._moved=!0,this._box=it("div","leaflet-zoom-box",this._container),He(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(e);var n=new Ue(this._point,this._startPoint),o=n.getSize();Mt(this._box,n.min),this._box.style.width=o.x+"px",this._box.style.height=o.y+"px"},_finish:function(){this._moved&&(ot(this._box),Lt(this._container,"leaflet-crosshair")),vi(),Di(),Je(document,{contextmenu:bi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(e){if(!(e.which!==1&&e.button!==1)&&(this._finish(),!!this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(h(this._resetState,this),0);var n=new wt(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(n).fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(e){e.keyCode===27&&(this._finish(),this._clearDeferredResetState(),this._resetState())}});qe.addInitHook("addHandler","boxZoom",bl),qe.mergeOptions({doubleClickZoom:!0});var yl=An.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(e){var n=this._map,o=n.getZoom(),r=n.options.zoomDelta,d=e.originalEvent.shiftKey?o-r:o+r;n.options.doubleClickZoom==="center"?n.setZoom(d):n.setZoomAround(e.containerPoint,d)}});qe.addInitHook("addHandler","doubleClickZoom",yl),qe.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var xl=An.extend({addHooks:function(){if(!this._draggable){var e=this._map;this._draggable=new vn(e._mapPane,e._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),e.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),e.on("zoomend",this._onZoomEnd,this),e.whenReady(this._onZoomEnd,this))}He(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){Lt(this._map._container,"leaflet-grab"),Lt(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var e=this._map;if(e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var n=st(this._map.options.maxBounds);this._offsetLimit=Ve(this._map.latLngToContainerPoint(n.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(n.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(e){if(this._map.options.inertia){var n=this._lastTime=+new Date,o=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(o),this._times.push(n),this._prunePositions(n)}this._map.fire("move",e).fire("drag",e)},_prunePositions:function(e){for(;this._positions.length>1&&e-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var e=this._map.getSize().divideBy(2),n=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=n.subtract(e).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(e,n){return e-(e-n)*this._viscosity},_onPreDragLimit:function(){if(!(!this._viscosity||!this._offsetLimit)){var e=this._draggable._newPos.subtract(this._draggable._startPos),n=this._offsetLimit;e.xn.max.x&&(e.x=this._viscousLimit(e.x,n.max.x)),e.y>n.max.y&&(e.y=this._viscousLimit(e.y,n.max.y)),this._draggable._newPos=this._draggable._startPos.add(e)}},_onPreDragWrap:function(){var e=this._worldWidth,n=Math.round(e/2),o=this._initialWorldOffset,r=this._draggable._newPos.x,d=(r-n+o)%e+n-o,v=(r+n+o)%e-n-o,P=Math.abs(d+o)0?v:-v))-n;this._delta=0,this._startTime=null,P&&(e.options.scrollWheelZoom==="center"?e.setZoom(n+P):e.setZoomAround(this._lastMousePos,n+P))}});qe.addInitHook("addHandler","scrollWheelZoom",kl);var od=600;qe.mergeOptions({tapHold:K.touchNative&&K.safari&&K.mobile,tapTolerance:15});var Sl=An.extend({addHooks:function(){Ie(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Je(this._map._container,"touchstart",this._onDown,this)},_onDown:function(e){if(clearTimeout(this._holdTimeout),e.touches.length===1){var n=e.touches[0];this._startPos=this._newPos=new fe(n.clientX,n.clientY),this._holdTimeout=setTimeout(h(function(){this._cancel(),this._isTapValid()&&(Ie(document,"touchend",Dt),Ie(document,"touchend touchcancel",this._cancelClickPrevent),this._simulateEvent("contextmenu",n))},this),od),Ie(document,"touchend touchcancel contextmenu",this._cancel,this),Ie(document,"touchmove",this._onMove,this)}},_cancelClickPrevent:function e(){Je(document,"touchend",Dt),Je(document,"touchend touchcancel",e)},_cancel:function(){clearTimeout(this._holdTimeout),Je(document,"touchend touchcancel contextmenu",this._cancel,this),Je(document,"touchmove",this._onMove,this)},_onMove:function(e){var n=e.touches[0];this._newPos=new fe(n.clientX,n.clientY)},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_simulateEvent:function(e,n){var o=new MouseEvent(e,{bubbles:!0,cancelable:!0,view:window,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY});o._simulated=!0,n.target.dispatchEvent(o)}});qe.addInitHook("addHandler","tapHold",Sl),qe.mergeOptions({touchZoom:K.touch,bounceAtZoomLimits:!0});var Tl=An.extend({addHooks:function(){He(this._map._container,"leaflet-touch-zoom"),Ie(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){Lt(this._map._container,"leaflet-touch-zoom"),Je(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(e){var n=this._map;if(!(!e.touches||e.touches.length!==2||n._animatingZoom||this._zooming)){var o=n.mouseEventToContainerPoint(e.touches[0]),r=n.mouseEventToContainerPoint(e.touches[1]);this._centerPoint=n.getSize()._divideBy(2),this._startLatLng=n.containerPointToLatLng(this._centerPoint),n.options.touchZoom!=="center"&&(this._pinchStartLatLng=n.containerPointToLatLng(o.add(r)._divideBy(2))),this._startDist=o.distanceTo(r),this._startZoom=n.getZoom(),this._moved=!1,this._zooming=!0,n._stop(),Ie(document,"touchmove",this._onTouchMove,this),Ie(document,"touchend touchcancel",this._onTouchEnd,this),Dt(e)}},_onTouchMove:function(e){if(!(!e.touches||e.touches.length!==2||!this._zooming)){var n=this._map,o=n.mouseEventToContainerPoint(e.touches[0]),r=n.mouseEventToContainerPoint(e.touches[1]),d=o.distanceTo(r)/this._startDist;if(this._zoom=n.getScaleZoom(d,this._startZoom),!n.options.bounceAtZoomLimits&&(this._zoomn.getMaxZoom()&&d>1)&&(this._zoom=n._limitZoom(this._zoom)),n.options.touchZoom==="center"){if(this._center=this._startLatLng,d===1)return}else{var v=o._add(r)._divideBy(2)._subtract(this._centerPoint);if(d===1&&v.x===0&&v.y===0)return;this._center=n.unproject(n.project(this._pinchStartLatLng,this._zoom).subtract(v),this._zoom)}this._moved||(n._moveStart(!0,!1),this._moved=!0),O(this._animRequest);var P=h(n._move,n,this._center,this._zoom,{pinch:!0,round:!1},void 0);this._animRequest=V(P,this,!0),Dt(e)}},_onTouchEnd:function(){if(!this._moved||!this._zooming){this._zooming=!1;return}this._zooming=!1,O(this._animRequest),Je(document,"touchmove",this._onTouchMove,this),Je(document,"touchend touchcancel",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))}});qe.addInitHook("addHandler","touchZoom",Tl),qe.BoxZoom=bl,qe.DoubleClickZoom=yl,qe.Drag=xl,qe.Keyboard=wl,qe.ScrollWheelZoom=kl,qe.TapHold=Sl,qe.TouchZoom=Tl,s.Bounds=Ue,s.Browser=K,s.CRS=zt,s.Canvas=Yo,s.Circle=Wi,s.CircleMarker=wi,s.Class=$,s.Control=en,s.DivIcon=Ms,s.DivOverlay=Nt,s.DomEvent=Vi,s.DomUtil=Ln,s.Draggable=vn,s.Evented=ge,s.FeatureGroup=bn,s.GeoJSON=yn,s.GridLayer=bo,s.Handler=An,s.Icon=ji,s.ImageOverlay=ho,s.LatLng=Me,s.LatLngBounds=wt,s.Layer=_n,s.LayerGroup=qn,s.LineUtil=dr,s.Map=qe,s.Marker=Wo,s.Mixin=rr,s.Path=ni,s.Point=fe,s.PolyUtil=lr,s.Polygon=Fn,s.Polyline=tn,s.Popup=Dn,s.PosAnimation=so,s.Projection=fr,s.Rectangle=Be,s.Renderer=On,s.SVG=X,s.SVGOverlay=go,s.TileLayer=Yn,s.Tooltip=_o,s.Transformation=kt,s.Util=F,s.VideoOverlay=po,s.bind=h,s.bounds=Ve,s.canvas=ka,s.circle=Rt,s.circleMarker=fo,s.control=ln,s.divIcon=xa,s.extend=u,s.featureGroup=Ps,s.geoJSON=qo,s.geoJson=gr,s.gridLayer=br,s.icon=pr,s.imageOverlay=vr,s.latLng=De,s.latLngBounds=st,s.layerGroup=uo,s.map=Vo,s.marker=mr,s.point=pe,s.polygon=ya,s.polyline=Ko,s.popup=As,s.rectangle=id,s.setOptions=N,s.stamp=b,s.svg=k,s.svgOverlay=vo,s.tileLayer=wa,s.tooltip=_r,s.transformation=w,s.version=l,s.videoOverlay=mo;var sd=window.L;s.noConflict=function(){return window.L=sd,this},window.L=s}))})(Ds,Ds.exports)),Ds.exports}var fm=dm();const qi=um(fm),Cu={__name:"DeviceMap",props:{position:{type:Object,default:null},trail:{type:Array,default:()=>[]},aircraft:{type:Array,default:()=>[]}},setup(t){const i=t,s=Y(null);let l,u,f,h;const _=new Map;function b(G,N){const U=getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#3D7BF0",R=N?"#8a94a6":U,oe=typeof G=="number"?G:0;return qi.divIcon({className:"plane-marker",iconSize:[22,22],iconAnchor:[11,11],html:``})}function C(G){const U=[`${G.callsign||G.icao24||"aircraft"}`];return G.country&&U.push(G.country),typeof G.altitude=="number"&&U.push(`${Math.round(G.altitude)} m`),typeof G.velocity=="number"&&U.push(`${Math.round(G.velocity*3.6)} km/h`),G.onGround&&U.push("on ground"),U.join(" · ")}function T(){if(!l)return;h||(h=qi.layerGroup().addTo(l));const G=new Set;for(const N of i.aircraft){if(typeof N.lat!="number"||typeof N.lng!="number")continue;G.add(N.icao24);const U=[N.lat,N.lng];let R=_.get(N.icao24);R?(R.setLatLng(U),R.setIcon(b(N.heading,N.onGround)),R.setTooltipContent(C(N))):(R=qi.marker(U,{icon:b(N.heading,N.onGround)}).bindTooltip(C(N)),R.addTo(h),_.set(N.icao24,R))}for(const[N,U]of _)G.has(N)||(h.removeLayer(U),_.delete(N))}function M(){if(!l)return;const G=i.position;if(G&&(G.lat||G.lng)){const N=[G.lat,G.lng];u?u.setLatLng(N):(u=qi.marker(N).addTo(l),l.setView(N,17))}if(f&&f.remove(),i.trail.length){const N=getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#3D7BF0";f=qi.polyline(i.trail,{color:N,weight:3}).addTo(l)}}ti(()=>{l=qi.map(s.value,{zoomControl:!0}).setView([20,0],2),qi.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:"© OpenStreetMap",maxZoom:19}).addTo(l),setTimeout(()=>l.invalidateSize(),60),M(),T(),(!i.position||!i.position.lat&&!i.position.lng)&&i.aircraft.length&&j()});let H=!1;function j(){if(H||!l||!i.aircraft.length)return;const G=i.aircraft.filter(N=>typeof N.lat=="number"&&typeof N.lng=="number").map(N=>[N.lat,N.lng]);G.length&&(l.fitBounds(qi.latLngBounds(G).pad(.2)),H=!0)}return us(()=>{l&&l.remove(),l=null}),Bt(()=>i.position,M,{deep:!0}),Bt(()=>i.trail,M,{deep:!0}),Bt(()=>i.aircraft,()=>{T(),(!i.position||!i.position.lat&&!i.position.lng)&&j()},{deep:!0}),(G,N)=>(p(),m("div",{ref_key:"el",ref:s,class:"h-[320px] w-full rounded-lg"},null,512))}},hm=["width","height","stroke-width"],pm=["d"],Q={__name:"Icon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:18},stroke:{type:[Number,String],default:2}},setup(t){const l=({grid:"M3 3h7v7H3zM14 3h7v7h-7zM14 14h7v7h-7zM3 14h7v7H3z",radio:"M4.9 19.1a10 10 0 0 1 0-14.2M7.8 16.2a6 6 0 0 1 0-8.4M16.2 7.8a6 6 0 0 1 0 8.4M19.1 4.9a10 10 0 0 1 0 14.2M12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2z",route:"M6 19a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM18 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM6 13V9a4 4 0 0 1 4-4h4",calendar:"M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z",book:"M4 19.5A2.5 2.5 0 0 1 6.5 17H20M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z",fileText:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M16 13H8M16 17H8M10 9H8",settings:"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",search:"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.3-4.3",plus:"M12 5v14M5 12h14",battery:"M3 8h14a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1zM22 11v2",signal:"M2 20h.01M7 20v-4M12 20v-8M17 20V8M22 20V4",clock:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 7v5l3 2",chevronRight:"M9 6l6 6-6 6",play:"M6 3l14 9-14 9V3z",logout:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9",wind:"M12.8 19.6A2 2 0 1 0 14 16H2M17.5 8a2.5 2.5 0 1 1 2 4H2M9.6 4.6A2 2 0 1 1 11 8H2",drone:"M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM6 6 4 4M18 6l2-2M6 18l-2 2M18 18l2 2",user:"M20 21a8 8 0 1 0-16 0M12 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z",users:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",sliders:"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6",alertTriangle:"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4M12 17h.01",download:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3",upload:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12",trash:"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6",check:"M20 6 9 17l-5-5",mail:"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM22 6l-10 7L2 6",lock:"M5 11h14a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2zM7 11V7a5 5 0 0 1 10 0v4",monitor:"M3 4h18a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM8 21h8M12 17v4",globe:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM3 12h18M12 3a15 15 0 0 1 0 18 15 15 0 0 1 0-18z",smartphone:"M7 2h10a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1zM11 18h2",image:"M4 4h16a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM8.5 11a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM21 15l-5-5L5 21",eye:"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",type:"M4 7V4h16v3M9 20h6M12 4v16",sun:"M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4",moon:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z",x:"M18 6 6 18M6 6l12 12",server:"M20 4H4a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zM20 13H4a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2zM6 7.5h.01M6 16.5h.01",cloud:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9z"}[t.name]||"").split(" M").map((u,f)=>f?"M"+u:u);return(u,f)=>(p(),m("svg",{width:t.size,height:t.size,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":t.stroke,"stroke-linecap":"round","stroke-linejoin":"round",style:{flex:"none"},"aria-hidden":"true"},[(p(!0),m(ae,null,ze($e(l),(h,_)=>(p(),m("path",{key:_,d:h},null,8,pm))),128))],8,hm))}},mm=["aria-checked","disabled"],nn={__name:"Toggle",props:{modelValue:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(t,{emit:i}){const s=i;return(l,u)=>(p(),m("button",{type:"button",role:"switch","aria-checked":t.modelValue,disabled:t.disabled,class:Pe(["relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition disabled:opacity-40",t.modelValue?"bg-accent":"bg-surface-2 border border-line-strong"]),onClick:u[0]||(u[0]=f=>s("update:modelValue",!t.modelValue))},[a("span",{class:Pe(["inline-block h-4 w-4 transform rounded-full bg-white shadow-sm transition",t.modelValue?"translate-x-6":"translate-x-1"])},null,2)],10,mm))}},gm={class:"inline-flex rounded-[10px] border border-line bg-surface-2 p-0.5"},vm=["onClick"],wn={__name:"Segmented",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(t,{emit:i}){const s=i;return(l,u)=>(p(),m("div",gm,[(p(!0),m(ae,null,ze(t.options,f=>(p(),m("button",{key:f.value,type:"button",class:Pe(["inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-[13px] font-semibold transition",t.modelValue===f.value?"bg-surface-1 text-ink shadow-xs":"text-ink-secondary hover:text-ink"]),onClick:h=>s("update:modelValue",f.value)},[f.icon?(p(),nt(Q,{key:0,name:f.icon,size:15},null,8,["name"])):I("",!0),z(" "+x(f.label),1)],10,vm))),128))]))}},_m={class:"text-sm font-semibold text-ink"},bm={key:0,class:"mt-0.5 text-xs text-ink-muted"},xe={__name:"Row",props:{title:{type:String,default:""},desc:{type:String,default:""},keywords:{type:String,default:""},block:{type:Boolean,default:!1}},setup(t){const i=t,s=Vs("settingsSearch",{value:""}),l=de(()=>{const u=(s.value||"").trim().toLowerCase();return u?`${i.title} ${i.desc} ${i.keywords}`.toLowerCase().includes(u):!0});return(u,f)=>l.value?(p(),m("div",{key:0,class:Pe(["border-b border-line py-4 last:border-0",t.block?"":"flex items-center justify-between gap-6"])},[a("div",{class:Pe(t.block?"mb-3":"min-w-0")},[a("div",_m,x(t.title),1),t.desc?(p(),m("div",bm,x(t.desc),1)):I("",!0)],2),a("div",{class:Pe(t.block?"":"shrink-0")},[Tf(u.$slots,"default")],2)],2)):I("",!0)}},ia=[{code:"AL",name:"Albania",continent:"EU",bbox:"39.6,19.3,42.7,21.1"},{code:"AD",name:"Andorra",continent:"EU",bbox:"42.4,1.4,42.7,1.8"},{code:"AT",name:"Austria",continent:"EU",bbox:"46.4,9.5,49.0,17.2"},{code:"BY",name:"Belarus",continent:"EU",bbox:"51.2,23.2,56.2,32.8"},{code:"BE",name:"Belgium",continent:"EU",bbox:"49.5,2.5,51.5,6.4"},{code:"BA",name:"Bosnia and Herzegovina",continent:"EU",bbox:"42.6,15.7,45.3,19.6"},{code:"BG",name:"Bulgaria",continent:"EU",bbox:"41.2,22.4,44.2,28.6"},{code:"HR",name:"Croatia",continent:"EU",bbox:"42.4,13.5,46.6,19.4"},{code:"CY",name:"Cyprus",continent:"EU",bbox:"34.6,32.3,35.7,34.6"},{code:"CZ",name:"Czechia",continent:"EU",bbox:"48.6,12.1,51.1,18.9"},{code:"DK",name:"Denmark",continent:"EU",bbox:"54.6,8.1,57.8,12.7"},{code:"EE",name:"Estonia",continent:"EU",bbox:"57.5,21.8,59.7,28.2"},{code:"FI",name:"Finland",continent:"EU",bbox:"59.8,20.6,70.1,31.6"},{code:"FR",name:"France",continent:"EU",bbox:"41.3,-5.2,51.1,9.6"},{code:"DE",name:"Germany",continent:"EU",bbox:"47.2,5.8,55.1,15.1"},{code:"GR",name:"Greece",continent:"EU",bbox:"34.8,19.4,41.8,28.3"},{code:"HU",name:"Hungary",continent:"EU",bbox:"45.7,16.1,48.6,22.9"},{code:"IS",name:"Iceland",continent:"EU",bbox:"63.3,-24.6,66.6,-13.5"},{code:"IE",name:"Ireland",continent:"EU",bbox:"51.4,-10.6,55.4,-6.0"},{code:"IT",name:"Italy",continent:"EU",bbox:"36.6,6.6,47.1,18.6"},{code:"XK",name:"Kosovo",continent:"EU",bbox:"41.8,20.0,43.3,21.8"},{code:"LV",name:"Latvia",continent:"EU",bbox:"55.7,20.9,58.1,28.2"},{code:"LI",name:"Liechtenstein",continent:"EU",bbox:"47.0,9.4,47.3,9.6"},{code:"LT",name:"Lithuania",continent:"EU",bbox:"53.9,20.9,56.5,26.9"},{code:"LU",name:"Luxembourg",continent:"EU",bbox:"49.4,5.7,50.2,6.5"},{code:"MT",name:"Malta",continent:"EU",bbox:"35.8,14.1,36.1,14.6"},{code:"MD",name:"Moldova",continent:"EU",bbox:"45.4,26.6,48.5,30.2"},{code:"MC",name:"Monaco",continent:"EU",bbox:"43.72,7.40,43.75,7.44"},{code:"ME",name:"Montenegro",continent:"EU",bbox:"41.8,18.4,43.6,20.4"},{code:"NL",name:"Netherlands",continent:"EU",bbox:"50.7,3.3,53.7,7.2"},{code:"MK",name:"North Macedonia",continent:"EU",bbox:"40.8,20.4,42.4,23.0"},{code:"NO",name:"Norway",continent:"EU",bbox:"57.9,4.6,71.2,31.1"},{code:"PL",name:"Poland",continent:"EU",bbox:"49.0,14.1,54.9,24.2"},{code:"PT",name:"Portugal",continent:"EU",bbox:"36.9,-9.5,42.2,-6.2"},{code:"RO",name:"Romania",continent:"EU",bbox:"43.6,20.2,48.3,29.7"},{code:"SM",name:"San Marino",continent:"EU",bbox:"43.89,12.40,43.99,12.52"},{code:"RS",name:"Serbia",continent:"EU",bbox:"42.2,18.8,46.2,23.0"},{code:"SK",name:"Slovakia",continent:"EU",bbox:"47.7,16.8,49.6,22.6"},{code:"SI",name:"Slovenia",continent:"EU",bbox:"45.4,13.4,46.9,16.6"},{code:"ES",name:"Spain",continent:"EU",bbox:"35.9,-9.4,43.8,3.4"},{code:"SE",name:"Sweden",continent:"EU",bbox:"55.3,11.1,69.1,24.2"},{code:"CH",name:"Switzerland",continent:"EU",bbox:"45.8,5.9,47.8,10.5"},{code:"UA",name:"Ukraine",continent:"EU",bbox:"44.4,22.1,52.4,40.2"},{code:"GB",name:"United Kingdom",continent:"EU",bbox:"49.9,-8.7,60.9,1.8"},{code:"VA",name:"Vatican City",continent:"EU",bbox:"41.900,12.445,41.908,12.458"},{code:"RU",name:"Russia",continent:"EU",bbox:"41.2,19.6,81.9,180"},{code:"TR",name:"Turkey",continent:"EU",bbox:"35.8,25.7,42.3,44.8"},{code:"AF",name:"Afghanistan",continent:"AS",bbox:"29.4,60.5,38.5,74.9"},{code:"AM",name:"Armenia",continent:"AS",bbox:"38.8,43.4,41.3,46.6"},{code:"AZ",name:"Azerbaijan",continent:"AS",bbox:"38.4,44.8,41.9,50.4"},{code:"BH",name:"Bahrain",continent:"AS",bbox:"25.8,50.4,26.3,50.7"},{code:"BD",name:"Bangladesh",continent:"AS",bbox:"20.7,88.0,26.6,92.7"},{code:"BT",name:"Bhutan",continent:"AS",bbox:"26.7,88.7,28.3,92.1"},{code:"BN",name:"Brunei",continent:"AS",bbox:"4.0,114.0,5.1,115.4"},{code:"KH",name:"Cambodia",continent:"AS",bbox:"10.4,102.3,14.7,107.6"},{code:"CN",name:"China",continent:"AS",bbox:"18.2,73.5,53.6,134.8"},{code:"GE",name:"Georgia",continent:"AS",bbox:"41.0,40.0,43.6,46.7"},{code:"IN",name:"India",continent:"AS",bbox:"6.7,68.1,35.5,97.4"},{code:"ID",name:"Indonesia",continent:"AS",bbox:"-11.0,95.0,6.1,141.0"},{code:"IR",name:"Iran",continent:"AS",bbox:"25.0,44.0,39.8,63.3"},{code:"IQ",name:"Iraq",continent:"AS",bbox:"29.1,38.8,37.4,48.6"},{code:"IL",name:"Israel",continent:"AS",bbox:"29.5,34.2,33.3,35.9"},{code:"JP",name:"Japan",continent:"AS",bbox:"24.0,122.9,45.5,145.8"},{code:"JO",name:"Jordan",continent:"AS",bbox:"29.2,34.9,33.4,39.3"},{code:"KZ",name:"Kazakhstan",continent:"AS",bbox:"40.6,46.5,55.4,87.3"},{code:"KW",name:"Kuwait",continent:"AS",bbox:"28.5,46.5,30.1,48.4"},{code:"KG",name:"Kyrgyzstan",continent:"AS",bbox:"39.2,69.3,43.3,80.3"},{code:"LA",name:"Laos",continent:"AS",bbox:"13.9,100.1,22.5,107.7"},{code:"LB",name:"Lebanon",continent:"AS",bbox:"33.0,35.1,34.7,36.6"},{code:"MY",name:"Malaysia",continent:"AS",bbox:"0.9,99.6,7.4,119.3"},{code:"MV",name:"Maldives",continent:"AS",bbox:"-0.7,72.7,7.1,73.7"},{code:"MN",name:"Mongolia",continent:"AS",bbox:"41.6,87.7,52.1,119.9"},{code:"MM",name:"Myanmar",continent:"AS",bbox:"9.8,92.2,28.5,101.2"},{code:"NP",name:"Nepal",continent:"AS",bbox:"26.3,80.1,30.4,88.2"},{code:"KP",name:"North Korea",continent:"AS",bbox:"37.7,124.2,43.0,130.7"},{code:"OM",name:"Oman",continent:"AS",bbox:"16.6,52.0,26.4,59.8"},{code:"PK",name:"Pakistan",continent:"AS",bbox:"23.7,60.9,37.1,77.8"},{code:"PH",name:"Philippines",continent:"AS",bbox:"4.6,116.9,21.1,126.6"},{code:"QA",name:"Qatar",continent:"AS",bbox:"24.5,50.7,26.2,51.6"},{code:"SA",name:"Saudi Arabia",continent:"AS",bbox:"16.4,34.6,32.2,55.7"},{code:"SG",name:"Singapore",continent:"AS",bbox:"1.2,103.6,1.5,104.1"},{code:"KR",name:"South Korea",continent:"AS",bbox:"33.1,125.9,38.6,129.6"},{code:"LK",name:"Sri Lanka",continent:"AS",bbox:"5.9,79.7,9.8,81.9"},{code:"SY",name:"Syria",continent:"AS",bbox:"32.3,35.7,37.3,42.4"},{code:"TW",name:"Taiwan",continent:"AS",bbox:"21.9,120.0,25.3,122.0"},{code:"TJ",name:"Tajikistan",continent:"AS",bbox:"36.7,67.4,41.0,75.2"},{code:"TH",name:"Thailand",continent:"AS",bbox:"5.6,97.3,20.5,105.6"},{code:"TL",name:"Timor-Leste",continent:"AS",bbox:"-9.5,124.0,-8.1,127.3"},{code:"TM",name:"Turkmenistan",continent:"AS",bbox:"35.1,52.4,42.8,66.7"},{code:"AE",name:"United Arab Emirates",continent:"AS",bbox:"22.6,51.5,26.1,56.4"},{code:"UZ",name:"Uzbekistan",continent:"AS",bbox:"37.2,55.9,45.6,73.1"},{code:"VN",name:"Vietnam",continent:"AS",bbox:"8.2,102.1,23.4,109.5"},{code:"YE",name:"Yemen",continent:"AS",bbox:"12.1,42.5,19.0,54.5"},{code:"DZ",name:"Algeria",continent:"AF",bbox:"18.9,-8.7,37.1,12.0"},{code:"AO",name:"Angola",continent:"AF",bbox:"-18.0,11.6,-4.4,24.1"},{code:"BJ",name:"Benin",continent:"AF",bbox:"6.2,0.8,12.4,3.9"},{code:"BW",name:"Botswana",continent:"AF",bbox:"-26.9,20.0,-17.8,29.4"},{code:"BF",name:"Burkina Faso",continent:"AF",bbox:"9.4,-5.5,15.1,2.4"},{code:"BI",name:"Burundi",continent:"AF",bbox:"-4.5,29.0,-2.3,30.8"},{code:"CV",name:"Cabo Verde",continent:"AF",bbox:"14.8,-25.4,17.2,-22.7"},{code:"CM",name:"Cameroon",continent:"AF",bbox:"1.7,8.5,13.1,16.2"},{code:"CF",name:"Central African Republic",continent:"AF",bbox:"2.2,14.4,11.0,27.5"},{code:"TD",name:"Chad",continent:"AF",bbox:"7.4,13.5,23.4,24.0"},{code:"KM",name:"Comoros",continent:"AF",bbox:"-12.4,43.2,-11.4,44.5"},{code:"CG",name:"Congo",continent:"AF",bbox:"-5.0,11.1,3.7,18.6"},{code:"CD",name:"DR Congo",continent:"AF",bbox:"-13.5,12.2,5.4,31.3"},{code:"DJ",name:"Djibouti",continent:"AF",bbox:"10.9,41.7,12.7,43.4"},{code:"EG",name:"Egypt",continent:"AF",bbox:"22.0,25.0,31.7,36.9"},{code:"GQ",name:"Equatorial Guinea",continent:"AF",bbox:"0.9,9.3,3.8,11.4"},{code:"ER",name:"Eritrea",continent:"AF",bbox:"12.4,36.4,18.0,43.1"},{code:"SZ",name:"Eswatini",continent:"AF",bbox:"-27.3,30.8,-25.7,32.1"},{code:"ET",name:"Ethiopia",continent:"AF",bbox:"3.4,33.0,14.9,48.0"},{code:"GA",name:"Gabon",continent:"AF",bbox:"-4.0,8.7,2.3,14.5"},{code:"GM",name:"Gambia",continent:"AF",bbox:"13.1,-16.8,13.8,-13.8"},{code:"GH",name:"Ghana",continent:"AF",bbox:"4.7,-3.3,11.2,1.2"},{code:"GN",name:"Guinea",continent:"AF",bbox:"7.2,-15.1,12.7,-7.6"},{code:"GW",name:"Guinea-Bissau",continent:"AF",bbox:"10.9,-16.7,12.7,-13.6"},{code:"CI",name:"Ivory Coast",continent:"AF",bbox:"4.4,-8.6,10.7,-2.5"},{code:"KE",name:"Kenya",continent:"AF",bbox:"-4.7,33.9,5.5,41.9"},{code:"LS",name:"Lesotho",continent:"AF",bbox:"-30.7,27.0,-28.6,29.5"},{code:"LR",name:"Liberia",continent:"AF",bbox:"4.3,-11.5,8.6,-7.4"},{code:"LY",name:"Libya",continent:"AF",bbox:"19.5,9.3,33.2,25.2"},{code:"MG",name:"Madagascar",continent:"AF",bbox:"-25.6,43.2,-11.9,50.5"},{code:"MW",name:"Malawi",continent:"AF",bbox:"-17.1,32.7,-9.4,35.9"},{code:"ML",name:"Mali",continent:"AF",bbox:"10.1,-12.3,25.0,4.3"},{code:"MR",name:"Mauritania",continent:"AF",bbox:"14.7,-17.1,27.3,-4.8"},{code:"MU",name:"Mauritius",continent:"AF",bbox:"-20.5,57.3,-19.9,57.8"},{code:"MA",name:"Morocco",continent:"AF",bbox:"27.7,-13.2,35.9,-1.0"},{code:"MZ",name:"Mozambique",continent:"AF",bbox:"-26.9,30.2,-10.5,40.8"},{code:"NA",name:"Namibia",continent:"AF",bbox:"-28.9,11.7,-16.9,25.3"},{code:"NE",name:"Niger",continent:"AF",bbox:"11.7,0.2,23.5,16.0"},{code:"NG",name:"Nigeria",continent:"AF",bbox:"4.3,2.7,13.9,14.7"},{code:"RW",name:"Rwanda",continent:"AF",bbox:"-2.8,28.9,-1.1,30.9"},{code:"SN",name:"Senegal",continent:"AF",bbox:"12.3,-17.5,16.7,-11.4"},{code:"SL",name:"Sierra Leone",continent:"AF",bbox:"6.9,-13.3,10.0,-10.3"},{code:"SO",name:"Somalia",continent:"AF",bbox:"-1.7,40.9,12.0,51.4"},{code:"ZA",name:"South Africa",continent:"AF",bbox:"-34.8,16.5,-22.1,32.9"},{code:"SS",name:"South Sudan",continent:"AF",bbox:"3.5,24.1,12.2,35.9"},{code:"SD",name:"Sudan",continent:"AF",bbox:"8.7,21.8,22.2,38.6"},{code:"TZ",name:"Tanzania",continent:"AF",bbox:"-11.7,29.3,-1.0,40.4"},{code:"TG",name:"Togo",continent:"AF",bbox:"6.1,-0.1,11.1,1.8"},{code:"TN",name:"Tunisia",continent:"AF",bbox:"30.2,7.5,37.5,11.6"},{code:"UG",name:"Uganda",continent:"AF",bbox:"-1.5,29.6,4.2,35.0"},{code:"ZM",name:"Zambia",continent:"AF",bbox:"-18.1,21.9,-8.2,33.7"},{code:"ZW",name:"Zimbabwe",continent:"AF",bbox:"-22.4,25.2,-15.6,33.1"},{code:"CA",name:"Canada",continent:"NA",bbox:"41.7,-141.0,83.1,-52.6"},{code:"US",name:"United States",continent:"NA",bbox:"24.4,-125.0,49.4,-66.9"},{code:"MX",name:"Mexico",continent:"NA",bbox:"14.5,-118.4,32.7,-86.7"},{code:"GT",name:"Guatemala",continent:"NA",bbox:"13.7,-92.2,17.8,-88.2"},{code:"BZ",name:"Belize",continent:"NA",bbox:"15.9,-89.2,18.5,-87.8"},{code:"SV",name:"El Salvador",continent:"NA",bbox:"13.1,-90.1,14.4,-87.7"},{code:"HN",name:"Honduras",continent:"NA",bbox:"12.9,-89.4,16.5,-83.1"},{code:"NI",name:"Nicaragua",continent:"NA",bbox:"10.7,-87.7,15.0,-83.1"},{code:"CR",name:"Costa Rica",continent:"NA",bbox:"8.0,-85.9,11.2,-82.5"},{code:"PA",name:"Panama",continent:"NA",bbox:"7.2,-83.1,9.6,-77.2"},{code:"CU",name:"Cuba",continent:"NA",bbox:"19.8,-85.0,23.3,-74.1"},{code:"DO",name:"Dominican Republic",continent:"NA",bbox:"17.5,-72.0,19.9,-68.3"},{code:"HT",name:"Haiti",continent:"NA",bbox:"18.0,-74.5,20.1,-71.6"},{code:"JM",name:"Jamaica",continent:"NA",bbox:"17.7,-78.4,18.5,-76.2"},{code:"BS",name:"Bahamas",continent:"NA",bbox:"20.9,-79.0,27.3,-72.7"},{code:"TT",name:"Trinidad and Tobago",continent:"NA",bbox:"10.0,-61.9,11.4,-60.5"},{code:"AR",name:"Argentina",continent:"SA",bbox:"-55.1,-73.6,-21.8,-53.6"},{code:"BO",name:"Bolivia",continent:"SA",bbox:"-22.9,-69.6,-9.7,-57.5"},{code:"BR",name:"Brazil",continent:"SA",bbox:"-33.8,-74.0,5.3,-34.8"},{code:"CL",name:"Chile",continent:"SA",bbox:"-55.9,-75.6,-17.5,-66.4"},{code:"CO",name:"Colombia",continent:"SA",bbox:"-4.2,-79.0,12.5,-66.9"},{code:"EC",name:"Ecuador",continent:"SA",bbox:"-5.0,-81.1,1.4,-75.2"},{code:"GY",name:"Guyana",continent:"SA",bbox:"1.2,-61.4,8.6,-56.5"},{code:"PY",name:"Paraguay",continent:"SA",bbox:"-27.6,-62.6,-19.3,-54.3"},{code:"PE",name:"Peru",continent:"SA",bbox:"-18.4,-81.3,0.0,-68.7"},{code:"SR",name:"Suriname",continent:"SA",bbox:"1.8,-58.1,6.0,-54.0"},{code:"UY",name:"Uruguay",continent:"SA",bbox:"-35.0,-58.4,-30.1,-53.1"},{code:"VE",name:"Venezuela",continent:"SA",bbox:"0.6,-73.4,12.2,-59.8"},{code:"AU",name:"Australia",continent:"OC",bbox:"-43.6,113.3,-10.7,153.6"},{code:"NZ",name:"New Zealand",continent:"OC",bbox:"-47.3,166.4,-34.4,178.6"},{code:"PG",name:"Papua New Guinea",continent:"OC",bbox:"-11.7,140.8,-1.3,155.9"},{code:"FJ",name:"Fiji",continent:"OC",bbox:"-19.2,177.0,-16.0,180.0"}],ym=new Map(ia.map(t=>[t.code,t]));function xm(t){const i=String(t||"").split(",").map(s=>Number(s.trim()));return i.length!==4||i.some(s=>Number.isNaN(s))?null:i}function wm(t){const i=ym.get(t);return i?i.bbox:""}function $r(t,i){if(typeof t!="number"||typeof i!="number"||Number.isNaN(t)||Number.isNaN(i))return null;let s=null,l=1/0;for(const u of ia){const f=xm(u.bbox);if(!f)continue;const[h,_,b,C]=f;if(tb||i<_||i>C)continue;const T=Math.abs(b-h)*Math.abs(C-_);Tt.continent==="EU").slice().sort((t,i)=>t.name.localeCompare(i.name)).map(t=>({value:t.bbox,label:t.name}))}function Sm(){return ia.slice().sort((t,i)=>t.name.localeCompare(i.name)).map(t=>[t.code,t.name])}const Tm=[["EU","European countries"],["AS","Asian countries"],["AF","African countries"],["NA","North American countries"],["SA","South American countries"],["OC","Oceanian countries"]];function Pm(){return Tm.map(([t,i])=>({label:i,options:ia.filter(s=>s.continent===t).slice().sort((s,l)=>s.name.localeCompare(l.name)).map(s=>({value:s.bbox,label:s.name}))}))}const Cm=(t,i)=>{const s=t.__vccOpts||t;for(const[l,u]of i)s[l]=u;return s},Lm={class:"mx-auto max-w-[1280px] p-7"},Am={class:"mb-5 flex flex-wrap items-end justify-between gap-4"},Mm={class:"flex h-10 w-full max-w-[280px] items-center gap-2 rounded border border-line-strong bg-surface-1 px-3"},Em={class:"grid grid-cols-[210px_1fr] gap-6 max-[760px]:grid-cols-1"},Om={class:"flex flex-col gap-0.5 max-[760px]:flex-row max-[760px]:overflow-x-auto"},zm=["onClick"],$m={class:"whitespace-nowrap"},Im={class:"min-w-0"},Nm={key:0,class:"panel p-10 text-center text-sm text-ink-muted"},Fm={key:0,class:"eyebrow mb-2 mt-5 first:mt-0 flex items-center gap-2"},Dm={key:1,class:"panel mb-5 p-5"},Rm={class:"flex items-center gap-1"},Bm={class:"flex items-center gap-2"},Um={class:"font-mono text-sm text-ink"},Vm={class:"inline-flex items-center gap-1 rounded-full bg-amber-soft px-2 py-0.5 text-[11px] font-semibold text-amber-fg"},Zm={key:0,class:"mt-2 text-xs text-ink-muted"},Hm={class:"grid max-w-[420px] gap-2"},jm={class:"flex items-center gap-3"},Wm={key:2,class:"panel mb-5 p-5"},Km=["value"],Gm=["value"],qm=["value"],Ym={class:"font-mono text-sm text-ink"},Jm={key:3},Xm={key:0,class:"mb-5 flex items-center gap-1 overflow-x-auto border-b border-line"},Qm=["onClick"],eg={class:"panel mb-5 p-5"},tg={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},ng={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},ig={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},og={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},sg={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},ag={key:0},rg={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},lg={class:"font-semibold text-ink-secondary"},ug={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},cg={key:7,class:"my-4 rounded-lg border border-line bg-surface-2 p-4","data-keywords":"credits usage quota remaining daily allowance rate limit"},dg={class:"flex items-center justify-between gap-3"},fg={class:"flex items-center gap-2 text-sm font-semibold text-ink"},hg={key:0,class:"text-[11px] text-ink-muted"},pg={class:"mt-2 flex items-baseline gap-1.5"},mg={class:"font-mono text-2xl font-semibold text-ink"},gg={class:"text-sm text-ink-muted"},vg={class:"mt-2 h-2 w-full overflow-hidden rounded-full bg-line"},_g={class:"mt-2 text-xs text-ink-muted"},bg={class:"mt-2 text-sm text-ink"},yg={class:"font-semibold"},xg={class:"mt-1 text-xs text-ink-muted"},wg={key:1,class:"mt-2 text-xs text-ink-muted"},kg={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},Sg={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Tg={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Pg={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Cg={key:1,class:"flex flex-col items-end gap-2"},Lg={key:0,value:"__auto__"},Ag=["label"],Mg=["value"],Eg={key:0,class:"w-64 text-right text-[11px] leading-snug text-ink-muted"},Og={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},zg={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},$g={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Ig={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Ng={key:8,class:"border-b border-line py-3 text-xs text-amber-fg"},Fg={class:"mt-4 flex flex-wrap items-center gap-3"},Dg=["disabled"],Rg={key:1,class:"flex items-center gap-2",title:"Bounding box used for Test connection — smaller areas cost fewer OpenSky credits"},Bg=["label"],Ug=["value"],Vg=["disabled"],Zg={key:3,class:"text-xs text-danger-fg"},Hg={class:"panel mb-5 p-5"},jg={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},Wg={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},Kg={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},Gg={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},qg={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},Yg={key:0},Jg={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},Xg={class:"font-semibold text-ink-secondary"},Qg={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},ev={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},tv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},nv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},iv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},ov={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},sv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},av={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},rv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},lv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},uv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},cv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},dv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},fv={key:7,class:"my-4 rounded-lg border border-line bg-surface-2 p-4","data-keywords":"usage quota rate limit calls per minute remaining left api"},hv={class:"flex items-center justify-between gap-3"},pv={class:"flex items-center gap-2 text-sm font-semibold text-ink"},mv={key:0,class:"text-[11px] text-ink-muted"},gv={class:"mt-2 flex items-baseline gap-1.5"},vv={class:"font-mono text-2xl font-semibold text-ink"},_v={class:"text-sm text-ink-muted"},bv={key:0,class:"mt-2 h-2 w-full overflow-hidden rounded-full bg-line"},yv={class:"mt-2 text-xs text-ink-muted"},xv={key:1,class:"mt-2 text-xs text-ink-muted"},wv={class:"mt-4 flex flex-wrap items-center gap-3"},kv=["disabled"],Sv=["disabled"],Tv={key:2,class:"text-xs text-danger-fg"},Pv={key:3,class:"text-[11px] text-ink-muted"},Cv={class:"panel mb-5 p-5"},Lv={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},Av={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},Mv={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},Ev={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},Ov={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},zv={key:0},$v={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},Iv={class:"font-semibold text-ink-secondary"},Nv={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},Fv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},Dv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Rv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Bv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Uv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Vv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Zv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Hv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},jv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Wv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Kv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Gv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},qv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Yv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Jv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Xv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Qv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},e_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},t_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},n_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},i_={class:"mt-4 flex flex-wrap items-center gap-3"},o_=["disabled"],s_=["disabled"],a_={key:2,class:"text-xs text-danger-fg"},r_={key:3,class:"text-[11px] text-ink-muted"},l_={class:"panel mb-5 p-5"},u_={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},c_={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},d_={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},f_={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},h_={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},p_={key:0},m_={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},g_={class:"font-semibold text-ink-secondary"},v_={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},__={key:0,class:"inline-flex items-center gap-2 break-all font-mono text-sm text-ink"},b_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},y_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},x_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},w_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},k_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},S_={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},T_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},P_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},C_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},L_={class:"mt-4 flex flex-wrap items-center gap-3"},A_=["disabled"],M_=["disabled"],E_={key:2,class:"text-xs text-danger-fg"},O_={key:3,class:"text-[11px] text-ink-muted"},z_={key:3,class:"panel mb-5 p-5"},$_={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},I_={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},N_={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},F_={key:1,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},D_={key:2,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},R_={key:5,class:"border-b border-line py-3 text-xs text-amber-fg"},B_={key:0},U_={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},V_={class:"font-semibold text-ink-secondary"},Z_={key:7,class:"border-b border-line py-3 text-xs text-ink-muted"},H_={class:"flex w-full flex-col gap-2"},j_={class:"break-all font-mono text-sm text-ink"},W_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},K_={key:1,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},G_={key:0,class:"text-xs text-ink-muted"},q_={key:1,class:"border-b border-line py-3 text-xs text-ink-muted"},Y_={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},J_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},X_={class:"mt-4 flex flex-wrap items-center gap-3"},Q_=["disabled"],e1=["disabled"],t1={key:2,class:"text-xs text-danger-fg"},n1={key:3,class:"text-[11px] text-ink-muted"},i1={key:4,class:"panel mb-5 p-5"},o1={class:"flex items-center gap-4"},s1=["src"],a1={key:1,class:"grid h-16 w-16 place-items-center rounded-full bg-[var(--navy-800)] text-lg font-bold text-white"},r1={class:"flex gap-2"},l1={class:"btn-ghost cursor-pointer"},u1={class:"mt-1 text-right text-[11px] text-ink-muted"},c1={key:5,class:"panel mb-5 p-5"},d1={class:"flex items-center gap-3"},f1={key:0,class:"mt-4 rounded-lg border border-line bg-surface-2 p-4"},h1={class:"flex flex-wrap items-center gap-4"},p1={class:"min-w-0"},m1={class:"mt-1 select-all font-mono text-sm font-bold text-ink"},g1={class:"mt-3 flex items-center gap-2"},v1={key:0,class:"mt-2 text-xs text-danger-fg"},_1={key:1,class:"mt-4 rounded-lg border border-line bg-surface-2 p-4"},b1={class:"mt-2 grid grid-cols-2 gap-1 font-mono text-xs text-ink-secondary sm:grid-cols-4"},y1={class:"rounded-lg border border-line bg-surface-2 p-3"},x1={class:"flex items-center gap-3"},w1={class:"grid h-9 w-9 place-items-center rounded-full bg-accent-soft text-accent-soft-fg"},k1={class:"min-w-0 flex-1"},S1={class:"text-sm font-semibold text-ink"},T1={class:"font-mono text-[11px] text-ink-muted"},P1={key:6,class:"mb-5"},C1={key:0,class:"panel mb-5 p-5"},L1={class:"grid max-w-[520px] gap-2"},A1={class:"flex flex-wrap gap-2"},M1=["disabled","title"],E1=["value"],O1=["value"],z1={class:"flex items-center gap-2 py-1 text-sm text-ink-secondary"},$1={class:"flex items-center gap-3"},I1=["disabled"],N1={key:0,class:"text-xs text-danger-fg"},F1={key:1,class:"text-xs text-ink-muted"},D1={key:1,class:"panel mb-5 p-5"},R1={class:"grid max-w-[520px] gap-2"},B1={class:"flex flex-wrap gap-2"},U1=["value"],V1=["value"],Z1={key:1,class:"text-xs text-ink-muted"},H1={class:"font-semibold text-ink-secondary"},j1={class:"flex items-center gap-3"},W1=["disabled"],K1={key:0,class:"text-xs text-danger-fg"},G1={class:"panel overflow-hidden p-0"},q1={class:"flex items-center justify-between px-5 py-4"},Y1=["disabled"],J1={key:0,class:"px-5 pb-5 text-sm text-danger-fg"},X1={key:1,class:"px-5 pb-8 text-sm text-ink-muted"},Q1={key:2,class:"overflow-x-auto"},eb={class:"w-full border-collapse text-sm"},tb={class:"text-left"},nb={class:"px-5 py-3"},ib={class:"text-ink"},ob={key:0,class:"ml-1.5 text-[11px] text-ink-muted"},sb={class:"px-5 py-3"},ab={class:"px-5 py-3"},rb={class:"px-5 py-3"},lb={class:"px-5 py-3 text-right"},ub=["onClick"],cb={key:1,class:"inline-flex items-center gap-1.5"},db=["onClick"],fb=["onClick"],hb={key:7,class:"mb-5"},pb={key:0,class:"panel mb-5 p-5"},mb={class:"grid max-w-[520px] gap-2"},gb={class:"flex items-center gap-3"},vb={key:0,class:"text-xs text-danger-fg"},_b={key:1,class:"panel mb-5 p-5"},bb={class:"grid max-w-[520px] gap-2"},yb={class:"flex items-center gap-3"},xb=["disabled"],wb={key:0,class:"text-xs text-danger-fg"},kb={class:"panel overflow-hidden p-0"},Sb={key:0,class:"px-5 pb-8 text-sm text-ink-muted"},Tb={key:1,class:"overflow-x-auto"},Pb={class:"w-full border-collapse text-sm"},Cb={class:"text-left"},Lb={class:"px-5 py-3"},Ab={class:"inline-flex items-center gap-2 text-ink"},Mb={class:"px-5 py-3 text-ink-secondary"},Eb={class:"px-5 py-3 text-right"},Ob=["onClick"],zb={key:1,class:"inline-flex items-center gap-1.5"},$b=["onClick"],Ib=["disabled","title","onClick"],Nb={key:8,class:"mb-5"},Fb={class:"panel mb-5 p-5"},Db={class:"btn-ghost cursor-pointer"},Rb={key:0,class:"mt-2 text-xs text-ink-muted"},Bb={class:"rounded-lg border p-5",style:{"border-color":"color-mix(in srgb, var(--danger) 35%, transparent)",background:"var(--danger-soft)"}},Ub={class:"flex items-center gap-2 text-danger-fg"},Vb={class:"mt-4 rounded-lg border border-line bg-surface-1 p-4"},Zb={class:"mt-3 flex items-start gap-2 text-sm text-ink-secondary"},Hb={class:"mt-3"},jb={class:"eyebrow mb-1 block"},Wb={class:"text-ink"},Kb=["placeholder"],Gb={class:"mt-4 flex flex-wrap items-center gap-3"},qb=["disabled"],Yb=["disabled"],Jb={key:2,class:"text-xs text-ink-muted"},Xb={key:0,class:"mt-3 rounded border border-line bg-surface-2 px-3 py-2 text-xs text-ink-secondary"},Qb={key:0,class:"fixed bottom-5 right-5 z-20 flex items-center gap-2 rounded-lg border border-line bg-surface-1 px-4 py-2.5 text-sm text-ink shadow-md"},Lu="pv.opensky.health",Au="pv.filetransfer.health",Mu="pv.webdav.health",Eu="pv.openweather.health",Ou="pv.localstorage.health",ey={__name:"Settings",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},emits:["logout"],setup(t,{emit:i}){const s=t,l=i,u=de(()=>s.role==="superadmin"),f=de(()=>s.role==="admin"||s.role==="superadmin");function h(g){return g==="superadmin"?"Superadmin":g==="admin"?"Admin":"User"}function _(g){return g==="superadmin"||g==="admin"?"shield":"user"}function b(g){return g==="superadmin"||g==="admin"?C.accent:C.neutral}const C={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},T=de(()=>{const g=[{id:"account",label:"Account",icon:"user",kw:"name username email password verification login credentials role"},{id:"appearance",label:"Appearance",icon:"sliders",kw:"theme light dark system language region font size accessibility date time format motion"},{id:"integrations",label:"Integrations",icon:"radio",kw:"opensky flights adsb aircraft plugin oauth credentials bounding box plan connection ftp sftp ftps file transfer server host upload download local storage folder drive isolated private read only webdav nextcloud owncloud dav url https openweather weather forecast temperature api key units calls per minute usage limit quota"},{id:"profile",label:"Profile",icon:"image",kw:"avatar photo display name bio public"},{id:"security",label:"Privacy & Security",icon:"shield",kw:"two factor authentication 2fa sessions devices logout security privacy"}];return f.value&&g.push({id:"team",label:"User management",icon:"users",kw:"users team members add remove create delete role admin permissions rights organization"}),u.value&&g.push({id:"organizations",label:"Organizations",icon:"grid",kw:"organization org tenant company create rename delete members"}),g.push({id:"advanced",label:"Advanced",icon:"alertTriangle",kw:"export import data delete account danger zone",danger:!0}),g}),M=Y("account"),H=Y("");uc("settingsSearch",H);const j=de(()=>H.value.trim().length>0),G=de(()=>H.value.trim().toLowerCase());function N(g){return G.value?(g.label+" "+g.kw).toLowerCase().includes(G.value)||R(g.id):!0}const U={account:["full name","username","email address verification verify","password change current new"],appearance:["theme light dark system","language","region","font size accessibility","reduce motion","date format","time format clock"],integrations:["opensky live flights","enable plugin","oauth client id secret","plan credits","bounding box","test connection","file transfer ftp sftp ftps","server host port username password","private key passphrase","base path directory","local storage folder drive","private isolated folder","read only access mode","webdav nextcloud owncloud dav","server url username password tls","base path directory folder","openweather weather forecast","api key units metric imperial","default latitude longitude language","calls per minute limit usage quota","api call usage today rate limit"],profile:["profile photo avatar","display name","bio about","show email public"],security:["two factor authentication","active sessions devices","sign out"],team:["add user create account","members list role admin remove delete","organization org assign"],organizations:["add organization create","rename organization","delete organization members"],advanced:["export data download","import data upload","delete account permanent danger"]};function R(g){return G.value?(U[g]||[]).some(c=>c.includes(G.value)):!0}const oe=de(()=>j.value?T.value.filter(N):T.value.filter(g=>g.id===M.value)),we=de({get:()=>Oo.value,set:g=>Ha(g)}),ue=[{value:"light",label:"Light",icon:"sun"},{value:"dark",label:"Dark",icon:"moon"},{value:"system",label:"System",icon:"monitor"}],ke=[{value:"sm",label:"Small"},{value:"md",label:"Default"},{value:"lg",label:"Large"}],Ce=[{value:"12",label:"12-hour"},{value:"24",label:"24-hour"}],Le=[["en","English"],["es","Español"],["de","Deutsch"],["fr","Français"],["pl","Polski"],["ja","日本語"]],Ze=Sm(),he=de(()=>(Ze.find(([g])=>g===be.region)||[null,be.region])[1]),ee=[["MDY","MM/DD/YYYY"],["DMY","DD/MM/YYYY"],["YMD","YYYY/MM/DD"],["ISO","YYYY-MM-DD"]],V=Y(Date.now());let O=null;const F=de(()=>Su(V.value)),$=gt({loaded:!1,available:!1,orgEnabled:!0,allowAnonymous:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Ye=Y("user"),Se=gt({clientId:"",clientSecret:"",plan:"",bbox:""}),ge=Y(""),fe=Y(!1),ft=Y(!1),pe=Y(null),Ue=Y(null),Ve=de(()=>pe.value&&pe.value.credits||null),wt=de(()=>{const g=Ve.value;return!g||!g.daily||g.remaining==null?null:Math.max(0,Math.min(100,Math.round(g.remaining/g.daily*100)))}),st=de(()=>{const g=wt.value;return g==null?"bg-accent":g<=10?"bg-danger":g<=30?"bg-amber":"bg-success"});function Me(g){return typeof g=="number"?g.toLocaleString():g}function De(){if(!Ue.value)return"";const g=Math.max(0,Math.round((Date.now()-Ue.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const X=Math.round(c/60);return X<24?`${X} h ago`:`${Math.round(X/24)} d ago`}function zt(){try{pe.value&&localStorage.setItem(Lu,JSON.stringify({health:pe.value,ts:Ue.value}))}catch{}}function At(){try{const g=localStorage.getItem(Lu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(pe.value=c.health,Ue.value=c.ts||null)}catch{}}const Ut=[{value:"",label:"Not set"},{value:"anonymous",label:"Anonymous"},{value:"standard",label:"Standard"},{value:"contributor",label:"Contributor"}],Pt=[{value:"user",label:"My settings",icon:"user"},{value:"org",label:"Organization",icon:"users"}],kt=[{label:"World",options:[{value:"-90,-180,90,180",label:"World"}]},{label:"Continents",options:[{value:"34,-25,72,45",label:"Europe"},{value:"-35,-18,38,52",label:"Africa"},{value:"5,25,82,180",label:"Asia"},{value:"7,-168,72,-52",label:"North America"},{value:"-56,-82,13,-34",label:"South America"},{value:"-48,110,-10,180",label:"Oceania"}]},{label:"European countries",options:km()},{label:"Other countries",options:[{value:"24,-125,49.5,-66.5",label:"United States"},{value:"41.7,-141,83.1,-52.6",label:"Canada"},{value:"-43.6,113.3,-10.7,153.6",label:"Australia"},{value:"24,122.9,45.5,145.8",label:"Japan"}]}],w=kt.flatMap(g=>g.options);function y(g){const c=String(g||"").split(",").map(k=>k.trim());if(c.length!==4)return"";const X=c.map(Number);return X.some(k=>Number.isNaN(k))?"":X.join(",")}function S(g){const c=y(g),X=c&&w.find(k=>y(k.value)===c);return X?X.label:""}const q=Y(!1),W=de({get(){if(!ve.value&&be.autoBbox)return"__auto__";if(q.value)return"__custom__";const g=y(Se.bbox),c=g&&w.find(X=>y(X.value)===g);return c?c.value:"__custom__"},set(g){if(g==="__auto__"){ve.value||(be.autoBbox=!0),q.value=!1;return}if(ve.value||(be.autoBbox=!1),g==="__custom__"){q.value=!0;return}q.value=!1,Se.bbox=g}}),J=de(()=>W.value==="__custom__"),ce=de(()=>W.value==="__auto__"),le=de(()=>$.isSuperadmin),se=de(()=>$.isSuperadmin?"user":Ye.value),te=de(()=>$.scopes[se.value]||{editableLayer:"user",fields:{}}),ve=de(()=>se.value==="org");function re(g){return te.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function Te(g){return le.value||re(g).locked}function Ae(g){const c=re(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function Re(){Se.clientId=re("clientId").own||"",Se.clientSecret=re("clientSecret").own||"",Se.plan=re("plan").own||"",Se.bbox=re("bbox").own||"",q.value=!1}function Ke(g){$.available=!!g.available,$.orgEnabled=g.orgEnabled!==!1,$.allowAnonymous=!!g.allowAnonymous,$.enabled=!!g.enabled,$.canEditOrg=!!g.canEditOrg,$.isSuperadmin=!!g.isSuperadmin,$.scopes=g.scopes||{},Ye.value==="org"&&!$.canEditOrg&&(Ye.value="user"),Re(),$.loaded=!0}Bt(Ye,()=>{ge.value="",Re()});async function Ge(){At();const{ok:g,body:c}=await hp();g&&Ke(c)}async function pt(g){const c=ve.value;c?$.orgEnabled=g:$.enabled=g;const{ok:X,body:k}=await bu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});X?(Ke(k),We(c?g?"OpenSky enabled for your organization.":"OpenSky disabled for your organization.":g?"OpenSky enabled.":"OpenSky disabled.")):(c?$.orgEnabled=!g:$.enabled=!g,We(k.error||"Could not update."))}async function ht(){ge.value="",fe.value=!0;const g={};for(const Be of["clientId","clientSecret","plan","bbox"])Te(Be)||(g[Be]=Se[Be]);const c={scope:se.value,config:g};ve.value||(c.enabled=$.enabled);const{ok:X,body:k}=await bu(c);if(fe.value=!1,!X){ge.value=k.error||"Could not save settings.";return}Ke(k),We(ve.value?"Organization OpenSky settings saved.":"OpenSky settings saved.")}const Vt=[{label:"World",options:[{value:"-90,-180,90,180",label:"World"}]},{label:"Continents",options:[{value:"34,-25,72,45",label:"Europe"},{value:"-35,-18,38,52",label:"Africa"},{value:"5,25,82,180",label:"Asia"},{value:"7,-168,72,-52",label:"North America"},{value:"-56,-82,13,-34",label:"South America"},{value:"-48,110,-10,180",label:"Oceania"}]},...Pm()],Jt=Vt.flatMap(g=>g.options),Zt=Y(""),pn=Y(!1),Ct=de({get(){if(pn.value)return"__custom__";if(!Zt.value)return"__default__";const g=y(Zt.value),c=g&&Jt.find(X=>y(X.value)===g);return c?c.value:"__custom__"},set(g){if(g==="__default__"){pn.value=!1,Zt.value="";return}if(g==="__custom__"){pn.value=!0;return}pn.value=!1,Zt.value=g}}),$t=de(()=>Ct.value==="__custom__");async function kn(){ft.value=!0,pe.value=null;const{ok:g,body:c}=await pp((Zt.value||"").trim()||void 0);ft.value=!1,pe.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},Ue.value=Date.now(),zt()}function zi(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const at=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Sn=Y("user"),$i=["protocol","host","port","username","password","privateKey","keyPassphrase","hostKeyFingerprint","insecureSkipVerify","basePath"],rt=gt(Object.fromEntries($i.map(g=>[g,""]))),hi=Y(""),pi=Y(!1),Ii=Y(!1),Gt=Y(null),jn=Y(null),Z=[{value:"sftp",label:"SFTP"},{value:"ftps",label:"FTPS"},{value:"ftp",label:"FTP"}],E=[{value:"false",label:"Verify certificate"},{value:"true",label:"Skip verification"}],Oe=de(()=>at.isSuperadmin),tt=de(()=>at.isSuperadmin?"user":Sn.value),It=de(()=>at.scopes[tt.value]||{editableLayer:"user",fields:{}}),St=de(()=>tt.value==="org"),Et=de(()=>(_t("protocol")?K("protocol").effective:rt.protocol)||"sftp");function K(g){return It.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function _t(g){return Oe.value||K(g).locked}function bt(g){const c=K(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function oa(g){return(Z.find(c=>c.value===g)||{}).label||g||"—"}function cs(){for(const g of $i)rt[g]=K(g).own||"";rt.protocol||(rt.protocol="sftp"),rt.insecureSkipVerify||(rt.insecureSkipVerify="false")}function no(g){at.available=!!g.available,at.orgEnabled=g.orgEnabled!==!1,at.enabled=!!g.enabled,at.canEditOrg=!!g.canEditOrg,at.isSuperadmin=!!g.isSuperadmin,at.scopes=g.scopes||{},Sn.value==="org"&&!at.canEditOrg&&(Sn.value="user"),cs(),at.loaded=!0}Bt(Sn,()=>{hi.value="",cs()});function sa(){if(!jn.value)return"";const g=Math.max(0,Math.round((Date.now()-jn.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const X=Math.round(c/60);return X<24?`${X} h ago`:`${Math.round(X/24)} d ago`}function Ni(){try{Gt.value&&localStorage.setItem(Au,JSON.stringify({health:Gt.value,ts:jn.value}))}catch{}}function aa(){try{const g=localStorage.getItem(Au);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Gt.value=c.health,jn.value=c.ts||null)}catch{}}async function ir(){aa();const{ok:g,body:c}=await gp();g&&no(c)}async function ra(g){const c=St.value;c?at.orgEnabled=g:at.enabled=g;const{ok:X,body:k}=await yu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});X?(no(k),We(c?g?"File transfer enabled for your organization.":"File transfer disabled for your organization.":g?"File transfer enabled.":"File transfer disabled.")):(c?at.orgEnabled=!g:at.enabled=!g,We(k.error||"Could not update."))}async function or(){hi.value="",pi.value=!0;const g={};for(const Be of $i)_t(Be)||(g[Be]=rt[Be]);const c={scope:tt.value,config:g};St.value||(c.enabled=at.enabled);const{ok:X,body:k}=await yu(c);if(pi.value=!1,!X){hi.value=k.error||"Could not save settings.";return}no(k),We(St.value?"Organization file-transfer settings saved.":"File-transfer settings saved.")}async function sr(){Ii.value=!0,Gt.value=null;const{ok:g,body:c}=await vp();Ii.value=!1,Gt.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},jn.value=Date.now(),Ni()}function la(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const lt=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Wn=Y("user"),ds=["baseURL","username","password","insecureSkipVerify","basePath"],Xt=gt(Object.fromEntries(ds.map(g=>[g,""]))),io=Y(""),zo=Y(!1),$o=Y(!1),Tn=Y(null),$n=Y(null),ua=[{value:"false",label:"Verify certificate"},{value:"true",label:"Skip verification"}],Io=de(()=>lt.isSuperadmin),mi=de(()=>lt.isSuperadmin?"user":Wn.value),it=de(()=>lt.scopes[mi.value]||{editableLayer:"user",fields:{}}),ot=de(()=>mi.value==="org");function Pn(g){return it.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function Cn(g){return Io.value||Pn(g).locked}function qt(g){const c=Pn(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function No(){for(const g of ds)Xt[g]=Pn(g).own||"";Xt.insecureSkipVerify||(Xt.insecureSkipVerify="false")}function He(g){lt.available=!!g.available,lt.orgEnabled=g.orgEnabled!==!1,lt.enabled=!!g.enabled,lt.canEditOrg=!!g.canEditOrg,lt.isSuperadmin=!!g.isSuperadmin,lt.scopes=g.scopes||{},Wn.value==="org"&&!lt.canEditOrg&&(Wn.value="user"),No(),lt.loaded=!0}Bt(Wn,()=>{io.value="",No()});function Lt(){if(!$n.value)return"";const g=Math.max(0,Math.round((Date.now()-$n.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const X=Math.round(c/60);return X<24?`${X} h ago`:`${Math.round(X/24)} d ago`}function fs(){try{Tn.value&&localStorage.setItem(Mu,JSON.stringify({health:Tn.value,ts:$n.value}))}catch{}}function Fo(){try{const g=localStorage.getItem(Mu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Tn.value=c.health,$n.value=c.ts||null)}catch{}}async function mn(){Fo();const{ok:g,body:c}=await yp();g&&He(c)}async function ca(g){const c=ot.value;c?lt.orgEnabled=g:lt.enabled=g;const{ok:X,body:k}=await xu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});X?(He(k),We(c?g?"WebDAV enabled for your organization.":"WebDAV disabled for your organization.":g?"WebDAV enabled.":"WebDAV disabled.")):(c?lt.orgEnabled=!g:lt.enabled=!g,We(k.error||"Could not update."))}async function Do(){io.value="",zo.value=!0;const g={};for(const Be of ds)Cn(Be)||(g[Be]=Xt[Be]);const c={scope:mi.value,config:g};ot.value||(c.enabled=lt.enabled);const{ok:X,body:k}=await xu(c);if(zo.value=!1,!X){io.value=k.error||"Could not save settings.";return}He(k),We(ot.value?"Organization WebDAV settings saved.":"WebDAV settings saved.")}async function gi(){$o.value=!0,Tn.value=null;const{ok:g,body:c}=await xp();$o.value=!1,Tn.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},$n.value=Date.now(),fs()}function Mt(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const Xe=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),In=Y("user"),vi=["apiKey","units","lat","lon","lang","callsPerMinute"],Ht=gt(Object.fromEntries(vi.map(g=>[g,""]))),Kn=Y(""),Fi=Y(!1),Di=Y(!1),Qt=Y(null),Gn=Y(null),Ro=[{value:"",label:"Not set"},{value:"metric",label:"Metric (°C)"},{value:"imperial",label:"Imperial (°F)"},{value:"standard",label:"Standard (K)"}],Ri=de(()=>Xe.isSuperadmin),Bo=de(()=>Xe.isSuperadmin?"user":In.value),hs=de(()=>Xe.scopes[Bo.value]||{editableLayer:"user",fields:{}}),Ln=de(()=>Bo.value==="org");function Ie(g){return hs.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function jt(g){return Ri.value||Ie(g).locked}function Je(g){const c=Ie(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function ps(){for(const g of vi)Ht[g]=Ie(g).own||""}function oo(g){Xe.available=!!g.available,Xe.orgEnabled=g.orgEnabled!==!1,Xe.enabled=!!g.enabled,Xe.canEditOrg=!!g.canEditOrg,Xe.isSuperadmin=!!g.isSuperadmin,Xe.scopes=g.scopes||{},In.value==="org"&&!Xe.canEditOrg&&(In.value="user"),ps(),Xe.loaded=!0}Bt(In,()=>{Kn.value="",ps()});function Uo(){if(!Gn.value)return"";const g=Math.max(0,Math.round((Date.now()-Gn.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const X=Math.round(c/60);return X<24?`${X} h ago`:`${Math.round(X/24)} d ago`}function ms(){try{Qt.value&&localStorage.setItem(Eu,JSON.stringify({health:Qt.value,ts:Gn.value}))}catch{}}function _i(){try{const g=localStorage.getItem(Eu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Qt.value=c.health,Gn.value=c.ts||null)}catch{}}async function gs(){_i();const{ok:g,body:c}=await wp();g&&oo(c)}async function Bi(g){const c=Ln.value;c?Xe.orgEnabled=g:Xe.enabled=g;const{ok:X,body:k}=await wu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});X?(oo(k),We(c?g?"OpenWeather enabled for your organization.":"OpenWeather disabled for your organization.":g?"OpenWeather enabled.":"OpenWeather disabled.")):(c?Xe.orgEnabled=!g:Xe.enabled=!g,We(k.error||"Could not update."))}async function Dt(){Kn.value="",Fi.value=!0;const g={};for(const Be of vi)jt(Be)||(g[Be]=Ht[Be]);const c={scope:Bo.value,config:g};Ln.value||(c.enabled=Xe.enabled);const{ok:X,body:k}=await wu(c);if(Fi.value=!1,!X){Kn.value=k.error||"Could not save settings.";return}oo(k),We(Ln.value?"Organization OpenWeather settings saved.":"OpenWeather settings saved.")}async function bi(){Di.value=!0,Qt.value=null;const{ok:g,body:c}=await kp();Di.value=!1,Qt.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},Gn.value=Date.now(),ms()}function da(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const Ui=de(()=>Qt.value&&Qt.value.usage||null),vs=de(()=>{const g=Ui.value;return!g||!g.minuteLimit?null:Math.max(0,Math.min(100,Math.round(g.minuteUsed/g.minuteLimit*100)))}),fa=de(()=>{const g=vs.value;return g==null?"bg-accent":g>=90?"bg-danger":g>=70?"bg-amber":"bg-success"}),Ee=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,isOrgUser:!1,mounts:[],privateFolder:!1,privateEnabled:!1,allowPrivate:!0,rootConfigured:!1,scopes:{}}),Vi=Y("user"),so=Y(""),qe=Y(""),Vo=Y(!1),en=Y(!1),ln=Y(null),yi=Y(null),ao=Y({}),Zo=[{value:"",label:"Inherit"},{value:"false",label:"Read-write"},{value:"true",label:"Read-only"}],_s=de(()=>Ee.isSuperadmin),Ho=de(()=>Ee.isSuperadmin?"user":Vi.value),ar=de(()=>Ee.scopes[Ho.value]||{editableLayer:"user",fields:{}}),gn=de(()=>Ho.value==="org");function Zi(g){return ar.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function ha(g){return _s.value||Zi(g).locked}function An(g){const c=Zi(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function rr(g){return(Zo.find(c=>c.value===g)||{}).label||"Inherit"}function bs(){so.value=Zi("readOnly").own||""}function vn(g){Ee.available=!!g.available,Ee.orgEnabled=g.orgEnabled!==!1,Ee.enabled=!!g.enabled,Ee.canEditOrg=!!g.canEditOrg,Ee.isSuperadmin=!!g.isSuperadmin,Ee.isOrgUser=!!g.isOrgUser,Ee.mounts=Array.isArray(g.mounts)?g.mounts:[],Ee.privateFolder=!!g.privateFolder,Ee.privateEnabled=!!g.privateEnabled,Ee.allowPrivate=g.allowPrivate!==!1,Ee.rootConfigured=!!g.rootConfigured,Ee.scopes=g.scopes||{},Vi.value==="org"&&!Ee.canEditOrg&&(Vi.value="user"),bs(),Ee.loaded=!0}Bt(Vi,()=>{qe.value="",bs()});function pa(){if(!yi.value)return"";const g=Math.max(0,Math.round((Date.now()-yi.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const X=Math.round(c/60);return X<24?`${X} h ago`:`${Math.round(X/24)} d ago`}function ma(){try{ln.value&&localStorage.setItem(Ou,JSON.stringify({health:ln.value,ts:yi.value}))}catch{}}function ys(){try{const g=localStorage.getItem(Ou);if(!g)return;const c=JSON.parse(g);c&&c.health&&(ln.value=c.health,yi.value=c.ts||null)}catch{}}async function lr(){ys();const{ok:g,body:c}=await _p();g&&vn(c)}async function xs(g){const c=gn.value;c?Ee.orgEnabled=g:Ee.enabled=g;const{ok:X,body:k}=await Ma(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});X?(vn(k),We(c?g?"Local storage enabled for your organization.":"Local storage disabled for your organization.":g?"Local storage enabled.":"Local storage disabled.")):(c?Ee.orgEnabled=!g:Ee.enabled=!g,We(k.error||"Could not update."))}async function ga(g){Ee.privateFolder=g;const{ok:c,body:X}=await Ma({scope:"user",privateFolder:g});c?(vn(X),We(g?"Private folder enabled.":"Private folder disabled.")):(Ee.privateFolder=!g,We(X.error||"Could not update."))}async function ur(g){Ee.allowPrivate=g;const{ok:c,body:X}=await Ma({scope:"org",allowPrivate:g});c?(vn(X),We(g?"Members may now create private folders.":"Private folders disabled for your organization.")):(Ee.allowPrivate=!g,We(X.error||"Could not update."))}async function cr(){qe.value="",Vo.value=!0;const g={};ha("readOnly")||(g.readOnly=so.value);const c={scope:Ho.value,config:g};gn.value||(c.enabled=Ee.enabled);const{ok:X,body:k}=await Ma(c);if(Vo.value=!1,!X){qe.value=k.error||"Could not save settings.";return}vn(k),We(gn.value?"Organization local-storage settings saved.":"Local-storage settings saved.")}async function ws(){en.value=!0,ln.value=null,ao.value={};const{ok:g,body:c}=await bp();en.value=!1,ln.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."};const X={};if(Array.isArray(c.mounts))for(const k of c.mounts)X[k.id]={status:k.status,detail:k.detail};ao.value=X,yi.value=Date.now(),ma()}function va(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const _a=[{id:"apis-external",label:"APIs — External",icon:"globe"},{id:"drives-external",label:"Drives — External",icon:"server"},{id:"drives-local",label:"Drives — Local",icon:"monitor"}],jo=Y("apis-external");function Hi(g){return j.value||jo.value===g}const Nn=Y("");let ks=null;function We(g){Nn.value=g,clearTimeout(ks),ks=setTimeout(()=>Nn.value="",2200)}const yt=gt({current:"",next:"",confirm:""}),xi=Y(""),Ss=Y(!1);function dr(){if(Ss.value=!1,!yt.current)return xi.value="Enter your current password.";if(yt.next.length<8)return xi.value="New password must be at least 8 characters.";if(yt.next!==yt.confirm)return xi.value="New passwords do not match.";xi.value="Validated. Connecting to the account service is pending — no password endpoint yet.",yt.current=yt.next=yt.confirm=""}const ro=Y("");function Ts(){ro.value="Verification link would be sent once the account service is wired up."}function fr(g){const c=g.target.files&&g.target.files[0];if(!c)return;if(c.size>1.5*1024*1024){We("Image too large (max ~1.5 MB).");return}const X=new FileReader;X.onload=()=>{be.avatar=String(X.result),We("Photo updated.")},X.readAsDataURL(c)}function hr(){be.avatar="",We("Photo removed.")}const ba=de(()=>{var X,k,Be;const c=(be.displayName||be.name||s.email||"PV").split("@")[0].split(/[.\-_ ]+/).filter(Boolean);return((((X=c[0])==null?void 0:X[0])||"P")+(((k=c[1])==null?void 0:k[0])||((Be=c[0])==null?void 0:Be[1])||"V")).toUpperCase()}),lo=Y(!1),_n=Y(""),qn=Y(""),uo=Y(""),bn=Y([]);function Ps(g){const c="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";let X="";for(let k=0;kPs(4).toLowerCase()+"-"+Ps(4).toLowerCase()),uo.value=""}function co(){be.twoFactor=!1,bn.value=[],lo.value=!1}const Mn=navigator.userAgent;function Wo(){return/Edg\//.test(Mn)?"Edge":/OPR\//.test(Mn)?"Opera":/Chrome\//.test(Mn)?"Chrome":/Firefox\//.test(Mn)?"Firefox":/Safari\//.test(Mn)?"Safari":"Browser"}function mr(){return/Windows/.test(Mn)?"Windows":/Mac OS X/.test(Mn)?"macOS":/Android/.test(Mn)?"Android":/iPhone|iPad/.test(Mn)?"iOS":/Linux/.test(Mn)?"Linux":"Unknown OS"}const ni=Date.now(),wi=Y([]),fo=Y(!1),Wi=Y(""),Rt=gt({email:"",password:"",role:"user",organization:""}),tn=Y(""),Ko=Y(!1),Fn=Y(""),ya=de(()=>{const g=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];return u.value&&g.push({value:"superadmin",label:"Superadmin"}),g}),yn=Y([]);async function ii(){if(!f.value)return;const g=await rp();g.ok&&(yn.value=g.organizations.slice().sort((c,X)=>c.name.localeCompare(X.name)))}const Cs=de(()=>{const g=yn.value.map(c=>({value:c.id,label:c.name}));return u.value&&g.unshift({value:"",label:"No organization"}),g});async function oi(){if(!f.value)return;fo.value=!0,Wi.value="";const g=await ip();if(fo.value=!1,!g.ok){Wi.value=g.status===403?"Manager role required.":"Could not load users.";return}wi.value=g.users.slice().sort((c,X)=>c.email.localeCompare(X.email))}function ki(g){try{const c=g.data||{},X=Object.keys(c)[0];return X&&c[X]&&c[X].message||g.message||g.error||"Invalid input."}catch{return g.error||"Could not create user."}}async function Ls(){tn.value="";const g=Rt.email.trim().toLowerCase();if(!g.includes("@"))return tn.value="Enter a valid email.";if(Rt.password.length<8)return tn.value="Password must be at least 8 characters.";Ko.value=!0;const c=u.value?Rt.organization:s.organization,{ok:X,body:k}=await op(g,Rt.password,Rt.role,c);if(Ko.value=!1,!X)return tn.value=ki(k);Rt.email="",Rt.password="",Rt.role="user",Rt.organization="",We("User created."),oi()}async function Go(g){const{ok:c,body:X}=await ap(g.id);if(Fn.value="",!c)return We(X.error||"Could not remove user.");We("User removed."),oi()}const Qe=gt({id:"",email:"",role:"user",verified:!1,password:"",organization:""}),En=Y(""),Ki=Y(!1),qo=de(()=>!!Qe.id&&Qe.email===s.email);function gr(g){Fn.value="",Qe.id=g.id,Qe.email=g.email,Qe.role=g.role||"user",Qe.verified=!!g.verified,Qe.password="",Qe.organization=g.organization||"",En.value=""}function ho(){Qe.id="",En.value=""}async function vr(){En.value="";const g=Qe.email.trim().toLowerCase();if(!g.includes("@"))return En.value="Enter a valid email.";if(Qe.password&&Qe.password.length<8)return En.value="New password must be at least 8 characters (or leave blank).";const c={email:g,role:Qe.role,verified:Qe.verified};u.value&&(c.organization=Qe.organization),Qe.password&&(c.password=Qe.password),Ki.value=!0;const{ok:X,body:k}=await sp(Qe.id,c);if(Ki.value=!1,!X)return En.value=ki(k);We("User updated."),ho(),oi()}const po=gt({name:""}),mo=Y(""),go=Y(!1),vo=Y(""),Nt=gt({id:"",name:""}),Dn=Y(""),As=de(()=>{const g={};for(const c of wi.value)c.organization&&(g[c.organization]=(g[c.organization]||0)+1);return g});async function _o(){mo.value="";const g=po.name.trim();if(!g)return mo.value="Enter an organization name.";go.value=!0;const{ok:c,body:X}=await lp(g);if(go.value=!1,!c)return mo.value=ki(X);po.name="",We("Organization created."),ii()}function _r(g){vo.value="",Nt.id=g.id,Nt.name=g.name,Dn.value=""}function Ms(){Nt.id="",Dn.value=""}async function xa(){Dn.value="";const g=Nt.name.trim();if(!g)return Dn.value="Enter an organization name.";const{ok:c,body:X}=await up(Nt.id,g);if(!c)return Dn.value=ki(X);We("Organization renamed."),Ms(),ii(),oi()}async function bo(g){const{ok:c,body:X}=await cp(g.id);if(vo.value="",!c)return We(X.error||"Could not delete organization.");We("Organization deleted."),ii()}function br(){const g={_app:"PilotVault",_kind:"settings-export",exportedAt:new Date().toISOString(),email:s.email,prefs:{...be},themeMode:Oo.value},c=new Blob([JSON.stringify(g,null,2)],{type:"application/json"}),X=URL.createObjectURL(c),k=document.createElement("a");k.href=X,k.download=`pilotvault-settings-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(k),k.click(),k.remove(),URL.revokeObjectURL(X),We("Settings exported.")}const Yn=Y("");function wa(g){const c=g.target.files&&g.target.files[0];if(!c)return;const X=new FileReader;X.onload=()=>{try{const k=JSON.parse(String(X.result)),Be=k.prefs||k;if(!ed(Be))throw new Error("bad shape");k.themeMode&&Ha(k.themeMode),ml(be.fontSize),gl(be.reduceMotion),Yn.value="Settings imported and applied."}catch{Yn.value="That file is not a valid PilotVault settings export."}},X.readAsText(c),g.target.value=""}const mt=gt({understand:!1,typed:"",cooldown:0,armed:!1,msg:""});let yo=null;const On=de(()=>s.email||"DELETE MY ACCOUNT"),Yo=de(()=>mt.understand&&mt.typed===On.value);function ka(){Yo.value&&(mt.armed=!0,mt.cooldown=5,clearInterval(yo),yo=setInterval(()=>{mt.cooldown--,mt.cooldown<=0&&clearInterval(yo)},1e3))}Bt(Yo,g=>{!g&&mt.armed&&(mt.armed=!1,mt.cooldown=0,clearInterval(yo))});function xo(){if(!(!mt.armed||mt.cooldown>0)){try{localStorage.removeItem("pv_prefs")}catch{}mt.msg="Account deletion requires the account service. Local data was cleared and you were signed out.",setTimeout(()=>l("logout"),900)}}return ti(()=>{O=setInterval(()=>V.value=Date.now(),1e3),ii(),oi(),Ge(),ir(),mn(),gs(),lr()}),us(()=>{clearInterval(O),clearInterval(yo),clearTimeout(ks)}),(g,c)=>(p(),m("div",Lm,[a("div",Am,[c[72]||(c[72]=a("div",null,[a("div",{class:"eyebrow"},"Preferences"),a("h2",{class:"mt-0.5 text-[22px] font-bold tracking-tightest text-ink"},"Settings")],-1)),a("div",Mm,[A(Q,{name:"search",size:16,class:"text-ink-muted"}),ie(a("input",{"onUpdate:modelValue":c[0]||(c[0]=X=>H.value=X),placeholder:"Search settings…",class:"w-full border-none bg-transparent text-sm text-ink outline-none placeholder:text-ink-muted"},null,512),[[me,H.value]]),H.value?(p(),m("button",{key:0,class:"text-ink-muted hover:text-ink","aria-label":"Clear search",onClick:c[1]||(c[1]=X=>H.value="")},[A(Q,{name:"x",size:15})])):I("",!0)])]),a("div",Em,[ie(a("nav",Om,[(p(!0),m(ae,null,ze(T.value,X=>(p(),m("button",{key:X.id,class:Pe(["flex items-center gap-2.5 rounded px-3 py-2.5 text-left text-sm transition",[M.value===X.id?X.danger?"bg-danger-soft font-semibold text-danger-fg":"bg-accent-soft font-semibold text-accent-soft-fg":X.danger?"font-medium text-danger-fg hover:bg-danger-soft":"font-medium text-ink-secondary hover:bg-surface-2"]]),onClick:k=>M.value=X.id},[A(Q,{name:X.icon,size:17},null,8,["name"]),a("span",$m,x(X.label),1)],10,zm))),128))],512),[[kh,!j.value]]),a("div",Im,[j.value&&!oe.value.length?(p(),m("div",Nm," No settings match “"+x(H.value)+"”. ",1)):I("",!0),(p(!0),m(ae,null,ze(oe.value,X=>(p(),m(ae,{key:X.id},[j.value?(p(),m("div",Fm,[A(Q,{name:X.icon,size:14},null,8,["name"]),z(" "+x(X.label),1)])):I("",!0),X.id==="account"?(p(),m("div",Dm,[A(xe,{title:"Full name",desc:"Shown to your team on flights and audit logs.",keywords:"full name account"},{default:ye(()=>[ie(a("input",{"onUpdate:modelValue":c[2]||(c[2]=k=>$e(be).name=k),class:"field w-56",placeholder:"Jane Operator",onBlur:c[3]||(c[3]=k=>We("Saved."))},null,544),[[me,$e(be).name]])]),_:1}),A(xe,{title:"Username",desc:"Your unique handle within PilotVault.",keywords:"username handle"},{default:ye(()=>[a("div",Rm,[c[73]||(c[73]=a("span",{class:"text-sm text-ink-muted"},"@",-1)),ie(a("input",{"onUpdate:modelValue":c[4]||(c[4]=k=>$e(be).username=k),class:"field w-48",placeholder:"jane",onBlur:c[5]||(c[5]=k=>We("Saved."))},null,544),[[me,$e(be).username]])])]),_:1}),A(xe,{title:"Email address",desc:"Used for sign-in and notifications.",keywords:"email verification verify"},{default:ye(()=>[a("div",Bm,[a("span",Um,x(t.email||"—"),1),a("span",Vm,[A(Q,{name:"mail",size:12}),c[74]||(c[74]=z(" Unverified ",-1))])])]),_:1}),A(xe,{title:"Role",desc:"Your access level in PilotVault.",keywords:"role admin user superadmin access rights permissions"},{default:ye(()=>[a("span",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",b(t.role)])},[A(Q,{name:_(t.role),size:12},null,8,["name"]),z(x(h(t.role)),1)],2)]),_:1}),A(xe,{title:"Organization",desc:"The organization your account belongs to.",keywords:"organization org tenant company"},{default:ye(()=>[a("span",{class:Pe(["text-sm",t.organizationName?"text-ink":"text-ink-muted"])},x(t.organizationName||(u.value?"All organizations":"None")),3)]),_:1}),A(xe,{block:"",title:"Verify email",desc:"Confirm ownership to enable password resets and alerts.",keywords:"verify email resend"},{default:ye(()=>[a("button",{class:"btn-ghost",onClick:Ts},"Send verification link"),ro.value?(p(),m("p",Zm,x(ro.value),1)):I("",!0)]),_:1}),A(xe,{block:"",title:"Change password",desc:"Use at least 8 characters.",keywords:"password change current new"},{default:ye(()=>[a("div",Hm,[ie(a("input",{"onUpdate:modelValue":c[6]||(c[6]=k=>yt.current=k),type:"password",class:"field",placeholder:"Current password"},null,512),[[me,yt.current]]),ie(a("input",{"onUpdate:modelValue":c[7]||(c[7]=k=>yt.next=k),type:"password",class:"field",placeholder:"New password"},null,512),[[me,yt.next]]),ie(a("input",{"onUpdate:modelValue":c[8]||(c[8]=k=>yt.confirm=k),type:"password",class:"field",placeholder:"Confirm new password"},null,512),[[me,yt.confirm]]),a("div",jm,[a("button",{class:"btn-accent",onClick:dr},"Update password"),xi.value?(p(),m("span",{key:0,class:Pe(["text-xs",Ss.value?"text-success-fg":"text-ink-muted"])},x(xi.value),3)):I("",!0)])])]),_:1})])):X.id==="appearance"?(p(),m("div",Wm,[A(xe,{title:"Theme",desc:"Light, dark, or follow your system.",keywords:"theme light dark system appearance"},{default:ye(()=>[A(wn,{modelValue:we.value,"onUpdate:modelValue":c[9]||(c[9]=k=>we.value=k),options:ue},null,8,["modelValue"])]),_:1}),A(xe,{title:"Font size",desc:"Scales the entire interface for readability.",keywords:"font size accessibility text"},{default:ye(()=>[A(wn,{modelValue:$e(be).fontSize,"onUpdate:modelValue":c[10]||(c[10]=k=>$e(be).fontSize=k),options:ke},null,8,["modelValue"])]),_:1}),A(xe,{title:"Reduce motion",desc:"Minimise animations and transitions.",keywords:"reduce motion accessibility animation"},{default:ye(()=>[A(nn,{modelValue:$e(be).reduceMotion,"onUpdate:modelValue":c[11]||(c[11]=k=>$e(be).reduceMotion=k)},null,8,["modelValue"])]),_:1}),A(xe,{title:"Language",desc:"Interface language.",keywords:"language locale"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[12]||(c[12]=k=>$e(be).language=k),class:"field w-48"},[(p(),m(ae,null,ze(Le,([k,Be])=>a("option",{key:k,value:k},x(Be),9,Km)),64))],512),[[Ot,$e(be).language]])]),_:1}),A(xe,{title:"Region",desc:"Affects number, unit and date defaults.",keywords:"region country locale"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[13]||(c[13]=k=>$e(be).region=k),class:"field w-48"},[(p(!0),m(ae,null,ze($e(Ze),([k,Be])=>(p(),m("option",{key:k,value:k},x(Be),9,Gm))),128))],512),[[Ot,$e(be).region]])]),_:1}),A(xe,{title:"Date format",desc:"How calendar dates are displayed.",keywords:"date format"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[14]||(c[14]=k=>$e(be).dateFormat=k),class:"field w-48"},[(p(),m(ae,null,ze(ee,([k,Be])=>a("option",{key:k,value:k},x(Be),9,qm)),64))],512),[[Ot,$e(be).dateFormat]])]),_:1}),A(xe,{title:"Time format",desc:"12- or 24-hour clock.",keywords:"time format clock 12 24 hour"},{default:ye(()=>[A(wn,{modelValue:$e(be).timeFormat,"onUpdate:modelValue":c[15]||(c[15]=k=>$e(be).timeFormat=k),options:Ce},null,8,["modelValue"])]),_:1}),A(xe,{title:"Preview",desc:"How timestamps appear across the app.",keywords:"preview date time"},{default:ye(()=>[a("span",Ym,x(F.value),1)]),_:1}),c[75]||(c[75]=a("p",{class:"mt-3 text-xs text-ink-muted"}," Language & region are stored now; full localisation ships with the account service. ",-1))])):X.id==="integrations"?(p(),m("div",Jm,[j.value?I("",!0):(p(),m("div",Xm,[(p(),m(ae,null,ze(_a,k=>a("button",{key:k.id,type:"button",class:Pe(["-mb-px inline-flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm font-semibold transition",jo.value===k.id?"border-accent text-ink":"border-transparent text-ink-secondary hover:text-ink"]),onClick:Be=>jo.value=k.id},[A(Q,{name:k.icon,size:16},null,8,["name"]),z(x(k.label),1)],10,Qm)),64))])),Hi("apis-external")?(p(),m(ae,{key:1},[a("div",eg,[a("div",tg,[a("div",ng,[A(Q,{name:"radio",size:20})]),c[76]||(c[76]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"OpenSky Network"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Live ADS-B aircraft data. Configure your own OAuth2 credentials, plan and default bounding box. ")],-1))]),$.loaded&&!$.available?(p(),m("div",ig,[A(Q,{name:"lock",size:14,class:"mr-1 inline"}),c[77]||(c[77]=z(" OpenSky is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),$.canEditOrg?(p(),m("div",og,[c[78]||(c[78]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Ye.value,"onUpdate:modelValue":c[16]||(c[16]=k=>Ye.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),ve.value?(p(),nt(xe,{key:2,title:"Enable OpenSky (organization-wide)",desc:"Turn OpenSky on or off for everyone in your organization.",keywords:"enable disable plugin opensky organization"},{default:ye(()=>[A(nn,{"model-value":$.orgEnabled,disabled:!$.available,"onUpdate:modelValue":pt},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable OpenSky",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin opensky"},{default:ye(()=>[A(nn,{"model-value":$.enabled,disabled:!$.available||!$.orgEnabled,"onUpdate:modelValue":pt},null,8,["model-value","disabled"])]),_:1})),!ve.value&&$.available&&!$.orgEnabled?(p(),m("div",sg,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[80]||(c[80]=z("OpenSky is turned off for your organization",-1)),$.canEditOrg?(p(),m("span",ag,[...c[79]||(c[79]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[81]||(c[81]=z(". ",-1))])):I("",!0),ve.value?(p(),m("div",rg,[A(Q,{name:"users",size:13,class:"mr-1 inline"}),c[82]||(c[82]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",lg,x(t.organizationName||"your organization"),1),c[83]||(c[83]=z(". Leave a field blank to let each user choose their own; a value set here overrides the user's. ",-1))])):le.value?(p(),m("div",ug," As a superadmin you manage the global OpenSky configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),$.available&&!ve.value?(p(),m("div",cg,[a("div",dg,[a("div",fg,[A(Q,{name:"signal",size:15}),c[84]||(c[84]=z("Credit usage ",-1))]),Ue.value?(p(),m("span",hg,"Checked "+x(De()),1)):I("",!0)]),Ve.value?(p(),m(ae,{key:0},[Ve.value.remaining!=null?(p(),m(ae,{key:0},[a("div",pg,[a("span",mg,x(Me(Ve.value.remaining)),1),a("span",gg,"/ "+x(Me(Ve.value.daily))+" credits left today",1)]),a("div",vg,[a("div",{class:Pe(["h-full rounded-full transition-all",st.value]),style:Eo({width:wt.value+"%"})},null,6)]),a("div",_g," Used "+x(Me(Ve.value.daily-Ve.value.remaining))+" today · "+x(Ve.value.probeCost)+" credit"+x(Ve.value.probeCost===1?"":"s")+" per query · "+x(Ve.value.mode),1)],64)):(p(),m(ae,{key:1},[a("div",bg,[c[85]||(c[85]=z("Daily allowance: ",-1)),a("span",yg,x(Me(Ve.value.daily)),1),c[86]||(c[86]=z(" credits",-1))]),a("div",xg,x(Ve.value.probeCost)+" credit"+x(Ve.value.probeCost===1?"":"s")+" per query · "+x(Ve.value.mode)+". OpenSky only reports live remaining credits for authenticated requests — add OAuth2 credentials below to track usage. ",1)],64))],64)):(p(),m("div",wg,[...c[87]||(c[87]=[z(" Run ",-1),a("span",{class:"font-semibold text-ink-secondary"},"Test connection",-1),z(" below to fetch your live OpenSky credit balance. ",-1)])]))])):I("",!0),A(xe,{title:"OpenSky plan",desc:"Your account tier — sets the daily credit allowance.",keywords:"plan tier credits"},{default:ye(()=>[Te("plan")?(p(),m("span",kg,[z(x((Ut.find(k=>k.value===re("plan").effective)||{}).label||re("plan").effective||"—")+" ",1),Ae("plan")?(p(),m("span",Sg,[A(Q,{name:"lock",size:10}),z(x(Ae("plan")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:Se.plan,"onUpdate:modelValue":c[17]||(c[17]=k=>Se.plan=k),options:Ut},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Default bounding box",desc:"Automatic follows your location; or pick a region, or enter lamin,lomin,lamax,lomax by hand.",keywords:"bounding box bbox area region country continent world europe custom coordinates automatic location drone"},{default:ye(()=>[Te("bbox")?(p(),m("span",Tg,[z(x(S(re("bbox").effective)||re("bbox").effective||"—")+" ",1),Ae("bbox")?(p(),m("span",Pg,[A(Q,{name:"lock",size:10}),z(x(Ae("bbox")),1)])):I("",!0)])):(p(),m("div",Cg,[ie(a("select",{"onUpdate:modelValue":c[18]||(c[18]=k=>W.value=k),class:"field w-64"},[ve.value?I("",!0):(p(),m("option",Lg,"Automatic (by location)")),(p(),m(ae,null,ze(kt,k=>a("optgroup",{key:k.label,label:k.label},[(p(!0),m(ae,null,ze(k.options,Be=>(p(),m("option",{key:Be.value,value:Be.value},x(Be.label),9,Mg))),128))],8,Ag)),64)),c[88]||(c[88]=a("option",{value:"__custom__"},"Custom…",-1))],512),[[Ot,W.value]]),ce.value?(p(),m("p",Eg," Live map follows drone location → your device location → your Region ("+x(he.value)+"). ",1)):I("",!0),J.value?ie((p(),m("input",{key:1,"onUpdate:modelValue":c[19]||(c[19]=k=>Se.bbox=k),class:"field w-64 font-mono",placeholder:"50.5,3.2,53.7,7.3"},null,512)),[[me,Se.bbox]]):I("",!0)]))]),_:1}),A(xe,{title:"OAuth2 client ID",desc:"Optional — leave blank for anonymous access (lower limits).",keywords:"oauth client id credentials"},{default:ye(()=>[Te("clientId")?(p(),m("span",Og,[z(x(re("clientId").effective||"—")+" ",1),Ae("clientId")?(p(),m("span",zg,[A(Q,{name:"lock",size:10}),z(x(Ae("clientId")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[20]||(c[20]=k=>Se.clientId=k),class:"field w-64",placeholder:"your-api-client"},null,512)),[[me,Se.clientId]])]),_:1}),A(xe,{title:"OAuth2 client secret",desc:"Paired with the client ID for authenticated access.",keywords:"oauth client secret credentials password"},{default:ye(()=>[Te("clientSecret")?(p(),m("span",$g,[z(x(re("clientSecret").effective||"—")+" ",1),Ae("clientSecret")?(p(),m("span",Ig,[A(Q,{name:"lock",size:10}),z(x(Ae("clientSecret")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[21]||(c[21]=k=>Se.clientSecret=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,Se.clientSecret]])]),_:1}),$.available&&!$.allowAnonymous?(p(),m("div",Ng," Anonymous access is disabled by the administrator — OpenSky needs OAuth2 credentials from some layer to work. ")):I("",!0),a("div",Fg,[le.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:fe.value||!$.available,onClick:ht},x(fe.value?"Saving…":ve.value?"Save organization settings":"Save settings"),9,Dg)),ve.value?I("",!0):(p(),m("div",Rg,[c[91]||(c[91]=a("label",{class:"text-xs text-ink-muted"},"Test area",-1)),ie(a("select",{"onUpdate:modelValue":c[22]||(c[22]=k=>Ct.value=k),class:"field w-44"},[c[89]||(c[89]=a("option",{value:"__default__"},"Default bounding box",-1)),(p(),m(ae,null,ze(Vt,k=>a("optgroup",{key:k.label,label:k.label},[(p(!0),m(ae,null,ze(k.options,Be=>(p(),m("option",{key:Be.value,value:Be.value},x(Be.label),9,Ug))),128))],8,Bg)),64)),c[90]||(c[90]=a("option",{value:"__custom__"},"Custom…",-1))],512),[[Ot,Ct.value]]),$t.value?ie((p(),m("input",{key:0,"onUpdate:modelValue":c[23]||(c[23]=k=>Zt.value=k),class:"field w-44 font-mono",placeholder:"lamin,lomin,lamax,lomax"},null,512)),[[me,Zt.value]]):I("",!0)])),ve.value?I("",!0):(p(),m("button",{key:2,class:"btn-ghost",disabled:ft.value||!$.available,onClick:kn},x(ft.value?"Testing…":"Test connection"),9,Vg)),ge.value?(p(),m("span",Zg,x(ge.value),1)):I("",!0),pe.value&&!ve.value?(p(),m("span",{key:4,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",zi(pe.value.status)])},[c[92]||(c[92]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(pe.value.detail||pe.value.status),1)],2)):I("",!0)])]),a("div",Hg,[a("div",jg,[a("div",Wg,[A(Q,{name:"sun",size:20})]),c[93]||(c[93]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"OpenWeather"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Current conditions and forecast from the OpenWeather API. Configure the API key and default location your account uses. ")],-1))]),Xe.loaded&&!Xe.available?(p(),m("div",Kg,[A(Q,{name:"lock",size:14,class:"mr-1 inline"}),c[94]||(c[94]=z(" OpenWeather is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),Xe.canEditOrg?(p(),m("div",Gg,[c[95]||(c[95]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:In.value,"onUpdate:modelValue":c[24]||(c[24]=k=>In.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),Ln.value?(p(),nt(xe,{key:2,title:"Enable OpenWeather (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin openweather weather organization"},{default:ye(()=>[A(nn,{"model-value":Xe.orgEnabled,disabled:!Xe.available,"onUpdate:modelValue":Bi},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable OpenWeather",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin openweather weather"},{default:ye(()=>[A(nn,{"model-value":Xe.enabled,disabled:!Xe.available||!Xe.orgEnabled,"onUpdate:modelValue":Bi},null,8,["model-value","disabled"])]),_:1})),!Ln.value&&Xe.available&&!Xe.orgEnabled?(p(),m("div",qg,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[97]||(c[97]=z("OpenWeather is turned off for your organization",-1)),Xe.canEditOrg?(p(),m("span",Yg,[...c[96]||(c[96]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[98]||(c[98]=z(". ",-1))])):I("",!0),Ln.value?(p(),m("div",Jg,[A(Q,{name:"users",size:13,class:"mr-1 inline"}),c[99]||(c[99]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",Xg,x(t.organizationName||"your organization"),1),c[100]||(c[100]=z(". Leave the API key blank to let each user configure their own; a key set here overrides the user's. ",-1))])):Ri.value?(p(),m("div",Qg," As a superadmin you manage the global OpenWeather configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{title:"API key",desc:"Your OpenWeather API key (the appid parameter). Required — OpenWeather has no anonymous tier.",keywords:"api key appid secret credentials token openweather"},{default:ye(()=>[jt("apiKey")?(p(),m("span",ev,[z(x(Ie("apiKey").effective||"—")+" ",1),Je("apiKey")?(p(),m("span",tv,[A(Q,{name:"lock",size:10}),z(x(Je("apiKey")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[25]||(c[25]=k=>Ht.apiKey=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,Ht.apiKey]])]),_:1}),A(xe,{title:"Units",desc:"Measurement system for temperatures and wind speed.",keywords:"units metric imperial standard celsius fahrenheit kelvin"},{default:ye(()=>[jt("units")?(p(),m("span",nv,[z(x((Ro.find(k=>k.value===Ie("units").effective)||{}).label||Ie("units").effective||"—")+" ",1),Je("units")?(p(),m("span",iv,[A(Q,{name:"lock",size:10}),z(x(Je("units")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:Ht.units,"onUpdate:modelValue":c[26]||(c[26]=k=>Ht.units=k),options:Ro},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Default latitude",desc:"Latitude used by the health probe and calls with no location (−90…90).",keywords:"latitude location coordinates default"},{default:ye(()=>[jt("lat")?(p(),m("span",ov,[z(x(Ie("lat").effective||"—")+" ",1),Je("lat")?(p(),m("span",sv,[A(Q,{name:"lock",size:10}),z(x(Je("lat")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[27]||(c[27]=k=>Ht.lat=k),inputmode:"decimal",class:"field w-40 font-mono",placeholder:"52.2297"},null,512)),[[me,Ht.lat]])]),_:1}),A(xe,{title:"Default longitude",desc:"Longitude used by the health probe and calls with no location (−180…180).",keywords:"longitude location coordinates default"},{default:ye(()=>[jt("lon")?(p(),m("span",av,[z(x(Ie("lon").effective||"—")+" ",1),Je("lon")?(p(),m("span",rv,[A(Q,{name:"lock",size:10}),z(x(Je("lon")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[28]||(c[28]=k=>Ht.lon=k),inputmode:"decimal",class:"field w-40 font-mono",placeholder:"21.0122"},null,512)),[[me,Ht.lon]])]),_:1}),A(xe,{title:"Language",desc:"Optional ISO code for human-readable weather descriptions, e.g. en, pl, de.",keywords:"language locale description"},{default:ye(()=>[jt("lang")?(p(),m("span",lv,[z(x(Ie("lang").effective||"—")+" ",1),Je("lang")?(p(),m("span",uv,[A(Q,{name:"lock",size:10}),z(x(Je("lang")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[29]||(c[29]=k=>Ht.lang=k),class:"field w-24 font-mono",placeholder:"en"},null,512)),[[me,Ht.lang]])]),_:1}),A(xe,{title:"Calls per minute limit",desc:"Your plan's per-minute limit (free tier is 60). Only used to gauge app usage below. Leave blank to inherit; the app falls back to 60.",keywords:"calls per minute limit rate quota plan usage"},{default:ye(()=>[jt("callsPerMinute")?(p(),m("span",cv,[z(x(Ie("callsPerMinute").effective||"60")+" ",1),Je("callsPerMinute")?(p(),m("span",dv,[A(Q,{name:"lock",size:10}),z(x(Je("callsPerMinute")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[30]||(c[30]=k=>Ht.callsPerMinute=k),inputmode:"numeric",class:"field w-24 font-mono",placeholder:"60"},null,512)),[[me,Ht.callsPerMinute]])]),_:1}),Xe.available&&!Ln.value?(p(),m("div",fv,[a("div",hv,[a("div",pv,[A(Q,{name:"signal",size:15}),c[101]||(c[101]=z("API call usage ",-1))]),Gn.value?(p(),m("span",mv,"Checked "+x(Uo()),1)):I("",!0)]),Ui.value?(p(),m(ae,{key:0},[a("div",gv,[a("span",vv,x(Ui.value.minuteUsed),1),a("span",_v,"/ "+x(Ui.value.minuteLimit||"—")+" calls this minute",1)]),vs.value!=null?(p(),m("div",bv,[a("div",{class:Pe(["h-full rounded-full transition-all",fa.value]),style:Eo({width:vs.value+"%"})},null,6)])):I("",!0),a("div",yv,x(Ui.value.dayUsed)+" calls today · counts only requests PilotVault makes with this key, since server start. OpenWeather does not report remaining quota — check your account dashboard for the authoritative total. ",1)],64)):(p(),m("div",xv,[...c[102]||(c[102]=[z(" Run ",-1),a("span",{class:"font-semibold text-ink-secondary"},"Test connection",-1),z(" below to record and show call usage. ",-1)])]))])):I("",!0),a("div",wv,[Ri.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:Fi.value||!Xe.available,onClick:Dt},x(Fi.value?"Saving…":Ln.value?"Save organization settings":"Save settings"),9,kv)),Ln.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:Di.value||!Xe.available,onClick:bi},x(Di.value?"Testing…":"Test connection"),9,Sv)),Kn.value?(p(),m("span",Tv,x(Kn.value),1)):I("",!0),Gn.value&&!Ln.value?(p(),m("span",Pv,"Checked "+x(Uo()),1)):I("",!0),Qt.value&&!Ln.value?(p(),m("span",{key:4,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",da(Qt.value.status)])},[c[103]||(c[103]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Qt.value.detail||Qt.value.status),1)],2)):I("",!0)])])],64)):I("",!0),Hi("drives-external")?(p(),m(ae,{key:2},[a("div",Cv,[a("div",Lv,[a("div",Av,[A(Q,{name:"server",size:20})]),c[104]||(c[104]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"File Transfer (FTP / SFTP)"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Connect to an FTP, FTPS or SFTP server. Configure the connection your account uses for file transfers. ")],-1))]),at.loaded&&!at.available?(p(),m("div",Mv,[A(Q,{name:"lock",size:14,class:"mr-1 inline"}),c[105]||(c[105]=z(" File transfer is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),at.canEditOrg?(p(),m("div",Ev,[c[106]||(c[106]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Sn.value,"onUpdate:modelValue":c[31]||(c[31]=k=>Sn.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),St.value?(p(),nt(xe,{key:2,title:"Enable file transfer (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin ftp sftp organization"},{default:ye(()=>[A(nn,{"model-value":at.orgEnabled,disabled:!at.available,"onUpdate:modelValue":ra},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable file transfer",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin ftp sftp"},{default:ye(()=>[A(nn,{"model-value":at.enabled,disabled:!at.available||!at.orgEnabled,"onUpdate:modelValue":ra},null,8,["model-value","disabled"])]),_:1})),!St.value&&at.available&&!at.orgEnabled?(p(),m("div",Ov,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[108]||(c[108]=z("File transfer is turned off for your organization",-1)),at.canEditOrg?(p(),m("span",zv,[...c[107]||(c[107]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[109]||(c[109]=z(". ",-1))])):I("",!0),St.value?(p(),m("div",$v,[A(Q,{name:"users",size:13,class:"mr-1 inline"}),c[110]||(c[110]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",Iv,x(t.organizationName||"your organization"),1),c[111]||(c[111]=z(". Leave the connection blank to let each user configure their own; a connection set here overrides the user's. ",-1))])):Oe.value?(p(),m("div",Nv," As a superadmin you manage the global file-transfer configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{title:"Protocol",desc:"SFTP (over SSH), FTPS (FTP over TLS), or plain FTP.",keywords:"protocol sftp ftps ftp"},{default:ye(()=>[_t("protocol")?(p(),m("span",Fv,[z(x(oa(K("protocol").effective))+" ",1),bt("protocol")?(p(),m("span",Dv,[A(Q,{name:"lock",size:10}),z(x(bt("protocol")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:rt.protocol,"onUpdate:modelValue":c[32]||(c[32]=k=>rt.protocol=k),options:Z},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Host",desc:"Server hostname or IP address.",keywords:"host server address"},{default:ye(()=>[_t("host")?(p(),m("span",Rv,[z(x(K("host").effective||"—")+" ",1),bt("host")?(p(),m("span",Bv,[A(Q,{name:"lock",size:10}),z(x(bt("host")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[33]||(c[33]=k=>rt.host=k),class:"field w-64",placeholder:"files.example.com"},null,512)),[[me,rt.host]])]),_:1}),A(xe,{title:"Port",desc:"Leave blank for the protocol default (22 for SFTP, 21 for FTP/FTPS).",keywords:"port"},{default:ye(()=>[_t("port")?(p(),m("span",Uv,[z(x(K("port").effective||"default")+" ",1),bt("port")?(p(),m("span",Vv,[A(Q,{name:"lock",size:10}),z(x(bt("port")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[34]||(c[34]=k=>rt.port=k),inputmode:"numeric",class:"field w-24 font-mono",placeholder:"22"},null,512)),[[me,rt.port]])]),_:1}),A(xe,{title:"Username",desc:"Account used to authenticate.",keywords:"username login account"},{default:ye(()=>[_t("username")?(p(),m("span",Zv,[z(x(K("username").effective||"—")+" ",1),bt("username")?(p(),m("span",Hv,[A(Q,{name:"lock",size:10}),z(x(bt("username")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[35]||(c[35]=k=>rt.username=k),class:"field w-64",placeholder:"user"},null,512)),[[me,rt.username]])]),_:1}),A(xe,{title:"Password",desc:"Password auth for FTP/FTPS, or SFTP password login. Leave blank to use a key.",keywords:"password secret credentials"},{default:ye(()=>[_t("password")?(p(),m("span",jv,[z(x(K("password").effective||"—")+" ",1),bt("password")?(p(),m("span",Wv,[A(Q,{name:"lock",size:10}),z(x(bt("password")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[36]||(c[36]=k=>rt.password=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,rt.password]])]),_:1}),Et.value==="sftp"?(p(),nt(xe,{key:7,block:"",title:"SSH private key",desc:"PEM key for SFTP key auth — used instead of, or alongside, a password.",keywords:"private key ssh pem identity"},{default:ye(()=>[_t("privateKey")?(p(),m("span",Kv,[z(x(K("privateKey").effective||"—")+" ",1),bt("privateKey")?(p(),m("span",Gv,[A(Q,{name:"lock",size:10}),z(x(bt("privateKey")),1)])):I("",!0)])):ie((p(),m("textarea",{key:1,"onUpdate:modelValue":c[37]||(c[37]=k=>rt.privateKey=k),rows:"3",class:"field w-full font-mono text-xs",placeholder:"-----BEGIN OPENSSH PRIVATE KEY-----"},null,512)),[[me,rt.privateKey]])]),_:1})):I("",!0),Et.value==="sftp"?(p(),nt(xe,{key:8,title:"Private key passphrase",desc:"Passphrase protecting the SSH private key, if any.",keywords:"passphrase key secret"},{default:ye(()=>[_t("keyPassphrase")?(p(),m("span",qv,[z(x(K("keyPassphrase").effective||"—")+" ",1),bt("keyPassphrase")?(p(),m("span",Yv,[A(Q,{name:"lock",size:10}),z(x(bt("keyPassphrase")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[38]||(c[38]=k=>rt.keyPassphrase=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,rt.keyPassphrase]])]),_:1})):I("",!0),Et.value==="sftp"?(p(),nt(xe,{key:9,title:"Host key fingerprint",desc:"Optional SHA256:… fingerprint to pin the server's host key. Blank accepts any key.",keywords:"host key fingerprint verify trust"},{default:ye(()=>[_t("hostKeyFingerprint")?(p(),m("span",Jv,[z(x(K("hostKeyFingerprint").effective||"—")+" ",1),bt("hostKeyFingerprint")?(p(),m("span",Xv,[A(Q,{name:"lock",size:10}),z(x(bt("hostKeyFingerprint")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[39]||(c[39]=k=>rt.hostKeyFingerprint=k),class:"field w-full font-mono text-xs",placeholder:"SHA256:…"},null,512)),[[me,rt.hostKeyFingerprint]])]),_:1})):I("",!0),Et.value==="ftps"?(p(),nt(xe,{key:10,title:"TLS verification",desc:"Skip only for self-signed test servers.",keywords:"tls certificate verify insecure ftps"},{default:ye(()=>[_t("insecureSkipVerify")?(p(),m("span",Qv,[z(x(K("insecureSkipVerify").effective==="true"?"Skip verification":"Verify certificate")+" ",1),bt("insecureSkipVerify")?(p(),m("span",e_,[A(Q,{name:"lock",size:10}),z(x(bt("insecureSkipVerify")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:rt.insecureSkipVerify,"onUpdate:modelValue":c[40]||(c[40]=k=>rt.insecureSkipVerify=k),options:E},null,8,["modelValue"]))]),_:1})):I("",!0),A(xe,{title:"Base path",desc:"Working directory and health-check target, e.g. /uploads.",keywords:"base path directory folder root"},{default:ye(()=>[_t("basePath")?(p(),m("span",t_,[z(x(K("basePath").effective||"—")+" ",1),bt("basePath")?(p(),m("span",n_,[A(Q,{name:"lock",size:10}),z(x(bt("basePath")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[41]||(c[41]=k=>rt.basePath=k),class:"field w-64 font-mono",placeholder:"/uploads"},null,512)),[[me,rt.basePath]])]),_:1}),a("div",i_,[Oe.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:pi.value||!at.available,onClick:or},x(pi.value?"Saving…":St.value?"Save organization settings":"Save settings"),9,o_)),St.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:Ii.value||!at.available,onClick:sr},x(Ii.value?"Testing…":"Test connection"),9,s_)),hi.value?(p(),m("span",a_,x(hi.value),1)):I("",!0),jn.value&&!St.value?(p(),m("span",r_,"Checked "+x(sa()),1)):I("",!0),Gt.value&&!St.value?(p(),m("span",{key:4,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",la(Gt.value.status)])},[c[112]||(c[112]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Gt.value.detail||Gt.value.status),1)],2)):I("",!0)])]),a("div",l_,[a("div",u_,[a("div",c_,[A(Q,{name:"cloud",size:20})]),c[113]||(c[113]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"WebDAV"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Connect to a WebDAV server (Nextcloud, ownCloud, IIS, …). Configure the connection your account uses. ")],-1))]),lt.loaded&&!lt.available?(p(),m("div",d_,[A(Q,{name:"lock",size:14,class:"mr-1 inline"}),c[114]||(c[114]=z(" WebDAV is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),lt.canEditOrg?(p(),m("div",f_,[c[115]||(c[115]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Wn.value,"onUpdate:modelValue":c[42]||(c[42]=k=>Wn.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),ot.value?(p(),nt(xe,{key:2,title:"Enable WebDAV (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin webdav organization"},{default:ye(()=>[A(nn,{"model-value":lt.orgEnabled,disabled:!lt.available,"onUpdate:modelValue":ca},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable WebDAV",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin webdav"},{default:ye(()=>[A(nn,{"model-value":lt.enabled,disabled:!lt.available||!lt.orgEnabled,"onUpdate:modelValue":ca},null,8,["model-value","disabled"])]),_:1})),!ot.value&<.available&&!lt.orgEnabled?(p(),m("div",h_,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[117]||(c[117]=z("WebDAV is turned off for your organization",-1)),lt.canEditOrg?(p(),m("span",p_,[...c[116]||(c[116]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[118]||(c[118]=z(". ",-1))])):I("",!0),ot.value?(p(),m("div",m_,[A(Q,{name:"users",size:13,class:"mr-1 inline"}),c[119]||(c[119]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",g_,x(t.organizationName||"your organization"),1),c[120]||(c[120]=z(". Leave the connection blank to let each user configure their own; a connection set here overrides the user's. ",-1))])):Io.value?(p(),m("div",v_," As a superadmin you manage the global WebDAV configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{block:"",title:"Server URL",desc:"WebDAV endpoint including scheme, e.g. https://cloud.example.com/remote.php/dav/files/alice/.",keywords:"url server address endpoint webdav host"},{default:ye(()=>[Cn("baseURL")?(p(),m("span",__,[z(x(Pn("baseURL").effective||"—")+" ",1),qt("baseURL")?(p(),m("span",b_,[A(Q,{name:"lock",size:10}),z(x(qt("baseURL")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[43]||(c[43]=k=>Xt.baseURL=k),class:"field w-full font-mono text-xs",placeholder:"https://cloud.example.com/remote.php/dav/files/alice/"},null,512)),[[me,Xt.baseURL]])]),_:1}),A(xe,{title:"Username",desc:"Account used to authenticate (leave blank for a public share).",keywords:"username login account"},{default:ye(()=>[Cn("username")?(p(),m("span",y_,[z(x(Pn("username").effective||"—")+" ",1),qt("username")?(p(),m("span",x_,[A(Q,{name:"lock",size:10}),z(x(qt("username")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[44]||(c[44]=k=>Xt.username=k),class:"field w-64",placeholder:"user"},null,512)),[[me,Xt.username]])]),_:1}),A(xe,{title:"Password",desc:"Password or app-specific token for HTTP Basic auth.",keywords:"password secret credentials token"},{default:ye(()=>[Cn("password")?(p(),m("span",w_,[z(x(Pn("password").effective||"—")+" ",1),qt("password")?(p(),m("span",k_,[A(Q,{name:"lock",size:10}),z(x(qt("password")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[45]||(c[45]=k=>Xt.password=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,Xt.password]])]),_:1}),A(xe,{title:"TLS verification",desc:"Only affects HTTPS. Skip only for self-signed test servers.",keywords:"tls certificate verify insecure https"},{default:ye(()=>[Cn("insecureSkipVerify")?(p(),m("span",S_,[z(x(Pn("insecureSkipVerify").effective==="true"?"Skip verification":"Verify certificate")+" ",1),qt("insecureSkipVerify")?(p(),m("span",T_,[A(Q,{name:"lock",size:10}),z(x(qt("insecureSkipVerify")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:Xt.insecureSkipVerify,"onUpdate:modelValue":c[46]||(c[46]=k=>Xt.insecureSkipVerify=k),options:ua},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Base path",desc:"Working directory under the server URL and health-check target, e.g. /Documents.",keywords:"base path directory folder root"},{default:ye(()=>[Cn("basePath")?(p(),m("span",P_,[z(x(Pn("basePath").effective||"—")+" ",1),qt("basePath")?(p(),m("span",C_,[A(Q,{name:"lock",size:10}),z(x(qt("basePath")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[47]||(c[47]=k=>Xt.basePath=k),class:"field w-64 font-mono",placeholder:"/Documents"},null,512)),[[me,Xt.basePath]])]),_:1}),a("div",L_,[Io.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:zo.value||!lt.available,onClick:Do},x(zo.value?"Saving…":ot.value?"Save organization settings":"Save settings"),9,A_)),ot.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:$o.value||!lt.available,onClick:gi},x($o.value?"Testing…":"Test connection"),9,M_)),io.value?(p(),m("span",E_,x(io.value),1)):I("",!0),$n.value&&!ot.value?(p(),m("span",O_,"Checked "+x(Lt()),1)):I("",!0),Tn.value&&!ot.value?(p(),m("span",{key:4,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",Mt(Tn.value.status)])},[c[121]||(c[121]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Tn.value.detail||Tn.value.status),1)],2)):I("",!0)])])],64)):I("",!0),Hi("drives-local")?(p(),m("div",z_,[a("div",$_,[a("div",I_,[A(Q,{name:"monitor",size:20})]),c[122]||(c[122]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"Local Storage"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," A private folder on the server for your files. Each user has their own; members of an organization share one. ")],-1))]),Ee.loaded&&!Ee.available?(p(),m("div",N_,[A(Q,{name:"lock",size:14,class:"mr-1 inline"}),c[123]||(c[123]=z(" Local storage is currently disabled by your administrator. Contact them to enable it. ",-1))])):Ee.loaded&&!Ee.rootConfigured?(p(),m("div",F_,[A(Q,{name:"alertTriangle",size:14,class:"mr-1 inline"}),c[124]||(c[124]=z(" No storage root has been configured by your administrator yet. ",-1))])):I("",!0),Ee.canEditOrg?(p(),m("div",D_,[c[125]||(c[125]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Vi.value,"onUpdate:modelValue":c[48]||(c[48]=k=>Vi.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),gn.value?(p(),nt(xe,{key:3,title:"Enable local storage (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin local storage folder organization"},{default:ye(()=>[A(nn,{"model-value":Ee.orgEnabled,disabled:!Ee.available,"onUpdate:modelValue":xs},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:4,title:"Enable local storage",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin local storage folder"},{default:ye(()=>[A(nn,{"model-value":Ee.enabled,disabled:!Ee.available||!Ee.orgEnabled,"onUpdate:modelValue":xs},null,8,["model-value","disabled"])]),_:1})),!gn.value&&Ee.available&&!Ee.orgEnabled?(p(),m("div",R_,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[127]||(c[127]=z("Local storage is turned off for your organization",-1)),Ee.canEditOrg?(p(),m("span",B_,[...c[126]||(c[126]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[128]||(c[128]=z(". ",-1))])):I("",!0),gn.value?(p(),m("div",U_,[A(Q,{name:"users",size:13,class:"mr-1 inline"}),c[129]||(c[129]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",V_,x(t.organizationName||"your organization"),1),c[130]||(c[130]=z(", who all share the organization folder. Members can additionally enable a private folder inside it. ",-1))])):_s.value?(p(),m("div",Z_," As a superadmin you manage the global storage root in the API Server panel. The effective configuration is shown below. ")):I("",!0),gn.value?(p(),nt(xe,{key:8,title:"Private folders",desc:"Let members create a private folder inside the organization folder, reachable only by them.",keywords:"private folder members allow policy organization"},{default:ye(()=>[A(nn,{"model-value":Ee.allowPrivate,disabled:!Ee.available,"onUpdate:modelValue":ur},null,8,["model-value","disabled"])]),_:1})):I("",!0),gn.value?I("",!0):(p(),m(ae,{key:9},[A(xe,{block:"",title:"Your folders",desc:"Assigned automatically and isolated — no one else can reach your private folder.",keywords:"folder directory path storage location isolated private shared"},{default:ye(()=>[a("div",H_,[(p(!0),m(ae,null,ze(Ee.mounts,k=>(p(),m("div",{key:k.id,class:"flex flex-wrap items-center gap-2"},[a("span",j_,x(k.path),1),k.kind==="shared"?(p(),m("span",W_,[A(Q,{name:"users",size:10}),c[131]||(c[131]=z("Shared with your organization",-1))])):(p(),m("span",K_,[A(Q,{name:"lock",size:10}),c[132]||(c[132]=z("Private to you",-1))])),ao.value[k.id]?(p(),m("span",{key:2,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-semibold",va(ao.value[k.id].status)])},[c[133]||(c[133]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(ao.value[k.id].status),1)],2)):I("",!0)]))),128)),Ee.mounts.length?I("",!0):(p(),m("div",G_,x(Ee.rootConfigured?"No folder assigned yet.":"Waiting for the administrator to configure a storage root."),1))])]),_:1}),Ee.isOrgUser&&Ee.allowPrivate?(p(),nt(xe,{key:0,title:"My private folder",desc:"Add a private folder inside the organization folder, reachable only by you — you keep the shared folder too.",keywords:"private folder personal isolated organization inside"},{default:ye(()=>[A(nn,{"model-value":Ee.privateFolder,disabled:!Ee.available||!Ee.orgEnabled,"onUpdate:modelValue":ga},null,8,["model-value","disabled"])]),_:1})):Ee.isOrgUser&&!Ee.allowPrivate?(p(),m("div",q_,[A(Q,{name:"lock",size:13,class:"mr-1 inline"}),c[134]||(c[134]=z("Private folders are turned off by your organization. ",-1))])):I("",!0)],64)),A(xe,{title:"Access mode",desc:"Read-only prevents uploads, deletes and folder creation.",keywords:"read only write access mode permission"},{default:ye(()=>[ha("readOnly")?(p(),m("span",Y_,[z(x(rr(Zi("readOnly").effective))+" ",1),An("readOnly")?(p(),m("span",J_,[A(Q,{name:"lock",size:10}),z(x(An("readOnly")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:so.value,"onUpdate:modelValue":c[49]||(c[49]=k=>so.value=k),options:Zo},null,8,["modelValue"]))]),_:1}),a("div",X_,[_s.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:Vo.value||!Ee.available,onClick:cr},x(Vo.value?"Saving…":gn.value?"Save organization settings":"Save settings"),9,Q_)),gn.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:en.value||!Ee.available,onClick:ws},x(en.value?"Testing…":"Test folder"),9,e1)),qe.value?(p(),m("span",t1,x(qe.value),1)):I("",!0),yi.value&&!gn.value?(p(),m("span",n1,"Checked "+x(pa()),1)):I("",!0),ln.value&&!gn.value?(p(),m("span",{key:4,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",va(ln.value.status)])},[c[135]||(c[135]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(ln.value.detail||ln.value.status),1)],2)):I("",!0)])])):I("",!0)])):X.id==="profile"?(p(),m("div",i1,[A(xe,{block:"",title:"Profile photo",desc:"PNG or JPG, up to ~1.5 MB. Stored on this device.",keywords:"avatar photo picture"},{default:ye(()=>[a("div",o1,[$e(be).avatar?(p(),m("img",{key:0,src:$e(be).avatar,alt:"Avatar",class:"h-16 w-16 rounded-full object-cover"},null,8,s1)):(p(),m("div",a1,x(ba.value),1)),a("div",r1,[a("label",l1,[A(Q,{name:"upload",size:15,class:"mr-1.5 inline"}),c[136]||(c[136]=z("Upload ",-1)),a("input",{type:"file",accept:"image/*",class:"hidden",onChange:fr},null,32)]),$e(be).avatar?(p(),m("button",{key:0,class:"btn-ghost",onClick:hr},"Remove")):I("",!0)])])]),_:1}),A(xe,{title:"Display name",desc:"The name shown on your public profile.",keywords:"display name profile"},{default:ye(()=>[ie(a("input",{"onUpdate:modelValue":c[50]||(c[50]=k=>$e(be).displayName=k),class:"field w-56",placeholder:"Jane O.",onBlur:c[51]||(c[51]=k=>We("Saved."))},null,544),[[me,$e(be).displayName]])]),_:1}),A(xe,{block:"",title:"Bio",desc:"A short description others can see.",keywords:"bio about description"},{default:ye(()=>[ie(a("textarea",{"onUpdate:modelValue":c[52]||(c[52]=k=>$e(be).bio=k),rows:"3",maxlength:"240",class:"field w-full resize-none",placeholder:"Flight director, North yard operations…",onBlur:c[53]||(c[53]=k=>We("Saved."))},null,544),[[me,$e(be).bio]]),a("div",u1,x(($e(be).bio||"").length)+"/240",1)]),_:1}),A(xe,{title:"Show email on profile",desc:"Let teammates see your email address.",keywords:"show email public visibility"},{default:ye(()=>[A(nn,{modelValue:$e(be).showEmail,"onUpdate:modelValue":c[54]||(c[54]=k=>$e(be).showEmail=k)},null,8,["modelValue"])]),_:1})])):X.id==="security"?(p(),m("div",c1,[A(xe,{block:"",title:"Two-factor authentication",desc:"Require a one-time code at sign-in.",keywords:"two factor 2fa authentication security"},{default:ye(()=>[a("div",d1,[a("span",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",$e(be).twoFactor?"bg-success-soft text-success-fg":"bg-surface-2 text-ink-secondary"])},[c[137]||(c[137]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x($e(be).twoFactor?"Enabled":"Disabled"),1)],2),!$e(be).twoFactor&&!lo.value?(p(),m("button",{key:0,class:"btn-accent",onClick:ji},"Enable 2FA")):$e(be).twoFactor?(p(),m("button",{key:1,class:"btn-ghost",onClick:co},"Disable")):I("",!0)]),lo.value?(p(),m("div",f1,[a("div",h1,[c[139]||(c[139]=a("div",{class:"grid h-28 w-28 place-items-center rounded bg-white p-2"},[a("svg",{viewBox:"0 0 100 100",class:"h-full w-full"},[a("rect",{width:"100",height:"100",fill:"#fff"}),a("g",{fill:"#0F1E3D"},[a("rect",{x:"6",y:"6",width:"24",height:"24"}),a("rect",{x:"70",y:"6",width:"24",height:"24"}),a("rect",{x:"6",y:"70",width:"24",height:"24"}),a("rect",{x:"12",y:"12",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"76",y:"12",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"12",y:"76",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"40",y:"10",width:"8",height:"8"}),a("rect",{x:"52",y:"20",width:"8",height:"8"}),a("rect",{x:"40",y:"40",width:"8",height:"8"}),a("rect",{x:"60",y:"44",width:"8",height:"8"}),a("rect",{x:"44",y:"60",width:"8",height:"8"}),a("rect",{x:"70",y:"60",width:"8",height:"8"}),a("rect",{x:"80",y:"72",width:"8",height:"8"}),a("rect",{x:"60",y:"80",width:"8",height:"8"})])])],-1)),a("div",p1,[c[138]||(c[138]=a("div",{class:"text-xs text-ink-secondary"},"Scan with an authenticator app, or enter this secret:",-1)),a("div",m1,x(_n.value),1),a("div",g1,[ie(a("input",{"onUpdate:modelValue":c[55]||(c[55]=k=>qn.value=k),inputmode:"numeric",maxlength:"6",class:"field w-28 font-mono tracking-[0.3em]",placeholder:"000000"},null,512),[[me,qn.value]]),a("button",{class:"btn-accent",onClick:pr},"Verify & enable")]),uo.value?(p(),m("p",v1,x(uo.value),1)):I("",!0)])])])):I("",!0),$e(be).twoFactor&&bn.value.length?(p(),m("div",_1,[c[140]||(c[140]=a("div",{class:"text-xs font-semibold text-ink"},"Recovery codes",-1)),c[141]||(c[141]=a("div",{class:"mt-0.5 text-xs text-ink-muted"},"Store these somewhere safe — each works once.",-1)),a("div",b1,[(p(!0),m(ae,null,ze(bn.value,k=>(p(),m("span",{key:k,class:"select-all"},x(k),1))),128))])])):I("",!0),c[142]||(c[142]=a("p",{class:"mt-2 text-xs text-ink-muted"},"Prototype — codes are generated locally until the account service verifies them.",-1))]),_:1}),A(xe,{block:"",title:"Active sessions",desc:"Devices currently signed in to your account.",keywords:"sessions devices logout sign out remote"},{default:ye(()=>[a("div",y1,[a("div",x1,[a("div",w1,[A(Q,{name:"monitor",size:18})]),a("div",k1,[a("div",S1,[z(x(Wo())+" on "+x(mr())+" ",1),c[143]||(c[143]=a("span",{class:"ml-1 rounded-full bg-success-soft px-2 py-0.5 text-[10px] font-semibold text-success-fg"},"This device",-1))]),a("div",T1,"Signed in "+x($e(Su)($e(ni))),1)]),a("button",{class:"btn-ghost",onClick:c[56]||(c[56]=k=>l("logout"))},"Log out")])]),c[144]||(c[144]=a("button",{class:"btn-ghost mt-2 opacity-60",disabled:"",title:"Requires the account service"}," Log out all other devices ",-1)),c[145]||(c[145]=a("p",{class:"mt-2 text-xs text-ink-muted"}," Only this session is visible from the browser; enumerating and revoking remote sessions needs the account service. ",-1))]),_:1})])):X.id==="team"?(p(),m("div",P1,[Qe.id?(p(),m("div",C1,[A(xe,{block:"",title:`Edit user — ${Qe.email}`,desc:"Update details, change role, reset password, or set verified.",keywords:"edit user update role password verified organization"},{default:ye(()=>[a("div",L1,[a("div",A1,[ie(a("input",{"onUpdate:modelValue":c[57]||(c[57]=k=>Qe.email=k),type:"email",class:"field flex-1",placeholder:"name@pilotvault.local"},null,512),[[me,Qe.email]]),ie(a("select",{"onUpdate:modelValue":c[58]||(c[58]=k=>Qe.role=k),class:"field w-32",disabled:qo.value,title:qo.value?"You cannot change your own role":""},[(p(!0),m(ae,null,ze(ya.value,k=>(p(),m("option",{key:k.value,value:k.value},x(k.label),9,E1))),128))],8,M1),[[Ot,Qe.role]])]),u.value?ie((p(),m("select",{key:0,"onUpdate:modelValue":c[59]||(c[59]=k=>Qe.organization=k),class:"field",title:"Organization"},[(p(!0),m(ae,null,ze(Cs.value,k=>(p(),m("option",{key:k.value,value:k.value},x(k.label),9,O1))),128))],512)),[[Ot,Qe.organization]]):I("",!0),ie(a("input",{"onUpdate:modelValue":c[60]||(c[60]=k=>Qe.password=k),type:"password",class:"field",placeholder:"New password (leave blank to keep current)"},null,512),[[me,Qe.password]]),a("label",z1,[A(nn,{modelValue:Qe.verified,"onUpdate:modelValue":c[61]||(c[61]=k=>Qe.verified=k)},null,8,["modelValue"]),c[146]||(c[146]=z(" Email verified ",-1))]),a("div",$1,[a("button",{class:"btn-accent",disabled:Ki.value,onClick:vr},x(Ki.value?"Saving…":"Save changes"),9,I1),a("button",{class:"btn-ghost",onClick:ho},"Cancel"),En.value?(p(),m("span",N1,x(En.value),1)):I("",!0),qo.value?(p(),m("span",F1,"Editing your own account — role locked.")):I("",!0)])])]),_:1},8,["title"])])):(p(),m("div",D1,[A(xe,{block:"",title:"Add user",desc:"Create a new account. Admins add users within their organization; superadmins can target any.",keywords:"add user create account role admin organization"},{default:ye(()=>[a("div",R1,[a("div",B1,[ie(a("input",{"onUpdate:modelValue":c[62]||(c[62]=k=>Rt.email=k),type:"email",class:"field flex-1",placeholder:"name@pilotvault.local"},null,512),[[me,Rt.email]]),ie(a("select",{"onUpdate:modelValue":c[63]||(c[63]=k=>Rt.role=k),class:"field w-32"},[(p(!0),m(ae,null,ze(ya.value,k=>(p(),m("option",{key:k.value,value:k.value},x(k.label),9,U1))),128))],512),[[Ot,Rt.role]])]),u.value?ie((p(),m("select",{key:0,"onUpdate:modelValue":c[64]||(c[64]=k=>Rt.organization=k),class:"field",title:"Organization"},[(p(!0),m(ae,null,ze(Cs.value,k=>(p(),m("option",{key:k.value,value:k.value},x(k.label),9,V1))),128))],512)),[[Ot,Rt.organization]]):(p(),m("div",Z1,[c[147]||(c[147]=z(" New users join your organization: ",-1)),a("span",H1,x(t.organizationName||"—"),1)])),ie(a("input",{"onUpdate:modelValue":c[65]||(c[65]=k=>Rt.password=k),type:"password",class:"field",placeholder:"Temporary password (min 8 chars)"},null,512),[[me,Rt.password]]),a("div",j1,[a("button",{class:"btn-accent",disabled:Ko.value,onClick:Ls},x(Ko.value?"Creating…":"Create user"),9,W1),tn.value?(p(),m("span",K1,x(tn.value),1)):I("",!0)])])]),_:1})])),a("div",G1,[a("div",q1,[c[148]||(c[148]=a("div",null,[a("div",{class:"eyebrow"},"Team"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"All users")],-1)),a("button",{class:"btn-ghost",disabled:fo.value,onClick:oi},x(fo.value?"Loading…":"Refresh"),9,Y1)]),Wi.value?(p(),m("div",J1,x(Wi.value),1)):!wi.value.length&&!fo.value?(p(),m("div",X1,"No users yet.")):(p(),m("div",Q1,[a("table",eb,[a("thead",null,[a("tr",tb,[(p(),m(ae,null,ze(["User","Role","Organization","Status",""],k=>a("th",{key:k,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(k),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(wi.value,k=>(p(),m("tr",{key:k.id,class:Pe(["border-b border-line last:border-0",Qe.id===k.id?"bg-accent-soft":""])},[a("td",nb,[a("span",ib,x(k.email),1),k.email===t.email?(p(),m("span",ob,"(you)")):I("",!0)]),a("td",sb,[a("span",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",b(k.role||"user")])},[A(Q,{name:_(k.role||"user"),size:12},null,8,["name"]),z(x(h(k.role||"user")),1)],2)]),a("td",ab,[a("span",{class:Pe(["text-sm",k.organizationName?"text-ink-secondary":"text-ink-muted"])},x(k.organizationName||"—"),3)]),a("td",rb,[a("span",{class:Pe(["text-xs",k.verified?"text-success-fg":"text-ink-muted"])},x(k.verified?"Verified":"Unverified"),3)]),a("td",lb,[Fn.value===k.id?(p(),m(ae,{key:0},[c[149]||(c[149]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Remove?",-1)),a("button",{class:"btn-ghost mr-1",onClick:c[66]||(c[66]=Be=>Fn.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:Be=>Go(k)}," Remove ",8,ub)],64)):(p(),m("div",cb,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>gr(k)},[A(Q,{name:"settings",size:14}),c[150]||(c[150]=z(" Edit ",-1))],8,db),k.email!==t.email?(p(),m("button",{key:0,class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>Fn.value=k.id},[A(Q,{name:"trash",size:14}),c[151]||(c[151]=z(" Remove ",-1))],8,fb)):I("",!0)]))])],2))),128))])])]))])])):X.id==="organizations"?(p(),m("div",hb,[Nt.id?(p(),m("div",pb,[A(xe,{block:"",title:"Rename organization",desc:"Update the organization's display name.",keywords:"rename organization edit"},{default:ye(()=>[a("div",mb,[ie(a("input",{"onUpdate:modelValue":c[67]||(c[67]=k=>Nt.name=k),class:"field",placeholder:"Organization name",onKeyup:pu(xa,["enter"])},null,544),[[me,Nt.name]]),a("div",gb,[a("button",{class:"btn-accent",onClick:xa},"Save changes"),a("button",{class:"btn-ghost",onClick:Ms},"Cancel"),Dn.value?(p(),m("span",vb,x(Dn.value),1)):I("",!0)])])]),_:1})])):(p(),m("div",_b,[A(xe,{block:"",title:"Add organization",desc:"Create a new organization. Assign admins and users to it from User management.",keywords:"add organization create tenant company"},{default:ye(()=>[a("div",bb,[ie(a("input",{"onUpdate:modelValue":c[68]||(c[68]=k=>po.name=k),class:"field",placeholder:"e.g. Northwind Aerial",onKeyup:pu(_o,["enter"])},null,544),[[me,po.name]]),a("div",yb,[a("button",{class:"btn-accent",disabled:go.value,onClick:_o},x(go.value?"Creating…":"Create organization"),9,xb),mo.value?(p(),m("span",wb,x(mo.value),1)):I("",!0)])])]),_:1})])),a("div",kb,[a("div",{class:"flex items-center justify-between px-5 py-4"},[c[152]||(c[152]=a("div",null,[a("div",{class:"eyebrow"},"Tenancy"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"All organizations")],-1)),a("button",{class:"btn-ghost",onClick:ii},"Refresh")]),yn.value.length?(p(),m("div",Tb,[a("table",Pb,[a("thead",null,[a("tr",Cb,[(p(),m(ae,null,ze(["Organization","Members",""],k=>a("th",{key:k,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(k),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(yn.value,k=>(p(),m("tr",{key:k.id,class:Pe(["border-b border-line last:border-0",Nt.id===k.id?"bg-accent-soft":""])},[a("td",Lb,[a("span",Ab,[A(Q,{name:"grid",size:14,class:"text-ink-muted"}),z(x(k.name),1)])]),a("td",Mb,x(As.value[k.id]||0),1),a("td",Eb,[vo.value===k.id?(p(),m(ae,{key:0},[c[153]||(c[153]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:c[69]||(c[69]=Be=>vo.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:Be=>bo(k)}," Delete ",8,Ob)],64)):(p(),m("div",zb,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>_r(k)},[A(Q,{name:"settings",size:14}),c[154]||(c[154]=z(" Rename ",-1))],8,$b),a("button",{class:"btn-ghost inline-flex items-center gap-1.5",disabled:(As.value[k.id]||0)>0,title:(As.value[k.id]||0)>0?"Reassign or remove members first":"",onClick:Be=>vo.value=k.id},[A(Q,{name:"trash",size:14}),c[155]||(c[155]=z(" Delete ",-1))],8,Ib)]))])],2))),128))])])])):(p(),m("div",Sb,"No organizations yet."))])])):X.id==="advanced"?(p(),m("div",Nb,[a("div",Fb,[A(xe,{title:"Export data",desc:"Download your settings and profile as JSON.",keywords:"export data download backup"},{default:ye(()=>[a("button",{class:"btn-ghost",onClick:br},[A(Q,{name:"download",size:15,class:"mr-1.5 inline"}),c[156]||(c[156]=z("Export",-1))])]),_:1}),A(xe,{block:"",title:"Import data",desc:"Restore settings from a previous export.",keywords:"import data upload restore"},{default:ye(()=>[a("label",Db,[A(Q,{name:"upload",size:15,class:"mr-1.5 inline"}),c[157]||(c[157]=z("Choose file… ",-1)),a("input",{type:"file",accept:"application/json,.json",class:"hidden",onChange:wa},null,32)]),Yn.value?(p(),m("p",Rb,x(Yn.value),1)):I("",!0)]),_:1})]),a("div",Bb,[a("div",Ub,[A(Q,{name:"alertTriangle",size:18}),c[158]||(c[158]=a("h3",{class:"text-sm font-bold uppercase tracking-caps"},"Danger zone",-1))]),c[163]||(c[163]=a("p",{class:"mt-1 text-xs text-ink-secondary"},"Deleting your account is permanent and cannot be undone.",-1)),a("div",Vb,[c[162]||(c[162]=a("div",{class:"text-sm font-semibold text-ink"},"Delete account",-1)),a("label",Zb,[ie(a("input",{"onUpdate:modelValue":c[70]||(c[70]=k=>mt.understand=k),type:"checkbox",class:"mt-0.5 h-4 w-4 accent-[var(--danger)]"},null,512),[[Va,mt.understand]]),c[159]||(c[159]=z(" I understand this permanently deletes my account and all associated data. ",-1))]),a("div",Hb,[a("label",jb,[c[160]||(c[160]=z("Type ",-1)),a("span",Wb,x(On.value),1),c[161]||(c[161]=z(" to confirm",-1))]),ie(a("input",{"onUpdate:modelValue":c[71]||(c[71]=k=>mt.typed=k),class:"field w-full max-w-[360px] font-mono",placeholder:On.value},null,8,Kb),[[me,mt.typed]])]),a("div",Gb,[mt.armed?(p(),m("button",{key:1,class:"rounded bg-danger px-4 py-2.5 text-sm font-semibold text-white transition enabled:hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-50",disabled:mt.cooldown>0,onClick:xo},x(mt.cooldown>0?`Confirm in ${mt.cooldown}s…`:"Permanently delete account"),9,Yb)):(p(),m("button",{key:0,class:"rounded bg-danger px-4 py-2.5 text-sm font-semibold text-white transition enabled:hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-40",disabled:!Yo.value,onClick:ka}," Delete account… ",8,qb)),mt.armed&&mt.cooldown>0?(p(),m("span",Jb,"Cooling-off period — read once more.")):I("",!0)]),mt.msg?(p(),m("p",Xb,x(mt.msg),1)):I("",!0)])])])):I("",!0)],64))),128))])]),A(vh,{name:"fade"},{default:ye(()=>[Nn.value?(p(),m("div",Qb,[A(Q,{name:"check",size:16,class:"text-success-fg"}),z(x(Nn.value),1)])):I("",!0)]),_:1})]))}},ty=Cm(ey,[["__scopeId","data-v-7522b856"]]),ny={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},iy={class:"flex flex-wrap items-center gap-3"},oy={class:"ml-auto flex items-center gap-2"},sy=["href"],ay={class:"grid grid-cols-3 gap-4 max-[900px]:grid-cols-1"},ry={class:"eyebrow"},ly={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},uy={key:1,class:"panel p-5"},cy={class:"mb-4 flex items-center justify-between"},dy={class:"eyebrow"},fy={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},hy={class:"block"},py={class:"block"},my={class:"block"},gy={class:"block"},vy={key:0,value:""},_y=["value"],by={class:"block"},yy={class:"block"},xy={class:"block"},wy={class:"block"},ky={class:"block"},Sy=["value"],Ty={class:"block"},Py=["value"],Cy={class:"block"},Ly=["value"],Ay={class:"block"},My={class:"mt-3 block"},Ey={key:0,class:"mt-3 grid grid-cols-2 gap-3 max-[760px]:grid-cols-1"},Oy={class:"block"},zy={class:"block"},$y={class:"block"},Iy={class:"block"},Ny={class:"col-span-2 block max-[760px]:col-span-1"},Fy={class:"mt-4 flex items-center gap-3"},Dy=["disabled"],Ry={key:0,class:"text-sm text-danger-fg"},By={class:"panel overflow-hidden p-0"},Uy={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},Vy={key:1,class:"grid place-items-center px-5 py-16 text-center"},Zy={key:2,class:"overflow-x-auto"},Hy={class:"w-full border-collapse text-sm"},jy={class:"text-left"},Wy={class:"whitespace-nowrap px-5 py-3 font-mono text-ink"},Ky={key:0,class:"text-ink-muted"},Gy={class:"px-5 py-3 text-ink-secondary"},qy=["title"],Yy={class:"px-5 py-3 font-mono text-ink-secondary"},Jy={class:"px-5 py-3 text-ink-secondary"},Xy={class:"px-5 py-3"},Qy=["onClick"],ex={class:"whitespace-nowrap px-5 py-3 text-right"},tx=["onClick"],nx=["onClick"],ix=["onClick"],ox={key:0,class:"border-b border-line bg-surface-2"},sx={colspan:"7",class:"px-5 py-3"},ax={class:"flex flex-wrap gap-x-8 gap-y-1.5 text-xs"},rx={class:"text-ink-secondary"},lx={class:"text-ink"},ux={class:"text-ink-secondary"},cx={class:"text-ink"},dx={class:"text-ink-secondary"},fx={class:"font-mono text-ink"},hx={key:0,class:"text-ink-secondary"},px={class:"text-ink"},mx={key:0,class:"mt-2 space-y-1"},gx={key:1,class:"mt-2 text-xs text-success-fg"},vx={__name:"Logbook",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},setup(t){const i=t,s={success:"bg-success-soft text-success-fg",danger:"bg-danger-soft text-danger-fg",neutral:"bg-surface-2 text-ink-secondary"},l=Y([]),u=Y([]),f=Y(!1),h=Y("");async function _(){f.value=!0,h.value="";const[O,F]=await Promise.all([pl(),Ap()]);(!O.ok||!F.ok)&&(h.value=O.status===503||F.status===503?"Logbook storage is not configured on the API Server (service account missing).":"Could not load the logbook."),l.value=O.drones,u.value=F.flights,f.value=!1}ti(_);function b(O){const F=O.compliance||{};return F.exempt?{tone:"neutral",label:"Exempt"}:(F.redFlags||[]).length?{tone:"danger",label:`${F.redFlags.length} issue${F.redFlags.length>1?"s":""}`}:{tone:"success",label:"Compliant"}}const C=Y("");function T(O){C.value=C.value===O?"":O}const M=[{value:"open",label:"Open"},{value:"specific",label:"Specific"},{value:"certified",label:"Certified"}],H=[{value:"commercial",label:"Commercial"},{value:"research",label:"Research"},{value:"public",label:"Public-benefit"},{value:"hobby",label:"Private hobby"},{value:"club_area",label:"Model-club area"}],j=[{value:"",label:"Auto (from drone)"},{value:"manual",label:"Manual"},{value:"automatic",label:"Automatic (FDR)"}];function G(){var O;return{operationDate:new Date().toISOString().slice(0,10),startTime:"",endTime:"",drone:((O=l.value[0])==null?void 0:O.id)||"",areaRoute:"",maxAltitudeAgl:"",pilotName:i.email,certificateRef:"",category:"open",purpose:"commercial",loggingPath:"",rawFdrLogUrl:"",authorisationRef:"",weather:"",airspaceRef:"",observer:"",incidents:"",notes:""}}const N=Y(!1),U=Y(""),R=gt(G()),oe=Y(""),we=Y(!1),ue=Y(!1);function ke(){Object.assign(R,G()),U.value="",oe.value="",ue.value=!1,N.value=!0}function Ce(O){Object.assign(R,{operationDate:(O.operationDate||"").slice(0,10),startTime:O.startTime||"",endTime:O.endTime||"",drone:O.drone||"",areaRoute:O.areaRoute||"",maxAltitudeAgl:O.maxAltitudeAgl||"",pilotName:O.pilotName||"",certificateRef:O.certificateRef||"",category:O.category||"open",purpose:O.purpose||"commercial",loggingPath:O.loggingPath||"",rawFdrLogUrl:O.rawFdrLogUrl||"",authorisationRef:O.authorisationRef||"",weather:O.weather||"",airspaceRef:O.airspaceRef||"",observer:O.observer||"",incidents:O.incidents||"",notes:O.notes||""}),U.value=O.id,oe.value="",ue.value=!!(O.weather||O.airspaceRef||O.observer||O.incidents||O.notes),N.value=!0}function Le(){N.value=!1,U.value=""}async function Ze(){var $;if(oe.value="",!R.drone){oe.value="Select a drone first (add one in the Drones section).";return}we.value=!0;const O={...R,maxAltitudeAgl:Number(R.maxAltitudeAgl)||0},F=U.value?await Ep(U.value,O):await Mp(O);if(we.value=!1,!F.ok){oe.value=(($=F.body)==null?void 0:$.error)||"Could not save the flight.";return}N.value=!1,await _()}const he=Y("");async function ee(O){const F=await Op(O.id);he.value="",F.ok&&await _()}const V=de(()=>{const O=u.value.length,F=u.value.filter(Ye=>{var Se;return(((Se=Ye.compliance)==null?void 0:Se.redFlags)||[]).length}).length,$=u.value.filter(Ye=>{var Se;return(Se=Ye.compliance)==null?void 0:Se.required}).length;return{total:O,flagged:F,required:$}});return(O,F)=>(p(),m("div",ny,[a("div",iy,[F[22]||(F[22]=a("div",null,[a("div",{class:"eyebrow"},"Logbook"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Flights (BEK 1649 §5)")],-1)),a("div",oy,[a("a",{href:$e(zp)(),class:"btn-ghost inline-flex items-center gap-2",title:"Download a compliance CSV (Trafikstyrelsen / police disclosure)"},[A(Q,{name:"download",size:15}),F[20]||(F[20]=z(" Export CSV ",-1))],8,sy),a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:ke},[A(Q,{name:"plus",size:15}),F[21]||(F[21]=z(" Log flight ",-1))])])]),a("div",ay,[(p(!0),m(ae,null,ze([{label:"Flights logged",value:V.value.total,tone:"neutral"},{label:"Require logbook",value:V.value.required,tone:"neutral"},{label:"Compliance flags",value:V.value.flagged,tone:V.value.flagged?"danger":"success"}],$=>(p(),m("div",{key:$.label,class:"panel p-5"},[a("div",ry,x($.label),1),a("div",{class:Pe(["mt-2 text-[30px] font-bold leading-none tracking-tightest",$.tone==="danger"?"text-danger-fg":$.tone==="success"?"text-success-fg":"text-ink"])},x($.value),3)]))),128))]),h.value?(p(),m("div",ly,x(h.value),1)):I("",!0),N.value?(p(),m("div",uy,[a("div",cy,[a("div",null,[a("div",dy,x(U.value?"Edit entry":"New entry"),1),F[23]||(F[23]=a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Logbook flight (BEK 1649 §5)",-1))]),a("button",{class:"btn-icon",onClick:Le},[A(Q,{name:"x",size:16})])]),a("div",fy,[a("label",hy,[F[24]||(F[24]=a("span",{class:"eyebrow mb-1 block"},"Date",-1)),ie(a("input",{"onUpdate:modelValue":F[0]||(F[0]=$=>R.operationDate=$),type:"date",class:"field"},null,512),[[me,R.operationDate]])]),a("label",py,[F[25]||(F[25]=a("span",{class:"eyebrow mb-1 block"},"Start",-1)),ie(a("input",{"onUpdate:modelValue":F[1]||(F[1]=$=>R.startTime=$),type:"time",class:"field"},null,512),[[me,R.startTime]])]),a("label",my,[F[26]||(F[26]=a("span",{class:"eyebrow mb-1 block"},"End",-1)),ie(a("input",{"onUpdate:modelValue":F[2]||(F[2]=$=>R.endTime=$),type:"time",class:"field"},null,512),[[me,R.endTime]])]),a("label",gy,[F[27]||(F[27]=a("span",{class:"eyebrow mb-1 block"},"Drone",-1)),ie(a("select",{"onUpdate:modelValue":F[3]||(F[3]=$=>R.drone=$),class:"field"},[l.value.length?I("",!0):(p(),m("option",vy,"— add a drone first —")),(p(!0),m(ae,null,ze(l.value,$=>(p(),m("option",{key:$.id,value:$.id},x($.displayName),9,_y))),128))],512),[[Ot,R.drone]])]),a("label",by,[F[28]||(F[28]=a("span",{class:"eyebrow mb-1 block"},"Max altitude (m AGL)",-1)),ie(a("input",{"onUpdate:modelValue":F[4]||(F[4]=$=>R.maxAltitudeAgl=$),type:"number",min:"0",class:"field",placeholder:"120"},null,512),[[me,R.maxAltitudeAgl]])]),a("label",yy,[F[29]||(F[29]=a("span",{class:"eyebrow mb-1 block"},"Area / route",-1)),ie(a("input",{"onUpdate:modelValue":F[5]||(F[5]=$=>R.areaRoute=$),class:"field",placeholder:"Field N of Roskilde, grid survey"},null,512),[[me,R.areaRoute]])]),a("label",xy,[F[30]||(F[30]=a("span",{class:"eyebrow mb-1 block"},"Remote pilot name",-1)),ie(a("input",{"onUpdate:modelValue":F[6]||(F[6]=$=>R.pilotName=$),class:"field",placeholder:"Full name"},null,512),[[me,R.pilotName]])]),a("label",wy,[F[31]||(F[31]=a("span",{class:"eyebrow mb-1 block"},"Certificate ref",-1)),ie(a("input",{"onUpdate:modelValue":F[7]||(F[7]=$=>R.certificateRef=$),class:"field",placeholder:"A2 / STS cert no."},null,512),[[me,R.certificateRef]])]),a("label",ky,[F[32]||(F[32]=a("span",{class:"eyebrow mb-1 block"},"Logging path",-1)),ie(a("select",{"onUpdate:modelValue":F[8]||(F[8]=$=>R.loggingPath=$),class:"field"},[(p(),m(ae,null,ze(j,$=>a("option",{key:$.value,value:$.value},x($.label),9,Sy)),64))],512),[[Ot,R.loggingPath]])]),a("label",Ty,[F[33]||(F[33]=a("span",{class:"eyebrow mb-1 block"},"Category",-1)),ie(a("select",{"onUpdate:modelValue":F[9]||(F[9]=$=>R.category=$),class:"field"},[(p(),m(ae,null,ze(M,$=>a("option",{key:$.value,value:$.value},x($.label),9,Py)),64))],512),[[Ot,R.category]])]),a("label",Cy,[F[34]||(F[34]=a("span",{class:"eyebrow mb-1 block"},"Purpose",-1)),ie(a("select",{"onUpdate:modelValue":F[10]||(F[10]=$=>R.purpose=$),class:"field"},[(p(),m(ae,null,ze(H,$=>a("option",{key:$.value,value:$.value},x($.label),9,Ly)),64))],512),[[Ot,R.purpose]])]),a("label",Ay,[F[35]||(F[35]=a("span",{class:"eyebrow mb-1 block"},"Authorisation ref",-1)),ie(a("input",{"onUpdate:modelValue":F[11]||(F[11]=$=>R.authorisationRef=$),class:"field",placeholder:"Specific-category ref"},null,512),[[me,R.authorisationRef]])])]),a("label",My,[F[36]||(F[36]=a("span",{class:"eyebrow mb-1 block"},"FDR log URL (automatic path)",-1)),ie(a("input",{"onUpdate:modelValue":F[12]||(F[12]=$=>R.rawFdrLogUrl=$),class:"field",placeholder:"Link to the stored flight-data-recorder export"},null,512),[[me,R.rawFdrLogUrl]])]),a("button",{class:"mt-4 flex items-center gap-1.5 text-sm font-semibold text-accent",onClick:F[13]||(F[13]=$=>ue.value=!ue.value)},[A(Q,{name:ue.value?"x":"plus",size:14},null,8,["name"]),F[37]||(F[37]=z(" Operational details (weather, airspace, incidents) ",-1))]),ue.value?(p(),m("div",Ey,[a("label",Oy,[F[38]||(F[38]=a("span",{class:"eyebrow mb-1 block"},"Weather / wind",-1)),ie(a("input",{"onUpdate:modelValue":F[14]||(F[14]=$=>R.weather=$),class:"field",placeholder:"6 m/s NW, CAVOK"},null,512),[[me,R.weather]])]),a("label",zy,[F[39]||(F[39]=a("span",{class:"eyebrow mb-1 block"},"Airspace / NOTAM ref",-1)),ie(a("input",{"onUpdate:modelValue":F[15]||(F[15]=$=>R.airspaceRef=$),class:"field"},null,512),[[me,R.airspaceRef]])]),a("label",$y,[F[40]||(F[40]=a("span",{class:"eyebrow mb-1 block"},"Observer",-1)),ie(a("input",{"onUpdate:modelValue":F[16]||(F[16]=$=>R.observer=$),class:"field"},null,512),[[me,R.observer]])]),a("label",Iy,[F[41]||(F[41]=a("span",{class:"eyebrow mb-1 block"},"Incidents / anomalies",-1)),ie(a("input",{"onUpdate:modelValue":F[17]||(F[17]=$=>R.incidents=$),class:"field",placeholder:"RTH trigger, GPS dropout…"},null,512),[[me,R.incidents]])]),a("label",Ny,[F[42]||(F[42]=a("span",{class:"eyebrow mb-1 block"},"Notes",-1)),ie(a("textarea",{"onUpdate:modelValue":F[18]||(F[18]=$=>R.notes=$),rows:"2",class:"field"},null,512),[[me,R.notes]])])])):I("",!0),a("div",Fy,[a("button",{class:"btn-accent",disabled:we.value,onClick:Ze},x(we.value?"Saving…":U.value?"Save changes":"Log flight"),9,Dy),a("button",{class:"btn-ghost",onClick:Le},"Cancel"),oe.value?(p(),m("span",Ry,x(oe.value),1)):I("",!0)])])):I("",!0),a("div",By,[f.value?(p(),m("div",Uy,"Loading…")):u.value.length?(p(),m("div",Zy,[a("table",Hy,[a("thead",null,[a("tr",jy,[(p(),m(ae,null,ze(["Date","Drone","Area / route","Alt","Pilot","Compliance",""],$=>a("th",{key:$,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x($),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(u.value,$=>{var Ye,Se,ge,fe;return p(),m(ae,{key:$.id},[a("tr",{class:Pe(["border-b border-line last:border-0",U.value===$.id?"bg-accent-soft":""])},[a("td",Wy,[z(x(($.operationDate||"").slice(0,10))+" ",1),$.startTime?(p(),m("span",Ky,x($.startTime),1)):I("",!0)]),a("td",Gy,x($.droneName||"—"),1),a("td",{class:"max-w-[220px] truncate px-5 py-3 text-ink-secondary",title:$.areaRoute},x($.areaRoute||"—"),9,qy),a("td",Yy,x($.maxAltitudeAgl?$.maxAltitudeAgl+" m":"—"),1),a("td",Jy,x($.pilotName||"—"),1),a("td",Xy,[a("button",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",s[b($).tone]]),onClick:ft=>T($.id)},[b($).tone==="danger"?(p(),nt(Q,{key:0,name:"alertTriangle",size:12})):b($).tone==="success"?(p(),nt(Q,{key:1,name:"check",size:12})):I("",!0),z(" "+x(b($).label),1)],10,Qy)]),a("td",ex,[he.value===$.id?(p(),m(ae,{key:0},[F[45]||(F[45]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:F[19]||(F[19]=ft=>he.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:ft=>ee($)},"Delete",8,tx)],64)):(p(),m(ae,{key:1},[a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:ft=>Ce($)},[A(Q,{name:"sliders",size:13}),F[46]||(F[46]=z(" Edit",-1))],8,nx),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:ft=>he.value=$.id},[A(Q,{name:"trash",size:13})],8,ix)],64))])],2),C.value===$.id?(p(),m("tr",ox,[a("td",sx,[a("div",ax,[a("span",rx,[F[47]||(F[47]=z("Logging path: ",-1)),a("b",lx,x(((Ye=$.compliance)==null?void 0:Ye.loggingPath)||"—"),1)]),a("span",ux,[F[48]||(F[48]=z("Category: ",-1)),a("b",cx,x($.category||"—"),1)]),a("span",dx,[F[49]||(F[49]=z("Retain until: ",-1)),a("b",fx,x(($.retentionUntil||"").slice(0,10)||"—"),1)]),(Se=$.compliance)!=null&&Se.exempt?(p(),m("span",hx,[F[50]||(F[50]=z("Exempt: ",-1)),a("b",px,x($.compliance.exemptReason),1)])):I("",!0)]),(((ge=$.compliance)==null?void 0:ge.redFlags)||[]).length?(p(),m("ul",mx,[(p(!0),m(ae,null,ze($.compliance.redFlags,(ft,pe)=>(p(),m("li",{key:pe,class:"flex items-start gap-2 text-xs text-danger-fg"},[A(Q,{name:"alertTriangle",size:13,class:"mt-px shrink-0"}),z(" "+x(ft),1)]))),128))])):(fe=$.compliance)!=null&&fe.exempt?I("",!0):(p(),m("div",gx,"No compliance gaps detected."))])])):I("",!0)],64)}),128))])])])):(p(),m("div",Vy,[A(Q,{name:"book",size:26,class:"text-ink-muted"}),F[43]||(F[43]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No flights logged yet",-1)),F[44]||(F[44]=a("div",{class:"mt-1 text-xs text-ink-muted"},"Log your first operation to start the 5-year retention record.",-1))]))])]))}},_x={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},bx={class:"flex flex-wrap items-center gap-3"},yx={class:"ml-auto flex items-center gap-2"},xx={class:"grid grid-cols-4 gap-4 max-[900px]:grid-cols-2"},wx={class:"eyebrow"},kx={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},Sx={key:1,class:"panel p-5"},Tx={class:"mb-4 flex items-center justify-between"},Px={class:"eyebrow"},Cx={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},Lx={class:"block"},Ax={class:"block"},Mx={class:"block"},Ex={class:"block"},Ox={class:"block"},zx={class:"block"},$x={class:"block"},Ix={class:"block"},Nx={class:"block"},Fx={class:"block"},Dx=["value"],Rx={class:"mt-3 flex flex-wrap gap-6"},Bx={class:"flex items-center gap-2 text-sm text-ink-secondary"},Ux={class:"flex items-center gap-2 text-sm text-ink-secondary"},Vx={class:"mt-4 flex items-center gap-3"},Zx=["disabled"],Hx={key:0,class:"text-sm text-danger-fg"},jx={class:"panel overflow-hidden p-0"},Wx={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},Kx={key:1,class:"grid place-items-center px-5 py-16 text-center"},Gx={key:2,class:"overflow-x-auto"},qx={class:"w-full border-collapse text-sm"},Yx={class:"text-left"},Jx={class:"px-5 py-3"},Xx={class:"flex items-center gap-2"},Qx={class:"font-semibold text-ink"},e0={key:0,class:"text-xs text-ink-muted"},t0={key:1,class:"text-xs text-ink-muted"},n0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},i0={key:0,class:"text-[11px] text-ink-muted",title:"Flight controller SN — reported by the aircraft, not its registered serial"},o0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},s0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},a0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},r0={class:"px-5 py-3"},l0={key:1,class:"text-ink-muted"},u0={class:"whitespace-nowrap px-5 py-3 text-right"},c0=["onClick"],d0=["onClick"],f0=["onClick"],h0={__name:"Drones",props:{connectedFcSerials:{type:Array,default:()=>[]}},emits:["deleted"],setup(t,{expose:i,emit:s}){const l=t,u=s,f={success:"bg-success-soft text-success-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},h=Y([]),_=Y(!1),b=Y("");async function C(){_.value=!0,b.value="";const ee=await pl();ee.ok||(b.value=ee.status===503?"Drone storage is not configured on the API Server (service account missing).":"Could not load your drones."),h.value=ee.drones,_.value=!1}ti(C),i({reload:C});const T=de(()=>new Set(l.connectedFcSerials.filter(Boolean)));function M(ee){return!!ee.flightControllerSerial&&T.value.has(ee.flightControllerSerial)}const H=["","C0","C1","C2","C3","C4","C5","C6"];function j(){return{name:"",model:"",serial:"",flightControllerSerial:"",firmware:"",controllerFirmware:"",registration:"",operatorNumber:"",mtomGrams:"",isToy:!1,autologsFlights:!1,cClass:""}}const G=Y(!1),N=Y(""),U=gt(j()),R=Y(""),oe=Y(!1);function we(){Object.assign(U,j()),N.value="",R.value="",G.value=!0}function ue(ee){Object.assign(U,{name:ee.name||"",model:ee.model||"",serial:ee.serial||"",flightControllerSerial:ee.flightControllerSerial||"",firmware:ee.firmware||"",controllerFirmware:ee.controllerFirmware||"",registration:ee.registration||"",operatorNumber:ee.operatorNumber||"",mtomGrams:ee.mtomGrams||"",isToy:!!ee.isToy,autologsFlights:!!ee.autologsFlights,cClass:ee.cClass||""}),N.value=ee.id,R.value="",G.value=!0}function ke(){G.value=!1,N.value=""}async function Ce(){var O;if(R.value="",!U.name.trim()&&!U.model.trim()&&!U.serial.trim()&&!U.flightControllerSerial.trim()){R.value="Give the drone a custom name, model or serial.";return}oe.value=!0;const ee={...U,mtomGrams:Number(U.mtomGrams)||0},V=N.value?await Cp(N.value,ee):await Tp(ee);if(oe.value=!1,!V.ok){R.value=((O=V.body)==null?void 0:O.error)||"Could not save the drone.";return}G.value=!1,await C()}const Le=Y("");async function Ze(ee){var O;const V=await Lp(ee.id);Le.value="",V.ok?(u("deleted",ee.flightControllerSerial),await C()):R.value=((O=V.body)==null?void 0:O.error)||"Could not delete the drone."}const he=de(()=>({fleet:h.value.length,connected:h.value.filter(M).length,unnamed:h.value.filter(ee=>!(ee.name||"").trim()).length,unregistered:h.value.filter(ee=>!(ee.registration||"").trim()).length}));return(ee,V)=>(p(),m("div",_x,[a("div",bx,[V[14]||(V[14]=a("div",null,[a("div",{class:"eyebrow"},"Fleet"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Drones you fly")],-1)),a("div",yx,[a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:we},[A(Q,{name:"plus",size:15}),V[13]||(V[13]=z(" Add drone ",-1))])])]),a("div",xx,[(p(!0),m(ae,null,ze([{label:"Drones in fleet",value:he.value.fleet,tone:"neutral"},{label:"Connected now",value:he.value.connected,tone:he.value.connected?"success":"neutral"},{label:"Awaiting a name",value:he.value.unnamed,tone:"neutral"},{label:"No registration",value:he.value.unregistered,tone:"neutral"}],O=>(p(),m("div",{key:O.label,class:"panel p-5"},[a("div",wx,x(O.label),1),a("div",{class:Pe(["mt-2 text-[30px] font-bold leading-none tracking-tightest",O.tone==="success"?"text-success-fg":"text-ink"])},x(O.value),3)]))),128))]),b.value?(p(),m("div",kx,x(b.value),1)):I("",!0),G.value?(p(),m("div",Sx,[a("div",Tx,[a("div",null,[a("div",Px,x(N.value?"Edit drone":"New drone"),1),V[15]||(V[15]=a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Aircraft registry",-1))]),a("button",{class:"btn-icon",onClick:ke},[A(Q,{name:"x",size:16})])]),a("div",Cx,[a("label",Lx,[V[16]||(V[16]=a("span",{class:"eyebrow mb-1 block"},"Custom name",-1)),ie(a("input",{"onUpdate:modelValue":V[0]||(V[0]=O=>U.name=O),class:"field",placeholder:"Mavic-01"},null,512),[[me,U.name]])]),a("label",Ax,[V[17]||(V[17]=a("span",{class:"eyebrow mb-1 block"},"Model",-1)),ie(a("input",{"onUpdate:modelValue":V[1]||(V[1]=O=>U.model=O),class:"field",placeholder:"DJI Mavic 3 Enterprise"},null,512),[[me,U.model]])]),a("label",Mx,[V[18]||(V[18]=a("span",{class:"eyebrow mb-1 block"},"Serial number",-1)),ie(a("input",{"onUpdate:modelValue":V[2]||(V[2]=O=>U.serial=O),class:"field",placeholder:"08QDE3H012032E"},null,512),[[me,U.serial]]),V[19]||(V[19]=a("span",{class:"mt-1 block text-xs text-ink-muted"},"From the sticker on the airframe.",-1))]),a("label",Ex,[V[20]||(V[20]=a("span",{class:"eyebrow mb-1 block"},"Flight controller SN",-1)),ie(a("input",{"onUpdate:modelValue":V[3]||(V[3]=O=>U.flightControllerSerial=O),class:"field",placeholder:"08RDE1J00103H1"},null,512),[[me,U.flightControllerSerial]]),V[21]||(V[21]=a("span",{class:"mt-1 block text-xs text-ink-muted"},"Auto-filled on connect.",-1))]),a("label",Ox,[V[22]||(V[22]=a("span",{class:"eyebrow mb-1 block"},"Drone firmware",-1)),ie(a("input",{"onUpdate:modelValue":V[4]||(V[4]=O=>U.firmware=O),class:"field",placeholder:"03.02.35.05"},null,512),[[me,U.firmware]])]),a("label",zx,[V[23]||(V[23]=a("span",{class:"eyebrow mb-1 block"},"Controller firmware",-1)),ie(a("input",{"onUpdate:modelValue":V[5]||(V[5]=O=>U.controllerFirmware=O),class:"field",placeholder:"01.03.0800"},null,512),[[me,U.controllerFirmware]])]),a("label",$x,[V[24]||(V[24]=a("span",{class:"eyebrow mb-1 block"},"Registration (FAA/CAA)",-1)),ie(a("input",{"onUpdate:modelValue":V[6]||(V[6]=O=>U.registration=O),class:"field",placeholder:"FA3X7K9PLM"},null,512),[[me,U.registration]])]),a("label",Ix,[V[25]||(V[25]=a("span",{class:"eyebrow mb-1 block"},"Operator no. (EU)",-1)),ie(a("input",{"onUpdate:modelValue":V[7]||(V[7]=O=>U.operatorNumber=O),class:"field",placeholder:"DNK…"},null,512),[[me,U.operatorNumber]])]),a("label",Nx,[V[26]||(V[26]=a("span",{class:"eyebrow mb-1 block"},"MTOM (grams)",-1)),ie(a("input",{"onUpdate:modelValue":V[8]||(V[8]=O=>U.mtomGrams=O),type:"number",min:"0",class:"field",placeholder:"920"},null,512),[[me,U.mtomGrams]])]),a("label",Fx,[V[27]||(V[27]=a("span",{class:"eyebrow mb-1 block"},"C-class",-1)),ie(a("select",{"onUpdate:modelValue":V[9]||(V[9]=O=>U.cClass=O),class:"field"},[(p(),m(ae,null,ze(H,O=>a("option",{key:O,value:O},x(O||"— none —"),9,Dx)),64))],512),[[Ot,U.cClass]])])]),V[30]||(V[30]=a("p",{class:"mt-3 text-xs text-ink-muted"}," Model, flight controller SN and both firmware versions fill themselves in when the drone connects — anything you type here is kept as-is. The serial number is the one you register the drone under, and only you can supply it: the SDK cannot read it off the aircraft. ",-1)),a("div",Rx,[a("label",Bx,[ie(a("input",{"onUpdate:modelValue":V[10]||(V[10]=O=>U.autologsFlights=O),type:"checkbox",class:"h-4 w-4 accent-[var(--accent)]"},null,512),[[Va,U.autologsFlights]]),V[28]||(V[28]=z(" Auto-logs flights (onboard FDR) ",-1))]),a("label",Ux,[ie(a("input",{"onUpdate:modelValue":V[11]||(V[11]=O=>U.isToy=O),type:"checkbox",class:"h-4 w-4 accent-[var(--accent)]"},null,512),[[Va,U.isToy]]),V[29]||(V[29]=z(" Toy drone (logbook-exempt) ",-1))])]),a("div",Vx,[a("button",{class:"btn-accent",disabled:oe.value,onClick:Ce},x(oe.value?"Saving…":N.value?"Save changes":"Add drone"),9,Zx),a("button",{class:"btn-ghost",onClick:ke},"Cancel"),R.value?(p(),m("span",Hx,x(R.value),1)):I("",!0)])])):I("",!0),a("div",jx,[_.value?(p(),m("div",Wx,"Loading…")):h.value.length?(p(),m("div",Gx,[a("table",qx,[a("thead",null,[a("tr",Yx,[(p(),m(ae,null,ze(["Drone","Serial","Firmware","Ctrl FW","Registration","Class",""],O=>a("th",{key:O,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(O),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(h.value,O=>(p(),m("tr",{key:O.id,class:Pe(["border-b border-line last:border-0",N.value===O.id?"bg-accent-soft":""])},[a("td",Jx,[a("div",Xx,[a("span",Qx,x(O.displayName),1),M(O)?(p(),m("span",{key:0,class:Pe(["inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold",f.success])},[A(Q,{name:"signal",size:11}),V[33]||(V[33]=z(" connected ",-1))],2)):I("",!0)]),O.name&&O.model?(p(),m("div",e0,x(O.model),1)):O.name?I("",!0):(p(),m("div",t0,"no custom name yet"))]),a("td",n0,[z(x(O.serial||"—")+" ",1),O.flightControllerSerial?(p(),m("div",i0," FC "+x(O.flightControllerSerial),1)):I("",!0)]),a("td",o0,x(O.firmware||"—"),1),a("td",s0,x(O.controllerFirmware||"—"),1),a("td",a0,x(O.registration||"—"),1),a("td",r0,[O.cClass?(p(),m("span",{key:0,class:Pe(["inline-flex rounded-full px-2 py-0.5 text-[11px] font-semibold",f.accent])},x(O.cClass),3)):(p(),m("span",l0,"—")),O.isToy?(p(),m("span",{key:2,class:Pe(["ml-1 inline-flex rounded-full px-2 py-0.5 text-[11px] font-semibold",f.neutral])},"toy",2)):I("",!0)]),a("td",u0,[Le.value===O.id?(p(),m(ae,{key:0},[V[34]||(V[34]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:V[12]||(V[12]=F=>Le.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:F=>Ze(O)},"Delete",8,c0)],64)):(p(),m(ae,{key:1},[a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:F=>ue(O)},[A(Q,{name:"sliders",size:13}),V[35]||(V[35]=z(" Edit",-1))],8,d0),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:F=>Le.value=O.id},[A(Q,{name:"trash",size:13})],8,f0)],64))])],2))),128))])])])):(p(),m("div",Kx,[A(Q,{name:"drone",size:26,class:"text-ink-muted"}),V[31]||(V[31]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No drones yet",-1)),V[32]||(V[32]=a("div",{class:"mt-1 text-xs text-ink-muted"}," Connect a drone in the Fly App and it lands here by itself — or add one by hand. ",-1))]))])]))}},p0={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},m0={class:"flex flex-wrap items-center gap-3"},g0={class:"inline-flex flex-wrap rounded-lg border border-line bg-surface-1 p-0.5"},v0=["onClick"],_0={class:"ml-auto"},b0={class:"grid grid-cols-4 gap-4 max-[900px]:grid-cols-2"},y0={class:"eyebrow"},x0={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},w0={key:1,class:"panel p-5"},k0={class:"mb-4 flex items-center justify-between"},S0={class:"eyebrow"},T0={class:"mt-0.5 text-base font-semibold text-ink"},P0={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},C0={class:"col-span-2 block max-[760px]:col-span-1"},L0={class:"block"},A0=["value"],M0={class:"block"},E0=["value"],O0={class:"block"},z0=["value"],$0={class:"block"},I0={class:"block"},N0={class:"block"},F0={class:"block"},D0=["value"],R0={class:"block"},B0={class:"block"},U0={class:"block"},V0=["value"],Z0={class:"mt-3 block"},H0={key:0,class:"mt-3"},j0={class:"eyebrow mb-1 block"},W0={key:1,class:"mt-3 text-xs text-ink-muted"},K0={class:"mt-4 flex items-center gap-3"},G0=["disabled"],q0={key:0,class:"text-sm text-danger-fg"},Y0={class:"panel overflow-hidden p-0"},J0={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},X0={key:1,class:"grid place-items-center px-5 py-16 text-center"},Q0={class:"mt-3 text-sm font-medium text-ink-secondary"},ew={class:"mt-1 text-xs text-ink-muted"},tw={key:2,class:"overflow-x-auto"},nw={class:"w-full border-collapse text-sm"},iw={class:"text-left"},ow={class:"px-5 py-3"},sw={class:"font-semibold text-ink"},aw={key:0,class:"font-mono text-[11px] text-ink-muted"},rw={class:"px-5 py-3 text-ink-secondary"},lw={class:"px-5 py-3 text-ink-secondary"},uw={class:"px-5 py-3"},cw=["onClick"],dw={key:0,class:"mt-0.5 font-mono text-[10.5px] text-ink-muted"},fw={class:"px-5 py-3 font-mono text-ink-secondary"},hw={class:"whitespace-nowrap px-5 py-3 text-right"},pw=["onClick"],mw=["onClick"],gw=["href"],vw=["onClick"],_w=["onClick"],bw=["onClick"],yw={key:0,class:"border-b border-line bg-surface-2"},xw={colspan:"6",class:"px-5 py-3"},ww={class:"flex flex-wrap gap-x-8 gap-y-1.5 text-xs"},kw={class:"text-ink-secondary"},Sw={class:"text-ink"},Tw={class:"text-ink-secondary"},Pw={class:"text-ink"},Cw={key:0,class:"text-ink-secondary"},Lw={class:"text-ink"},Aw={key:1,class:"text-ink-secondary"},Mw={class:"font-mono text-ink"},Ew={key:2,class:"text-ink-secondary"},Ow={class:"font-mono text-ink"},zw={class:"text-ink-secondary"},$w={class:"text-ink"},Iw={key:0,class:"mt-2 space-y-1"},Nw={key:1,class:"mt-2 text-xs text-success-fg"},Fw={key:2,class:"mt-2 text-xs text-ink-secondary"},Dw={class:"flex max-h-[90vh] w-full max-w-[920px] flex-col overflow-hidden rounded-lg border border-line bg-surface-1 shadow-2xl"},Rw={class:"flex items-center gap-3 border-b border-line px-5 py-3"},Bw={class:"min-w-0"},Uw={class:"truncate text-sm font-semibold text-ink"},Vw={class:"truncate font-mono text-[11px] text-ink-muted"},Zw={class:"ml-auto flex items-center gap-2"},Hw=["href"],jw=["href"],Ww={class:"flex-1 overflow-auto bg-surface-2"},Kw=["src","alt"],Gw=["src","title"],qw={key:2,class:"grid place-items-center px-6 py-16 text-center"},Yw={class:"mt-1 text-xs text-ink-muted"},Jw=["href"],Xw={__name:"Documents",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},setup(t){const i={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},s=[{value:"certificate",label:"Pilot certificate"},{value:"medical",label:"Medical / training"},{value:"insurance",label:"Insurance / liability"},{value:"background_check",label:"Background check / waiver"},{value:"registration",label:"Aircraft registration"},{value:"maintenance",label:"Maintenance log"},{value:"conformity",label:"Conformity / compliance"},{value:"firmware",label:"Firmware / software"},{value:"incident",label:"Incident / repair report"},{value:"flight_log",label:"Flight log"},{value:"checklist",label:"Pre-flight checklist"},{value:"airspace_auth",label:"Airspace authorisation"},{value:"mission_plan",label:"Mission plan / flight path"},{value:"risk_assessment",label:"Risk assessment / survey"},{value:"contract",label:"Contract / SOW"},{value:"client_insurance",label:"Client insurance cert"},{value:"delivery_report",label:"Delivery / media handoff"},{value:"other",label:"Other"}],l=Object.fromEntries(s.map(w=>[w.value,w.label])),u=[{value:"pilot",label:"Pilot"},{value:"aircraft",label:"Aircraft"},{value:"organization",label:"Organization"},{value:"client",label:"Client"},{value:"other",label:"Other"}],f=[{value:"active",label:"Active"},{value:"pending_review",label:"Pending review"},{value:"archived",label:"Archived"}],h=[{value:"pilot",label:"Pilot"},{value:"ops",label:"Ops manager"},{value:"admin",label:"Admin"},{value:"client",label:"Client-facing"}],_=Y([]),b=Y([]),C=Y(!1),T=Y("");async function M(){C.value=!0,T.value="";const[w,y]=await Promise.all([Ip(),pl()]);w.ok||(T.value=w.status===503?"Document storage is not configured on the API Server (service account missing).":"Could not load documents."),_.value=w.documents,b.value=y.drones||[],C.value=!1}ti(M);const H=Y("all"),j=[["all","All"],["expiring","Expiring soon"],["expired","Expired"],["pending","Pending review"],["archived","Archived"]],G=de(()=>{const w=_.value;switch(H.value){case"expiring":return w.filter(y=>{var S;return((S=y.expiry)==null?void 0:S.state)==="expiring_soon"&&y.status!=="archived"});case"expired":return w.filter(y=>{var S;return((S=y.expiry)==null?void 0:S.state)==="expired"&&y.status!=="archived"});case"pending":return w.filter(y=>y.status==="pending_review");case"archived":return w.filter(y=>y.status==="archived");default:return w.filter(y=>y.status!=="archived")}});function N(w){if(w.status==="archived")return{tone:"neutral",label:"Superseded",icon:""};const y=w.expiry||{};return y.state==="expired"?{tone:"danger",label:"Expired",icon:"alertTriangle"}:y.state==="expiring_soon"?{tone:"warning",label:`Expires in ${y.daysUntilExpiry}d`,icon:"clock"}:y.state==="valid"?{tone:"success",label:"Valid",icon:"check"}:{tone:"neutral",label:"No expiry",icon:""}}const U=Y("");function R(w){U.value=U.value===w?"":w}function oe(w){return w.ownerDrone?w.ownerDroneName||"Aircraft":w.ownerRef?w.ownerRef:w.ownerType==="pilot"?"Pilot":w.ownerType?w.ownerType.charAt(0).toUpperCase()+w.ownerType.slice(1):"—"}const we=["png","jpg","jpeg","gif","webp","svg","bmp","avif"],ue=["pdf","txt","csv","log","json","md","html","htm","xml"];function ke(w){const y=(w||"").split(".").pop().toLowerCase();return we.includes(y)?"image":ue.includes(y)?"frame":"none"}const Ce=Y(null),Le=de(()=>Ce.value?ke(Ce.value.fileName):"none"),Ze=de(()=>Ce.value?Rp(Ce.value.id):"");function he(w){Ce.value=w}function ee(){Ce.value=null}function V(w){w.key==="Escape"&&Ce.value&&ee()}ti(()=>window.addEventListener("keydown",V)),us(()=>window.removeEventListener("keydown",V));function O(){return{title:"",docType:"certificate",ownerType:"pilot",ownerDrone:"",ownerRef:"",reference:"",jurisdiction:"",issueDate:"",expiryDate:"",status:"active",accessTier:"ops",notes:""}}const F=Y(!1),$=Y(""),Ye=Y(""),Se=Y(""),ge=gt(O()),fe=Y(null),ft=Y(null),pe=Y(""),Ue=Y(!1);function Ve(){fe.value=null,ft.value&&(ft.value.value="")}function wt(){Object.assign(ge,O()),$.value="",Ye.value="",Se.value="",Ve(),pe.value="",F.value=!0}function st(w){Object.assign(ge,{title:w.title||"",docType:w.docType||"certificate",ownerType:w.ownerType||"pilot",ownerDrone:w.ownerDrone||"",ownerRef:w.ownerRef||"",reference:w.reference||"",jurisdiction:w.jurisdiction||"",issueDate:w.issueDate||"",expiryDate:w.expiryDate||"",status:w.status||"active",accessTier:w.accessTier||"ops",notes:w.notes||""}),$.value=w.id,Ye.value="",Se.value="",Ve(),pe.value="",F.value=!0}function Me(w){st(w),$.value="",Ye.value=w.id,Se.value=w.title,ge.status="active"}function De(){F.value=!1,$.value="",Ye.value=""}function zt(w){var y;fe.value=((y=w.target.files)==null?void 0:y[0])||null}async function At(){var y;if(pe.value="",!ge.title.trim()){pe.value="Give the document a title.";return}Ue.value=!0;let w;if($.value)w=await Fp($.value,{...ge});else{const S={...ge};Ye.value&&(S.replaces=Ye.value),w=await Np(S,fe.value)}if(Ue.value=!1,!w.ok){pe.value=((y=w.body)==null?void 0:y.error)||"Could not save the document.";return}F.value=!1,$.value="",Ye.value="",await M()}const Ut=Y("");async function Pt(w){var S;const y=await Dp(w.id);Ut.value="",y.ok?await M():pe.value=((S=y.body)==null?void 0:S.error)||"Could not delete the document."}const kt=de(()=>{const w=_.value.filter(y=>y.status!=="archived");return{total:w.length,expiring:w.filter(y=>{var S;return((S=y.expiry)==null?void 0:S.state)==="expiring_soon"}).length,expired:w.filter(y=>{var S;return((S=y.expiry)==null?void 0:S.state)==="expired"}).length,pending:_.value.filter(y=>y.status==="pending_review").length}});return(w,y)=>(p(),m("div",p0,[a("div",m0,[a("div",g0,[(p(),m(ae,null,ze(j,S=>a("button",{key:S[0],class:Pe(["rounded-md px-3.5 py-1.5 text-sm font-semibold transition",H.value===S[0]?"bg-accent-soft text-accent-soft-fg":"text-ink-secondary hover:text-ink"]),onClick:q=>H.value=S[0]},x(S[1]),11,v0)),64))]),a("div",_0,[a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:wt},[A(Q,{name:"upload",size:15}),y[13]||(y[13]=z(" Add document ",-1))])])]),a("div",b0,[(p(!0),m(ae,null,ze([{label:"Documents on file",value:kt.value.total,tone:"neutral"},{label:"Expiring soon",value:kt.value.expiring,tone:kt.value.expiring?"warning":"neutral"},{label:"Expired",value:kt.value.expired,tone:kt.value.expired?"danger":"success"},{label:"Pending review",value:kt.value.pending,tone:kt.value.pending?"accent":"neutral"}],S=>(p(),m("div",{key:S.label,class:"panel p-5"},[a("div",y0,x(S.label),1),a("div",{class:Pe(["mt-2 text-[30px] font-bold leading-none tracking-tightest",S.tone==="danger"?"text-danger-fg":S.tone==="warning"?"text-amber-fg":S.tone==="success"?"text-success-fg":S.tone==="accent"?"text-accent-soft-fg":"text-ink"])},x(S.value),3)]))),128))]),T.value?(p(),m("div",x0,x(T.value),1)):I("",!0),F.value?(p(),m("div",w0,[a("div",k0,[a("div",null,[a("div",S0,x($.value?"Edit document":Ye.value?"New version":"New document"),1),a("div",T0,x(Ye.value?`Supersedes “${Se.value}”`:"Compliance & operational document"),1)]),a("button",{class:"btn-icon",onClick:De},[A(Q,{name:"x",size:16})])]),a("div",P0,[a("label",C0,[y[14]||(y[14]=a("span",{class:"eyebrow mb-1 block"},"Title",-1)),ie(a("input",{"onUpdate:modelValue":y[0]||(y[0]=S=>ge.title=S),class:"field",placeholder:"A2 Remote Pilot Certificate — J. Dariusz"},null,512),[[me,ge.title]])]),a("label",L0,[y[15]||(y[15]=a("span",{class:"eyebrow mb-1 block"},"Type",-1)),ie(a("select",{"onUpdate:modelValue":y[1]||(y[1]=S=>ge.docType=S),class:"field"},[(p(),m(ae,null,ze(s,S=>a("option",{key:S.value,value:S.value},x(S.label),9,A0)),64))],512),[[Ot,ge.docType]])]),a("label",M0,[y[16]||(y[16]=a("span",{class:"eyebrow mb-1 block"},"Owner type",-1)),ie(a("select",{"onUpdate:modelValue":y[2]||(y[2]=S=>ge.ownerType=S),class:"field"},[(p(),m(ae,null,ze(u,S=>a("option",{key:S.value,value:S.value},x(S.label),9,E0)),64))],512),[[Ot,ge.ownerType]])]),a("label",O0,[y[18]||(y[18]=a("span",{class:"eyebrow mb-1 block"},"Aircraft (if any)",-1)),ie(a("select",{"onUpdate:modelValue":y[3]||(y[3]=S=>ge.ownerDrone=S),class:"field"},[y[17]||(y[17]=a("option",{value:""},"— none —",-1)),(p(!0),m(ae,null,ze(b.value,S=>(p(),m("option",{key:S.id,value:S.id},x(S.name)+x(S.model?` · ${S.model}`:""),9,z0))),128))],512),[[Ot,ge.ownerDrone]])]),a("label",$0,[y[19]||(y[19]=a("span",{class:"eyebrow mb-1 block"},"Owner reference",-1)),ie(a("input",{"onUpdate:modelValue":y[4]||(y[4]=S=>ge.ownerRef=S),class:"field",placeholder:"Client name / serial / site"},null,512),[[me,ge.ownerRef]])]),a("label",I0,[y[20]||(y[20]=a("span",{class:"eyebrow mb-1 block"},"Reference / number",-1)),ie(a("input",{"onUpdate:modelValue":y[5]||(y[5]=S=>ge.reference=S),class:"field",placeholder:"Cert / registration / policy no."},null,512),[[me,ge.reference]])]),a("label",N0,[y[21]||(y[21]=a("span",{class:"eyebrow mb-1 block"},"Jurisdiction",-1)),ie(a("input",{"onUpdate:modelValue":y[6]||(y[6]=S=>ge.jurisdiction=S),class:"field",placeholder:"DK / EASA / FAA"},null,512),[[me,ge.jurisdiction]])]),a("label",F0,[y[22]||(y[22]=a("span",{class:"eyebrow mb-1 block"},"Access tier",-1)),ie(a("select",{"onUpdate:modelValue":y[7]||(y[7]=S=>ge.accessTier=S),class:"field"},[(p(),m(ae,null,ze(h,S=>a("option",{key:S.value,value:S.value},x(S.label),9,D0)),64))],512),[[Ot,ge.accessTier]])]),a("label",R0,[y[23]||(y[23]=a("span",{class:"eyebrow mb-1 block"},"Issue date",-1)),ie(a("input",{"onUpdate:modelValue":y[8]||(y[8]=S=>ge.issueDate=S),type:"date",class:"field"},null,512),[[me,ge.issueDate]])]),a("label",B0,[y[24]||(y[24]=a("span",{class:"eyebrow mb-1 block"},"Expiry date",-1)),ie(a("input",{"onUpdate:modelValue":y[9]||(y[9]=S=>ge.expiryDate=S),type:"date",class:"field"},null,512),[[me,ge.expiryDate]])]),a("label",U0,[y[25]||(y[25]=a("span",{class:"eyebrow mb-1 block"},"Status",-1)),ie(a("select",{"onUpdate:modelValue":y[10]||(y[10]=S=>ge.status=S),class:"field"},[(p(),m(ae,null,ze(f,S=>a("option",{key:S.value,value:S.value},x(S.label),9,V0)),64))],512),[[Ot,ge.status]])])]),a("label",Z0,[y[26]||(y[26]=a("span",{class:"eyebrow mb-1 block"},"Notes",-1)),ie(a("textarea",{"onUpdate:modelValue":y[11]||(y[11]=S=>ge.notes=S),rows:"2",class:"field",placeholder:"Conditions, renewal contacts, anything worth recording"},null,512),[[me,ge.notes]])]),$.value?(p(),m("div",W0,[...y[28]||(y[28]=[z(" Editing updates metadata only. To replace the file, close this and use ",-1),a("b",{class:"text-ink-secondary"},"New version",-1),z(" on the document — the old version is kept for audit. ",-1)])])):(p(),m("div",H0,[a("span",j0,"File "+x(Ye.value?"(new version)":"(optional)"),1),a("input",{ref_key:"fileInput",ref:ft,type:"file",class:"field",onChange:zt},null,544),y[27]||(y[27]=a("p",{class:"mt-1 text-xs text-ink-muted"}," Stored in PocketBase for now (object storage later). Max 50 MB. ",-1))])),a("div",K0,[a("button",{class:"btn-accent",disabled:Ue.value,onClick:At},x(Ue.value?"Saving…":$.value?"Save changes":Ye.value?"Upload new version":"Add document"),9,G0),a("button",{class:"btn-ghost",onClick:De},"Cancel"),pe.value?(p(),m("span",q0,x(pe.value),1)):I("",!0)])])):I("",!0),a("div",Y0,[C.value?(p(),m("div",J0,"Loading…")):G.value.length?(p(),m("div",tw,[a("table",nw,[a("thead",null,[a("tr",iw,[(p(),m(ae,null,ze(["Title","Type","Owner","Expiry","Ver",""],S=>a("th",{key:S,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(S),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(G.value,S=>{var q,W;return p(),m(ae,{key:S.id},[a("tr",{class:Pe(["border-b border-line last:border-0",$.value===S.id?"bg-accent-soft":""])},[a("td",ow,[a("div",sw,x(S.title),1),S.reference?(p(),m("div",aw,x(S.reference),1)):I("",!0)]),a("td",rw,x($e(l)[S.docType]||S.docType||"—"),1),a("td",lw,x(oe(S)),1),a("td",uw,[a("button",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",i[N(S).tone]]),onClick:J=>R(S.id)},[N(S).icon?(p(),nt(Q,{key:0,name:N(S).icon,size:12},null,8,["name"])):I("",!0),z(" "+x(N(S).label),1)],10,cw),S.expiryDate?(p(),m("div",dw,x(S.expiryDate),1)):I("",!0)]),a("td",fw,"v"+x(S.version||1),1),a("td",hw,[Ut.value===S.id?(p(),m(ae,{key:0},[y[29]||(y[29]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:y[12]||(y[12]=J=>Ut.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:J=>Pt(S)},"Delete",8,pw)],64)):(p(),m(ae,{key:1},[S.hasFile?(p(),m("button",{key:0,class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Preview",onClick:J=>he(S)},[A(Q,{name:"eye",size:13})],8,mw)):I("",!0),S.hasFile?(p(),m("a",{key:1,href:$e(zr)(S.id),class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Download file"},[A(Q,{name:"download",size:13})],8,gw)):I("",!0),a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Upload new version",onClick:J=>Me(S)},[A(Q,{name:"upload",size:13})],8,vw),a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:J=>st(S)},[A(Q,{name:"sliders",size:13}),y[30]||(y[30]=z(" Edit",-1))],8,_w),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:J=>Ut.value=S.id},[A(Q,{name:"trash",size:13})],8,bw)],64))])],2),U.value===S.id?(p(),m("tr",yw,[a("td",xw,[a("div",ww,[a("span",kw,[y[31]||(y[31]=z("Status: ",-1)),a("b",Sw,x(S.status||"—"),1)]),a("span",Tw,[y[32]||(y[32]=z("Access: ",-1)),a("b",Pw,x(S.accessTier||"—"),1)]),S.jurisdiction?(p(),m("span",Cw,[y[33]||(y[33]=z("Jurisdiction: ",-1)),a("b",Lw,x(S.jurisdiction),1)])):I("",!0),S.issueDate?(p(),m("span",Aw,[y[34]||(y[34]=z("Issued: ",-1)),a("b",Mw,x(S.issueDate),1)])):I("",!0),S.expiryDate?(p(),m("span",Ew,[y[35]||(y[35]=z("Expires: ",-1)),a("b",Ow,x(S.expiryDate),1)])):I("",!0),a("span",zw,[y[36]||(y[36]=z("File: ",-1)),a("b",$w,x(S.hasFile?S.fileName:"none"),1)])]),(((q=S.expiry)==null?void 0:q.flags)||[]).length?(p(),m("ul",Iw,[(p(!0),m(ae,null,ze(S.expiry.flags,(J,ce)=>(p(),m("li",{key:ce,class:Pe(["flex items-start gap-2 text-xs",S.expiry.state==="expired"?"text-danger-fg":S.expiry.state==="expiring_soon"?"text-amber-fg":"text-ink-secondary"])},[A(Q,{name:"alertTriangle",size:13,class:"mt-px shrink-0"}),z(" "+x(J),1)],2))),128))])):((W=S.expiry)==null?void 0:W.state)==="valid"?(p(),m("div",Nw,"In force — no action needed.")):I("",!0),S.notes?(p(),m("div",Fw,[y[37]||(y[37]=a("span",{class:"text-ink-muted"},"Notes:",-1)),z(" "+x(S.notes),1)])):I("",!0)])])):I("",!0)],64)}),128))])])])):(p(),m("div",X0,[A(Q,{name:"fileText",size:26,class:"text-ink-muted"}),a("div",Q0,x(H.value==="all"?"No documents on file yet":"Nothing in this view"),1),a("div",ew,x(H.value==="all"?"Add certificates, registrations, insurance and authorisations to track their expiry.":"Try a different filter."),1)]))]),(p(),nt(cf,{to:"body"},[Ce.value?(p(),m("div",{key:0,class:"fixed inset-0 z-50 grid place-items-center p-4",style:{background:"color-mix(in srgb, black 60%, transparent)"},onClick:hl(ee,["self"])},[a("div",Dw,[a("div",Rw,[a("div",Bw,[a("div",Uw,x(Ce.value.title),1),a("div",Vw,x(Ce.value.fileName),1)]),a("div",Zw,[a("a",{href:Ze.value,target:"_blank",rel:"noopener",class:"btn-ghost inline-flex items-center gap-1.5",title:"Open in new tab"},[A(Q,{name:"globe",size:14}),y[38]||(y[38]=z(" New tab ",-1))],8,Hw),a("a",{href:$e(zr)(Ce.value.id),class:"btn-ghost inline-flex items-center gap-1.5",title:"Download"},[A(Q,{name:"download",size:14}),y[39]||(y[39]=z(" Download ",-1))],8,jw),a("button",{class:"btn-icon",title:"Close",onClick:ee},[A(Q,{name:"x",size:16})])])]),a("div",Ww,[Le.value==="image"?(p(),m("img",{key:0,src:Ze.value,alt:Ce.value.title,class:"mx-auto block max-w-full"},null,8,Kw)):Le.value==="frame"?(p(),m("iframe",{key:1,src:Ze.value,class:"h-[74vh] w-full border-0 bg-white",title:Ce.value.title},null,8,Gw)):(p(),m("div",qw,[A(Q,{name:"fileText",size:28,class:"text-ink-muted"}),y[41]||(y[41]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"Preview isn't available for this file type",-1)),a("div",Yw,x(Ce.value.fileName),1),a("a",{href:$e(zr)(Ce.value.id),class:"btn-accent mt-4 inline-flex items-center gap-2"},[A(Q,{name:"download",size:15}),y[40]||(y[40]=z(" Download instead ",-1))],8,Jw)]))])])])):I("",!0)]))]))}},Qw={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},e2={class:"flex flex-wrap items-center gap-3"},t2={class:"ml-auto flex items-center gap-2"},n2=["disabled"],i2={class:"grid grid-cols-4 gap-4 max-[900px]:grid-cols-2"},o2={class:"eyebrow"},s2={class:"mt-2 text-[30px] font-bold leading-none tracking-tightest text-ink"},a2={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},r2={class:"panel overflow-hidden p-0"},l2={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},u2={key:1,class:"grid place-items-center px-5 py-16 text-center"},c2={key:2,class:"overflow-x-auto"},d2={class:"w-full border-collapse text-sm"},f2={class:"text-left"},h2=["onClick"],p2={class:"px-5 py-3"},m2={class:"flex items-center gap-2"},g2={class:"font-semibold text-ink"},v2={key:0,class:"inline-flex rounded-full bg-surface-2 px-2 py-0.5 text-[11px] font-semibold text-ink-secondary"},_2={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},b2={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},y2={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},x2={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},w2={class:"px-5 py-3 text-xs text-ink-secondary"},k2={class:"whitespace-nowrap px-5 py-3 text-xs text-ink-muted"},S2={key:0,class:"border-b border-line bg-surface-2"},T2={colspan:"7",class:"px-5 py-3"},P2={class:"w-full text-xs"},C2={class:"text-left text-ink-muted"},L2={class:"font-mono text-ink-secondary"},A2={class:"py-1 pr-4"},M2={class:"py-1 pr-4"},E2={class:"py-1 pr-4"},O2={class:"py-1 pr-4"},z2={class:"py-1 pr-4"},$2={class:"py-1 pr-4"},I2={class:"py-1 pr-4"},N2={__name:"Routes",setup(t){const i=Y([]),s=Y(!1),l=Y(""),u=Y("");async function f(){s.value=!0,l.value="";const N=await $p();N.ok||(l.value=N.status===503?"Route storage is not configured on the API Server (service account missing).":"Could not load your routes."),i.value=N.routes,s.value=!1}ti(f);function h(N,U){const oe=Ce=>Ce*Math.PI/180,we=oe(U.lat-N.lat),ue=oe(U.lon-N.lon),ke=Math.sin(we/2)**2+Math.cos(oe(N.lat))*Math.cos(oe(U.lat))*Math.sin(ue/2)**2;return 2*6371e3*Math.asin(Math.sqrt(ke))}function _(N){var U;return Array.isArray((U=N.spec)==null?void 0:U.points)?N.spec.points:[]}function b(N){const U=_(N);let R=0;for(let oe=1;oe=1e3?`${(N/1e3).toFixed(2)} km`:`${Math.round(N)} m`}function T(N){var oe;const U=Number((oe=N.spec)==null?void 0:oe.cruiseSpeed)||0;if(!U)return"—";const R=Math.round(b(N)/U);return R>=60?`${Math.floor(R/60)} min ${R%60} s`:`${R} s`}function M(N){const U=new Date(N);return Number.isNaN(U.getTime())?"—":U.toLocaleString()}const H={goHome:"Return to home",hover:"Hover",land:"Land",firstWaypoint:"Back to first WP"},j={none:"—",photo:"Photo",startRecord:"Start recording",stopRecord:"Stop recording"},G=de(()=>{const N=i.value;return{count:N.length,mine:N.filter(U=>U.mine).length,waypoints:N.reduce((U,R)=>U+_(R).length,0),distance:N.reduce((U,R)=>U+b(R),0)}});return(N,U)=>(p(),m("div",Qw,[a("div",e2,[U[1]||(U[1]=a("div",null,[a("div",{class:"eyebrow"},"Mission library"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Waypoint routes")],-1)),a("div",t2,[a("button",{class:"btn-ghost inline-flex items-center gap-2",disabled:s.value,onClick:f},[A(Q,{name:"download",size:14}),U[0]||(U[0]=z(" Refresh ",-1))],8,n2)])]),a("div",i2,[(p(!0),m(ae,null,ze([{label:"Routes",value:G.value.count},{label:"Yours",value:G.value.mine},{label:"Waypoints",value:G.value.waypoints},{label:"Total distance",value:C(G.value.distance)}],R=>(p(),m("div",{key:R.label,class:"panel p-5"},[a("div",o2,x(R.label),1),a("div",s2,x(R.value),1)]))),128))]),l.value?(p(),m("div",a2,x(l.value),1)):I("",!0),a("div",r2,[s.value&&!i.value.length?(p(),m("div",l2,"Loading…")):i.value.length?(p(),m("div",c2,[a("table",d2,[a("thead",null,[a("tr",f2,[(p(),m(ae,null,ze(["Route","Waypoints","Length","Est. time","Speed","On finish","Updated"],R=>a("th",{key:R,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(R),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(i.value,R=>{var oe,we,ue;return p(),m(ae,{key:R.id},[a("tr",{class:Pe(["cursor-pointer border-b border-line last:border-0 hover:bg-surface-2",u.value===R.id?"bg-accent-soft":""]),onClick:ke=>u.value=u.value===R.id?"":R.id},[a("td",p2,[a("div",m2,[A(Q,{name:"chevronRight",size:13,class:Pe(["text-ink-muted transition",u.value===R.id?"rotate-90":""])},null,8,["class"]),a("span",g2,x(R.name||"Route"),1),R.mine?I("",!0):(p(),m("span",v2," another pilot "))])]),a("td",_2,x(_(R).length),1),a("td",b2,x(C(b(R))),1),a("td",y2,x(T(R)),1),a("td",x2,x(((oe=R.spec)==null?void 0:oe.cruiseSpeed)??"—")+" m/s",1),a("td",w2,x(H[(we=R.spec)==null?void 0:we.finishAction]||((ue=R.spec)==null?void 0:ue.finishAction)||"—"),1),a("td",k2,x(M(R.updatedAt)),1)],10,h2),u.value===R.id?(p(),m("tr",S2,[a("td",T2,[a("table",P2,[a("thead",null,[a("tr",C2,[(p(),m(ae,null,ze(["#","Latitude","Longitude","Altitude","Speed","Gimbal","Action"],ke=>a("th",{key:ke,class:"py-1 pr-4 font-mono text-[10.5px] font-normal uppercase tracking-caps"},x(ke),1)),64))])]),a("tbody",L2,[(p(!0),m(ae,null,ze(_(R),(ke,Ce)=>(p(),m("tr",{key:Ce},[a("td",A2,x(Ce+1),1),a("td",M2,x(Number(ke.lat).toFixed(6)),1),a("td",E2,x(Number(ke.lon).toFixed(6)),1),a("td",O2,x(ke.altitude)+" m",1),a("td",z2,x(ke.speed!=null?`${ke.speed} m/s`:"cruise"),1),a("td",$2,x(ke.gimbalPitch!=null?`${ke.gimbalPitch}°`:"—"),1),a("td",I2,x(j[ke.action]||ke.action||"—")+x(ke.hoverSeconds?` · hover ${ke.hoverSeconds} s`:""),1)]))),128))])]),U[4]||(U[4]=a("div",{class:"mt-2 text-xs text-ink-muted"},"Edit this route in the Fly App; changes sync here.",-1))])])):I("",!0)],64)}),128))])])])):(p(),m("div",u2,[A(Q,{name:"route",size:26,class:"text-ink-muted"}),U[2]||(U[2]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No routes yet",-1)),U[3]||(U[3]=a("div",{class:"mt-1 text-xs text-ink-muted"}," Save a route in the Fly App's Waypoints mission library while signed in and it shows up here. ",-1))]))])]))}},F2={class:"grid h-full grid-cols-[248px_1fr] max-[900px]:grid-cols-1"},D2={class:"flex flex-col border-r border-line bg-surface-1 px-4 py-5 max-[900px]:hidden"},R2={class:"flex items-center gap-2.5 px-2 pb-5"},B2={class:"flex flex-col gap-0.5"},U2=["onClick"],V2={class:"mt-auto flex flex-col gap-2.5"},Z2={class:"rounded-lg bg-surface-2 p-3"},H2={class:"flex items-center gap-2"},j2={class:"text-xs font-semibold text-ink"},W2={class:"mt-1.5 block font-mono text-[10.5px] text-ink-muted"},K2={class:"flex items-center gap-2.5 px-2 py-1"},G2={class:"grid h-8 w-8 place-items-center rounded-full bg-[var(--navy-800)] text-xs font-bold text-white"},q2={class:"min-w-0 flex-1"},Y2={class:"truncate text-[13px] font-semibold text-ink"},J2={class:"flex items-center gap-1.5 text-[11px] text-ink-muted"},X2=["title"],Q2={class:"overflow-y-auto"},ek={class:"sticky top-0 z-10 flex items-center gap-4 border-b border-line px-7 py-3.5",style:{background:"color-mix(in srgb, var(--bg-app) 82%, transparent)","backdrop-filter":"blur(10px)"}},tk={class:"mt-0.5 text-[22px] font-bold tracking-tightest text-ink"},nk={class:"ml-auto flex items-center gap-3"},ik={class:"flex h-10 w-60 items-center gap-2 rounded border border-line-strong bg-surface-1 px-3 max-[1100px]:hidden"},ok={key:0,class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},sk={class:"grid grid-cols-4 gap-4 max-[1100px]:grid-cols-2 max-[560px]:grid-cols-1"},ak={class:"flex items-center justify-between"},rk={class:"eyebrow"},lk={class:"mt-2.5 text-[34px] font-bold leading-none tracking-tightest text-ink"},uk={class:"grid grid-cols-[1.6fr_1fr] gap-5 max-[1100px]:grid-cols-1"},ck={class:"panel p-5"},dk={class:"mb-3.5 flex items-center justify-between"},fk={class:"flex items-center gap-2"},hk={class:"relative z-[1200]"},pk={class:"panel absolute right-0 z-[1200] mt-1.5 w-72 p-3.5 shadow-lg"},mk={class:"flex items-center justify-between gap-3"},gk={class:"mb-1.5 flex items-center justify-between"},vk={class:"font-mono text-[11px] text-ink-muted"},_k=["value"],bk={key:0,class:"mt-1.5 text-[11px] text-ink-muted"},yk={key:0,class:"mt-2.5 text-xs text-ink-muted"},xk={key:1,class:"mt-2.5 text-xs text-ink-muted"},wk={key:2,class:"mt-2.5 text-xs text-ink-muted"},kk={class:"flex flex-col gap-5"},Sk={class:"panel p-5"},Tk={class:"mb-3.5 flex items-center justify-between"},Pk={class:"flex items-center gap-3"},Ck={class:"text-5xl leading-none"},Lk={class:"min-w-0"},Ak={class:"flex items-baseline gap-1"},Mk={class:"text-[34px] font-bold leading-none tracking-tightest text-ink"},Ek={class:"text-lg font-semibold text-ink-secondary"},Ok={class:"mt-1 truncate text-sm capitalize text-ink-secondary"},zk={class:"mt-1.5 truncate text-xs text-ink-muted"},$k={class:"mt-4 grid grid-cols-2 gap-2.5"},Ik={class:"rounded-lg bg-surface-2 px-3 py-2"},Nk={class:"mt-0.5 font-mono text-sm text-ink"},Fk={class:"rounded-lg bg-surface-2 px-3 py-2"},Dk={class:"mt-0.5 font-mono text-sm text-ink"},Rk={class:"rounded-lg bg-surface-2 px-3 py-2"},Bk={class:"mt-0.5 font-mono text-sm text-ink"},Uk={key:0},Vk={class:"rounded-lg bg-surface-2 px-3 py-2"},Zk={class:"mt-0.5 font-mono text-sm text-ink"},Hk={key:0},jk={key:0,class:"mt-3 text-[11px] text-ink-muted"},Wk={key:1,class:"grid place-items-center py-8 text-center"},Kk={class:"mt-0.5 text-xs text-ink-muted"},Gk={key:2,class:"grid place-items-center py-8 text-center text-sm text-ink-muted"},qk={class:"panel p-5"},Yk={class:"mb-3.5 flex items-center justify-between"},Jk={class:"grid place-items-center py-10 text-center"},Xk={class:"panel overflow-hidden p-0"},Qk={class:"flex items-center justify-between px-5 py-4"},eS={class:"flex gap-2"},tS={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},nS={key:1,class:"overflow-x-auto"},iS={class:"w-full border-collapse text-sm"},oS={class:"text-left"},sS=["onClick"],aS={class:"px-5 py-3 font-mono font-bold text-ink"},rS={class:"px-5 py-3 text-ink-secondary"},lS={class:"px-5 py-3"},uS={class:"px-5 py-3 font-mono text-ink-secondary"},cS={class:"px-5 py-3"},dS={key:0,class:"flex items-center gap-2"},fS={class:"h-1.5 w-12 overflow-hidden rounded bg-surface-2"},hS={class:"font-mono text-xs text-ink-secondary"},pS={key:1,class:"font-mono text-xs text-ink-muted"},mS={class:"px-5 py-3 font-mono text-ink-secondary"},gS={class:"px-5 py-3 text-right"},vS=["onClick"],_S={key:1,class:"p-7"},bS={class:"mb-4 flex flex-wrap items-center gap-3"},yS={class:"font-mono text-mode font-bold text-ink"},xS={key:0,class:"rounded-full bg-danger-soft px-2.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-caps text-danger-fg"},wS={key:1,class:"ml-auto flex flex-wrap gap-1.5"},kS=["onClick"],SS={key:0,class:"panel grid place-items-center p-16 text-center"},TS={class:"pill"},PS={class:"pill"},CS={class:"pill"},LS={class:"mt-1 text-sm font-semibold text-ink"},AS={class:"pill"},MS={class:"mt-1 font-mono text-sm font-bold tabular text-ink"},ES={class:"grid grid-cols-2 gap-4 max-[820px]:grid-cols-1"},OS={class:"panel p-4"},zS={class:"flex items-center gap-4"},$S={class:"h-9 flex-1 overflow-hidden rounded border border-line bg-surface-2"},IS={class:"readout"},NS={class:"panel p-4"},FS={class:"readout"},DS={class:"panel p-4"},RS={class:"space-y-1.5 text-sm"},BS={class:"flex justify-between"},US={class:"text-ink"},VS={class:"flex justify-between"},ZS={class:"text-ink"},HS={class:"flex justify-between"},jS={class:"font-mono tabular text-ink"},WS={class:"flex justify-between"},KS={class:"font-mono tabular text-ink"},GS={class:"panel p-4"},qS={class:"space-y-1.5 text-sm"},YS={class:"flex justify-between"},JS={class:"font-mono tabular text-ink"},XS={class:"flex justify-between"},QS={class:"font-mono tabular text-ink"},e5={class:"flex justify-between"},t5={class:"font-mono tabular text-ink"},n5={class:"panel col-span-2 p-4 max-[820px]:col-span-1"},i5={class:"panel p-4"},o5={class:"flex flex-wrap gap-2"},s5={class:"mt-2 min-h-[16px] text-xs text-ink-muted"},a5={class:"panel p-4"},r5={class:"h-[180px] overflow-y-auto font-mono text-xs"},l5={class:"text-ink-muted"},u5={class:"font-semibold text-accent"},c5={class:"break-all text-ink"},d5={key:7,class:"p-7"},f5={class:"panel grid place-items-center p-16 text-center"},h5={class:"mt-3 text-sm font-medium text-ink-secondary"},p5={key:0,class:"mt-1 text-xs text-ink-muted"},m5={key:1,class:"mt-1 text-xs text-ink-muted"},g5="34,-25,72,45",v5=600*1e3,_5={__name:"Dashboard",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},emits:["logout"],setup(t,{emit:i}){const s=t,l=i,u=gt({}),f=gt({}),h=Y(null),_=Y(!1),b=gt([]),C=Y(""),T=Y([]),M=gt({unavailable:!1,detail:"",loaded:!1,plan:"",recommendedInterval:30}),H=de(()=>T.value.filter(Z=>!Z.onGround).length),j=Y(!1);let G=null;const N=[{value:"auto",label:"Auto"},{value:5,label:"5s"},{value:10,label:"10s"},{value:15,label:"15s"},{value:30,label:"30s"},{value:60,label:"60s"},{value:120,label:"120s"}],U=de(()=>{if(be.airTrafficInterval==="auto")return M.recommendedInterval||30;const Z=Number(be.airTrafficInterval);return Number.isFinite(Z)&&Z>0?Z:30}),R=Y(null);let oe=!1;function we(){if(!(oe||R.value!==null)){if(typeof navigator>"u"||!navigator.geolocation){R.value=!1;return}oe=!0,navigator.geolocation.getCurrentPosition(Z=>{R.value={lat:Z.coords.latitude,lng:Z.coords.longitude},oe=!1},()=>{R.value=!1,oe=!1},{timeout:8e3,maximumAge:6e5})}}function ue(Z,E,Oe){const tt=Z&&Z.telemetry||{},It=tt[E],St=tt[Oe];return typeof It=="number"&&typeof St=="number"&&(It||St)?{lat:It,lng:St}:null}function ke(){const Z=ue(q.value,"latitude","longitude")||S.value.map(tt=>ue(u[tt],"latitude","longitude")).find(Boolean);if(Z){const tt=$r(Z.lat,Z.lng);if(tt)return tt.bbox}const E=ue(q.value,"phoneLatitude","phoneLongitude")||S.value.map(tt=>ue(u[tt],"phoneLatitude","phoneLongitude")).find(Boolean);if(E){const tt=$r(E.lat,E.lng);if(tt)return tt.bbox}if(we(),R.value){const tt=$r(R.value.lat,R.value.lng);if(tt)return tt.bbox}const Oe=wm(be.region);return Oe||g5}async function Ce(){if(!be.showAirTraffic)return;const Z=be.autoBbox?ke():void 0,{states:E,unavailable:Oe,detail:tt,plan:It,recommendedInterval:St}=await mp(Z);T.value=E,M.unavailable=Oe,M.detail=tt,M.plan=It||"",St&&(M.recommendedInterval=St),M.loaded=!0}function Le(){G&&clearInterval(G),G=setInterval(()=>{Me.value==="Overview"&&be.showAirTraffic&&Ce()},U.value*1e3)}function Ze(){Ce(),Le()}function he(){G&&clearInterval(G),G=null}const ee=gt({loaded:!1,unavailable:!1,detail:"",data:null,units:"metric",source:"",updatedAt:0});let V=null;function O(){const Z=ue(q.value,"latitude","longitude")||S.value.map(Oe=>ue(u[Oe],"latitude","longitude")).find(Boolean);if(Z)return{lat:Z.lat,lng:Z.lng,source:"drone"};const E=ue(q.value,"phoneLatitude","phoneLongitude")||S.value.map(Oe=>ue(u[Oe],"phoneLatitude","phoneLongitude")).find(Boolean);return E?{lat:E.lat,lng:E.lng,source:"phone"}:R.value?{lat:R.value.lat,lng:R.value.lng,source:"browser"}:null}async function F(){const Z=O(),E=await Sp(Z?Z.lat:void 0,Z?Z.lng:void 0);if(ee.loaded=!0,ee.units=E.units||"metric",E.unavailable||!E.weather){ee.unavailable=!0,ee.detail=E.detail||"Weather is unavailable.",ee.data=null;return}ee.unavailable=!1,ee.detail="",ee.data=E.weather,ee.source=Z?Z.source:"default",ee.updatedAt=Date.now()}function $(){V&&clearInterval(V),V=setInterval(()=>{Me.value==="Overview"&&F()},v5)}function Ye(){F(),$()}function Se(){V&&clearInterval(V),V=null}const ge=de(()=>ee.units==="imperial"?"°F":ee.units==="standard"?"K":"°C"),fe=de(()=>ee.units==="imperial"?"mph":"m/s");function ft(Z){const E=(Z||"").slice(0,2);return E==="01"?(Z||"").endsWith("n")?"🌙":"☀️":{"02":"🌤️","03":"⛅","04":"☁️","09":"🌧️",10:"🌦️",11:"⛈️",13:"❄️",50:"🌫️"}[E]||"🌡️"}const pe=de(()=>ft(ee.data&&ee.data.icon)),Ue=de(()=>{const Z=ee.data;return Z?Z.country?`${Z.location}, ${Z.country}`:Z.location||"Unknown location":""}),Ve=de(()=>ee.source==="drone"?"at aircraft location":ee.source==="phone"||ee.source==="browser"?"at your location":"default location"),wt=de(()=>ee.updatedAt?new Date(ee.updatedAt).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"");function st(Z,E=0){return typeof Z=="number"?Z.toFixed(E):"—"}const Me=Y("Overview"),De=[["grid","Overview"],["radio","Live flights"],["route","Routes"],["calendar","Schedule"],["drone","Drones"],["book","Logbook"],["fileText","Documents"],["server","Drives"],["settings","Settings"]],zt=de(()=>(De.find(([,Z])=>Z===Me.value)||["grid"])[0]),At=Y(""),Ut=Y(""),Pt=Y("");let kt=null,w=null,y=!1;const S=de(()=>Object.keys(u).sort((Z,E)=>(u[E].online?1:0)-(u[Z].online?1:0)||Z.localeCompare(E))),q=de(()=>h.value?u[h.value]:null),W=de(()=>q.value&&q.value.telemetry||{}),J=de(()=>!!(q.value&&q.value.online)),ce=de(()=>{const Z=W.value;return typeof Z.latitude=="number"&&typeof Z.longitude=="number"&&(Z.latitude||Z.longitude)?{lat:Z.latitude,lng:Z.longitude}:null}),le=de(()=>h.value&&f[h.value]||[]),se=de(()=>{const Z=W.value;return typeof Z.velocityX=="number"&&typeof Z.velocityY=="number"?Math.hypot(Z.velocityX,Z.velocityY):null});function te(Z){return Z.online?Z.connected?["In flight","success"]:["Standby","accent"]:["Offline","neutral"]}function ve(Z){const E=Z&&Z.telemetry||{};return typeof E.velocityX=="number"&&typeof E.velocityY=="number"?Math.hypot(E.velocityX,E.velocityY):null}const re=de(()=>S.value.map(Z=>{const E=u[Z],Oe=E.telemetry||{},[tt,It]=te(E);return{id:Z,mission:E.model||(E.connected?"Drone linked":E.online?"App online":"No signal"),status:tt,tone:It,alt:typeof Oe.altitude=="number"?Oe.altitude.toFixed(0)+" m":"—",battery:typeof Oe.batteryPercent=="number"?Oe.batteryPercent:null,speed:ve(E)}})),Te=de(()=>S.value.map(Z=>u[Z].connected?u[Z].flightControllerSerial:"").filter(Boolean)),Ae=de(()=>S.value.filter(Z=>u[Z].online).length),Re=de(()=>S.value.filter(Z=>u[Z].online&&u[Z].connected).length),Ke=de(()=>S.value.filter(Z=>!u[Z].online).length),Ge=de(()=>{const Z=S.value.map(E=>{var Oe;return(Oe=u[E].telemetry)==null?void 0:Oe.batteryPercent}).filter(E=>typeof E=="number");return Z.length?Math.round(Z.reduce((E,Oe)=>E+Oe,0)/Z.length):null}),pt=de(()=>[{label:"Active flights",value:String(Re.value),delta:`${Ae.value} online`,tone:"success",icon:"radio"},{label:"Avg battery",value:Ge.value==null?"—":Ge.value+"%",delta:Ge.value==null?"no telemetry":Ge.value<40?"low — watch":"nominal",tone:Ge.value!=null&&Ge.value<40?"danger":"neutral",icon:"battery"},{label:"Fleet size",value:String(S.value.length),delta:`${Re.value} in flight`,tone:"neutral",icon:"grid"},{label:"Offline",value:String(Ke.value),delta:Ke.value?"needs attention":"all reachable",tone:Ke.value?"warning":"success",icon:"signal"}]),ht={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},Vt={success:"text-success-fg",danger:"text-danger-fg",warning:"text-amber-fg",neutral:"text-ink-muted",accent:"text-accent-soft-fg"},Jt=de(()=>{var Oe,tt,It;const E=(s.email||"PV").split("@")[0].split(/[.\-_ ]+/).filter(Boolean);return((((Oe=E[0])==null?void 0:Oe[0])||"P")+(((tt=E[1])==null?void 0:tt[0])||((It=E[0])==null?void 0:It[1])||"V")).toUpperCase()}),Zt={superadmin:"Superadmin",admin:"Admin",user:"Operator"},pn=de(()=>Zt[s.role]||"Operator"),Ct=de(()=>s.organizationName||(s.role==="superadmin"?"All organizations":"No organization")),$t=new Set,kn=Y(null);async function zi(Z){var It,St,Et;if(!Z.connected||!Z.flightControllerSerial)return;const E={flightControllerSerial:Z.flightControllerSerial,model:Z.model||"",firmware:Z.firmware||"",controllerFirmware:Z.controllerFirmware||""},Oe=[E.flightControllerSerial,E.model,E.firmware,E.controllerFirmware].join("|");if($t.has(Oe))return;$t.add(Oe);const tt=await Pp(E);if(!tt.ok){(tt.status===0||tt.status>=500)&&$t.delete(Oe);return}((It=tt.body)!=null&&It.created||(St=tt.body)!=null&&St.updated)&&((Et=kn.value)==null||Et.reload())}function at(Z){if(Z)for(const E of $t)E.startsWith(`${Z}|`)&&$t.delete(E)}function Sn(Z){var Oe;u[Z.deviceId]=Z,zi(Z);const E=Z.telemetry||{};typeof E.latitude=="number"&&typeof E.longitude=="number"&&(E.latitude||E.longitude)&&(f[Z.deviceId]||(f[Z.deviceId]=[]),f[Z.deviceId].push([E.latitude,E.longitude]),f[Z.deviceId].length>1e3&&f[Z.deviceId].shift()),(!h.value||Z.online&&!((Oe=u[h.value])!=null&&Oe.online))&&(h.value=Z.deviceId)}function $i(Z){delete u[Z],delete f[Z],h.value===Z&&(h.value=S.value[0]||null)}function rt(Z){b.unshift({t:ku(Date.now()),tag:Z.type||"?",text:JSON.stringify(hi(Z))}),b.length>200&&b.pop()}function hi(Z){const E={...Z};return delete E.type,E}function pi(){const Z=location.protocol==="https:"?"wss":"ws";kt=new WebSocket(`${Z}://${location.host}/bff/ws`),kt.onopen=()=>_.value=!0,kt.onclose=()=>{_.value=!1,y||(w=setTimeout(pi,1500))},kt.onerror=()=>kt&&kt.close(),kt.onmessage=E=>{let Oe;try{Oe=JSON.parse(E.data)}catch{return}Oe.type==="snapshot"?(Oe.devices||[]).forEach(Sn):Oe.type==="update"&&Oe.device?(Sn(Oe.device),Oe.event&&Oe.device.deviceId===h.value&&rt(Oe.event)):Oe.type==="removed"&&Oe.deviceId&&$i(Oe.deviceId)}}async function Ii(){if(!h.value)return Pt.value="No device selected.";if(!At.value.trim())return Pt.value="Enter a command name.";let Z;if(Ut.value.trim())try{Z=JSON.parse(Ut.value)}catch{return Pt.value="Payload is not valid JSON."}const{ok:E,body:Oe}=await Bp(h.value,At.value.trim(),Z);Pt.value=E?`Sent "${At.value.trim()}".`:`Error: ${Oe.error||"failed"}`}function Gt(Z,E,Oe=""){return typeof Z=="number"?Z.toFixed(E)+Oe:"—"}function jn(Z){h.value=Z,Me.value="Live flights"}return Bt(Me,Z=>{Z==="Overview"&&(Ce(),F())}),Bt(()=>be.showAirTraffic,Z=>{Z?Ce():T.value=[]}),Bt(U,Le),ti(async()=>{(await np()).forEach(Sn),pi(),Ze(),Ye()}),us(()=>{y=!0,w&&clearTimeout(w),kt&&kt.close(),he(),Se()}),(Z,E)=>{var Oe,tt,It,St,Et;return p(),m("div",F2,[a("aside",D2,[a("div",R2,[A(nd,{size:26}),E[11]||(E[11]=a("span",{class:"text-[19px] tracking-tightest"},[a("span",{class:"font-medium text-ink-secondary"},"Pilot"),a("span",{class:"font-bold text-ink"},"Vault")],-1))]),a("nav",B2,[(p(),m(ae,null,ze(De,([K,_t])=>a("button",{key:_t,class:Pe(["flex items-center gap-3 rounded px-3 py-2.5 text-left text-sm transition",Me.value===_t?"bg-accent-soft font-semibold text-accent-soft-fg":"font-medium text-ink-secondary hover:bg-surface-2"]),onClick:bt=>Me.value=_t},[A(Q,{name:K,size:18,stroke:Me.value===_t?2.2:1.8},null,8,["name","stroke"]),z(" "+x(_t),1)],10,U2)),64))]),a("div",V2,[a("div",Z2,[a("div",H2,[a("span",{class:Pe(["h-2 w-2 rounded-full",_.value?"bg-ready":"bg-caution"])},null,2),a("span",j2,x(_.value?"Link healthy":"Reconnecting…"),1)]),a("span",W2,"API gateway · "+x(_.value?"streaming":"retrying"),1)]),a("div",K2,[a("div",G2,x(Jt.value),1),a("div",q2,[a("div",Y2,x(t.email||"Operator"),1),a("div",J2,[A(Q,{name:"grid",size:11,class:"shrink-0"}),a("span",{class:"truncate",title:`${pn.value} · ${Ct.value}`},x(pn.value)+" · "+x(Ct.value),9,X2)])]),a("button",{class:"text-ink-muted transition hover:text-ink",title:"Log out","aria-label":"Log out",onClick:E[0]||(E[0]=K=>l("logout"))},[A(Q,{name:"logout",size:16})])])])]),a("main",Q2,[a("header",ek,[a("div",null,[E[12]||(E[12]=a("div",{class:"eyebrow"},"Live operations",-1)),a("h1",tk,x(Me.value),1)]),a("div",nk,[a("div",ik,[A(Q,{name:"search",size:16,class:"text-ink-muted"}),ie(a("input",{"onUpdate:modelValue":E[1]||(E[1]=K=>C.value=K),placeholder:"Search drones, routes…",class:"w-full border-none bg-transparent text-sm text-ink outline-none placeholder:text-ink-muted"},null,512),[[me,C.value]])]),a("button",{class:"btn-accent flex items-center gap-2",onClick:E[2]||(E[2]=K=>Me.value="Live flights")},[A(Q,{name:"radio",size:16}),E[13]||(E[13]=z(" Live flights ",-1))])])]),Me.value==="Overview"?(p(),m("div",ok,[a("div",sk,[(p(!0),m(ae,null,ze(pt.value,K=>(p(),m("div",{key:K.label,class:"panel p-5"},[a("div",ak,[a("span",rk,x(K.label),1),A(Q,{name:K.icon,size:16,class:"text-ink-muted"},null,8,["name"])]),a("div",lk,x(K.value),1),a("span",{class:Pe(["mt-2 block font-mono text-[11px]",Vt[K.tone]])},x(K.delta),3)]))),128))]),a("div",uk,[a("div",ck,[a("div",dk,[E[18]||(E[18]=a("div",null,[a("div",{class:"eyebrow"},"Airspace"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Live map")],-1)),a("div",fk,[$e(be).showAirTraffic&&H.value?(p(),m("span",{key:0,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.accent]),title:"Live aircraft from OpenSky Network"},[A(Q,{name:"radio",size:12}),z(x(H.value)+" aircraft ",1)],2)):I("",!0),Re.value?(p(),m("span",{key:1,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.success])},[E[14]||(E[14]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Re.value)+" drones ",1)],2)):I("",!0),a("div",hk,[a("button",{type:"button",class:Pe(["grid h-7 w-7 place-items-center rounded-md text-ink-muted transition hover:bg-surface-2 hover:text-ink",j.value?"bg-surface-2 text-ink":""]),title:"Map settings","aria-label":"Map settings",onClick:E[3]||(E[3]=K=>j.value=!j.value)},[A(Q,{name:"settings",size:16})],2),j.value?(p(),m(ae,{key:0},[a("div",{class:"fixed inset-0 z-[1190]",onClick:E[4]||(E[4]=K=>j.value=!1)}),a("div",pk,[E[17]||(E[17]=a("div",{class:"eyebrow mb-2.5"},"Map settings",-1)),a("label",mk,[E[15]||(E[15]=a("span",{class:"text-sm text-ink-secondary"},"Show live air traffic",-1)),A(nn,{modelValue:$e(be).showAirTraffic,"onUpdate:modelValue":E[5]||(E[5]=K=>$e(be).showAirTraffic=K)},null,8,["modelValue"])]),a("div",{class:Pe(["mt-3.5",$e(be).showAirTraffic?"":"pointer-events-none opacity-40"])},[a("div",gk,[E[16]||(E[16]=a("span",{class:"text-sm text-ink-secondary"},"Refresh interval",-1)),a("span",vk,"every "+x(U.value)+"s",1)]),ie(a("select",{"onUpdate:modelValue":E[6]||(E[6]=K=>$e(be).airTrafficInterval=K),class:"field"},[(p(),m(ae,null,ze(N,K=>a("option",{key:K.value,value:K.value},x(K.label)+x(K.value==="auto"?` (plan: ${M.recommendedInterval}s)`:""),9,_k)),64))],512),[[Ot,$e(be).airTrafficInterval]]),M.plan?(p(),m("p",bk," OpenSky plan: "+x(M.plan),1)):I("",!0)],2)])],64)):I("",!0)])])]),A(Cu,{position:ce.value,trail:le.value,aircraft:$e(be).showAirTraffic?T.value:[]},null,8,["position","trail","aircraft"]),$e(be).showAirTraffic?M.loaded&&M.unavailable?(p(),m("p",xk,x(M.detail||"Live air traffic is unavailable."),1)):(p(),m("p",wk," Live air traffic from OpenSky Network · updates every "+x(U.value)+"s ",1)):(p(),m("p",yk," Live air traffic hidden · enable it in Map settings "))]),a("div",kk,[a("div",Sk,[a("div",Tk,[E[19]||(E[19]=a("div",null,[a("div",{class:"eyebrow"},"Conditions"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Weather")],-1)),A(Q,{name:"sun",size:16,class:"text-ink-muted"})]),ee.data?(p(),m(ae,{key:0},[a("div",Pk,[a("div",Ck,x(pe.value),1),a("div",Lk,[a("div",Ak,[a("span",Mk,x(st(ee.data.temp)),1),a("span",Ek,x(ge.value),1)]),a("div",Ok,x(ee.data.description||"—"),1)])]),a("div",zk,x(Ue.value)+" · "+x(Ve.value),1),a("div",$k,[a("div",Ik,[E[20]||(E[20]=a("div",{class:"eyebrow"},"Feels like",-1)),a("div",Nk,x(st(ee.data.feelsLike))+x(ge.value),1)]),a("div",Fk,[E[21]||(E[21]=a("div",{class:"eyebrow"},"Wind",-1)),a("div",Dk,x(st(ee.data.windSpeed,1))+" "+x(fe.value),1)]),a("div",Rk,[E[22]||(E[22]=a("div",{class:"eyebrow"},"Humidity",-1)),a("div",Bk,[z(x(st(ee.data.humidity)),1),ee.data.humidity!=null?(p(),m("span",Uk,"%")):I("",!0)])]),a("div",Vk,[E[23]||(E[23]=a("div",{class:"eyebrow"},"Cloud cover",-1)),a("div",Zk,[z(x(st(ee.data.clouds)),1),ee.data.clouds!=null?(p(),m("span",Hk,"%")):I("",!0)])])]),wt.value?(p(),m("div",jk,"Updated "+x(wt.value)+" · OpenWeather",1)):I("",!0)],64)):ee.loaded&&ee.unavailable?(p(),m("div",Wk,[A(Q,{name:"sun",size:24,class:"text-ink-muted"}),E[24]||(E[24]=a("div",{class:"mt-2 text-sm font-medium text-ink-secondary"},"Weather unavailable",-1)),a("div",Kk,x(ee.detail),1)])):(p(),m("div",Gk," Loading weather… "))]),a("div",qk,[a("div",Yk,[E[25]||(E[25]=a("div",null,[a("div",{class:"eyebrow"},"Today"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Schedule")],-1)),A(Q,{name:"clock",size:16,class:"text-ink-muted"})]),a("div",Jk,[A(Q,{name:"calendar",size:24,class:"text-ink-muted"}),E[26]||(E[26]=a("div",{class:"mt-2 text-sm font-medium text-ink-secondary"},"No missions scheduled",-1)),E[27]||(E[27]=a("div",{class:"mt-0.5 text-xs text-ink-muted"},"Scheduling is not wired to a backend yet.",-1))])])])]),a("div",Xk,[a("div",Qk,[E[30]||(E[30]=a("div",null,[a("div",{class:"eyebrow"},"Fleet"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Aircraft status")],-1)),a("div",eS,[a("span",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.success])},[E[28]||(E[28]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Re.value)+" in flight ",1)],2),Ke.value?(p(),m("span",{key:0,class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.warning])},[E[29]||(E[29]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(Ke.value)+" offline ",1)],2)):I("",!0)])]),re.value.length?(p(),m("div",nS,[a("table",iS,[a("thead",null,[a("tr",oS,[(p(),m(ae,null,ze(["Aircraft","Mission","Status","Alt","Battery","Speed",""],K=>a("th",{key:K,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},x(K),1)),64))])]),a("tbody",null,[(p(!0),m(ae,null,ze(re.value,(K,_t)=>(p(),m("tr",{key:K.id,class:Pe(["cursor-pointer transition hover:bg-surface-2",_tjn(K.id)},[a("td",aS,x(K.id),1),a("td",rS,x(K.mission),1),a("td",lS,[a("span",{class:Pe(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht[K.tone]])},[E[31]||(E[31]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(x(K.status),1)],2)]),a("td",uS,x(K.alt),1),a("td",cS,[K.battery!=null?(p(),m("div",dS,[a("div",fS,[a("div",{class:Pe(["h-full",K.battery<40?"bg-caution":"bg-ready"]),style:Eo({width:K.battery+"%"})},null,6)]),a("span",hS,x(K.battery)+"%",1)])):(p(),m("span",pS,"—"))]),a("td",mS,[z(x(K.speed==null?"—":K.speed.toFixed(1))+" ",1),E[32]||(E[32]=a("span",{class:"text-ink-muted"},"m/s",-1))]),a("td",gS,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5 whitespace-nowrap",onClick:hl(bt=>jn(K.id),["stop"])},[A(Q,{name:"play",size:14}),E[33]||(E[33]=z(" Track ",-1))],8,vS)])],10,sS))),128))])])])):(p(),m("div",tS," No aircraft connected yet. Devices appear here as they come online. "))])])):Me.value==="Live flights"?(p(),m("div",_S,[a("div",bS,[a("span",yS,x(h.value||"No device selected"),1),q.value&&!J.value?(p(),m("span",xS,"Offline")):I("",!0),S.value.length?(p(),m("div",wS,[(p(!0),m(ae,null,ze(S.value,K=>(p(),m("button",{key:K,class:Pe(["flex items-center gap-2 rounded border px-3 py-1.5 font-mono text-xs font-bold transition",K===h.value?"border-accent bg-accent-soft text-accent-soft-fg":"border-line bg-surface-1 text-ink-secondary hover:border-line-strong"]),onClick:_t=>h.value=K},[a("span",{class:Pe(["h-2 w-2 rounded-full",u[K].online?"bg-ready":"bg-ink-muted"])},null,2),z(" "+x(K),1)],10,kS))),128))])):I("",!0)]),S.value.length?(p(),m(ae,{key:1},[a("div",{class:Pe(["mb-4 grid gap-3",!J.value&&q.value?"opacity-60":""]),style:{"grid-template-columns":"repeat(auto-fit, minmax(150px, 1fr))"}},[a("div",TS,[E[36]||(E[36]=a("div",{class:"eyebrow"},"Registration",-1)),a("div",{class:Pe(["mt-1 text-sm font-semibold",J.value?((Oe=q.value)==null?void 0:Oe.registration)==="success"?"text-success-fg":"text-danger-fg":"text-ink"])},x(J.value&&((tt=q.value)!=null&&tt.registration)?q.value.registration:"—"),3)]),a("div",PS,[E[37]||(E[37]=a("div",{class:"eyebrow"},"Drone link",-1)),a("div",{class:Pe(["mt-1 text-sm font-semibold",J.value?(It=q.value)!=null&&It.connected?"text-success-fg":"text-danger-fg":"text-ink"])},x(q.value?J.value?q.value.connected?"connected":"no drone":"app offline":"—"),3)]),a("div",CS,[E[38]||(E[38]=a("div",{class:"eyebrow"},"Model",-1)),a("div",LS,x(((St=q.value)==null?void 0:St.model)||"—"),1)]),a("div",AS,[E[39]||(E[39]=a("div",{class:"eyebrow"},"Last update",-1)),a("div",MS,x((Et=q.value)!=null&&Et.lastSeenMs?$e(ku)(q.value.lastSeenMs):"—"),1)])],2),a("div",ES,[a("div",OS,[E[41]||(E[41]=a("div",{class:"mb-3 eyebrow"},"Battery",-1)),a("div",zS,[a("div",$S,[a("div",{class:Pe(["h-full transition-all",typeof W.value.batteryPercent=="number"?W.value.batteryPercent<20?"bg-warning":W.value.batteryPercent<40?"bg-caution":"bg-ready":""]),style:Eo({width:(typeof W.value.batteryPercent=="number"?W.value.batteryPercent:0)+"%"})},null,6)]),a("div",IS,[z(x(typeof W.value.batteryPercent=="number"?W.value.batteryPercent:"—"),1),E[40]||(E[40]=a("span",{class:"text-sm text-ink-secondary"},"%",-1))])])]),a("div",NS,[E[43]||(E[43]=a("div",{class:"mb-3 eyebrow"},"Altitude",-1)),a("div",FS,[z(x(Gt(W.value.altitude,1)),1),E[42]||(E[42]=a("span",{class:"text-sm text-ink-secondary"}," m",-1))])]),a("div",DS,[E[48]||(E[48]=a("div",{class:"mb-3 eyebrow"},"Flight",-1)),a("div",RS,[a("div",BS,[E[44]||(E[44]=a("span",{class:"text-ink-secondary"},"Mode",-1)),a("b",US,x(W.value.flightMode||"—"),1)]),a("div",VS,[E[45]||(E[45]=a("span",{class:"text-ink-secondary"},"Flying",-1)),a("b",ZS,x(W.value.isFlying==null?"—":W.value.isFlying?"yes":"no"),1)]),a("div",HS,[E[46]||(E[46]=a("span",{class:"text-ink-secondary"},"GPS sats",-1)),a("b",jS,x(W.value.satelliteCount==null?"—":W.value.satelliteCount),1)]),a("div",WS,[E[47]||(E[47]=a("span",{class:"text-ink-secondary"},"Speed (H)",-1)),a("b",KS,x(se.value==null?"—":Gt(se.value,2," m/s")),1)])])]),a("div",GS,[E[52]||(E[52]=a("div",{class:"mb-3 eyebrow"},"Position",-1)),a("div",qS,[a("div",YS,[E[49]||(E[49]=a("span",{class:"text-ink-secondary"},"Latitude",-1)),a("b",JS,x(Gt(W.value.latitude,6)),1)]),a("div",XS,[E[50]||(E[50]=a("span",{class:"text-ink-secondary"},"Longitude",-1)),a("b",QS,x(Gt(W.value.longitude,6)),1)]),a("div",e5,[E[51]||(E[51]=a("span",{class:"text-ink-secondary"},"Vert. speed",-1)),a("b",t5,x(Gt(typeof W.value.velocityZ=="number"?-W.value.velocityZ:void 0,2," m/s")),1)])])]),a("div",n5,[E[53]||(E[53]=a("div",{class:"mb-3 eyebrow"},"Track",-1)),A(Cu,{position:ce.value,trail:le.value},null,8,["position","trail"])]),a("div",i5,[E[54]||(E[54]=a("div",{class:"mb-3 eyebrow"},"Send command",-1)),a("div",o5,[ie(a("input",{"onUpdate:modelValue":E[7]||(E[7]=K=>At.value=K),class:"field flex-1",placeholder:"command (e.g. startConnection)"},null,512),[[me,At.value]]),ie(a("input",{"onUpdate:modelValue":E[8]||(E[8]=K=>Ut.value=K),class:"field flex-1",placeholder:"payload JSON (optional)"},null,512),[[me,Ut.value]]),a("button",{class:"btn-accent",onClick:Ii},"Send")]),a("div",s5,x(Pt.value),1)]),a("div",a5,[E[55]||(E[55]=a("div",{class:"mb-3 eyebrow"},"Event log",-1)),a("div",r5,[(p(!0),m(ae,null,ze(b,(K,_t)=>(p(),m("div",{key:_t,class:"border-b border-line py-1"},[a("span",l5,x(K.t),1),a("span",u5,x(K.tag),1),a("span",c5,x(K.text),1)]))),128))])])])],64)):(p(),m("div",SS,[A(Q,{name:"radio",size:28,class:"text-ink-muted"}),E[34]||(E[34]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No aircraft online",-1)),E[35]||(E[35]=a("div",{class:"mt-1 text-xs text-ink-muted"},"Live telemetry appears here once a drone connects.",-1))]))])):Me.value==="Logbook"?(p(),nt(vx,{key:2,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName},null,8,["email","role","organization","organization-name"])):Me.value==="Drones"?(p(),nt(h0,{key:3,ref_key:"dronesView",ref:kn,"connected-fc-serials":Te.value,onDeleted:at},null,8,["connected-fc-serials"])):Me.value==="Routes"?(p(),nt(N2,{key:4})):Me.value==="Documents"?(p(),nt(Xw,{key:5,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName},null,8,["email","role","organization","organization-name"])):Me.value==="Settings"?(p(),nt(ty,{key:6,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName,onLogout:E[9]||(E[9]=K=>l("logout"))},null,8,["email","role","organization","organization-name"])):(p(),m("div",d5,[a("div",f5,[A(Q,{name:zt.value,size:28,class:"text-ink-muted"},null,8,["name"]),a("div",h5,x(Me.value),1),Me.value==="Drives"?(p(),m("div",p5,[E[56]||(E[56]=z(" Browse and transfer files here once a drive is connected. Configure drives in ",-1)),a("button",{class:"font-semibold text-accent hover:underline",onClick:E[10]||(E[10]=K=>Me.value="Settings")},"Settings → Integrations"),E[57]||(E[57]=z(". ",-1))])):(p(),m("div",m5,"This section is part of the console shell and has no backend yet."))])]))])])}}},b5={key:0,class:"h-full"},y5={key:1,class:"grid h-full place-items-center text-ink-muted text-sm"},x5={__name:"App",setup(t){const i=Y(!1),s=Y(null),l=Y("user"),u=Y(""),f=Y(""),h=Y("");function _(T){l.value=T&&T.role||"user",u.value=T&&T.organization||"",f.value=T&&T.organizationName||""}ti(async()=>{h.value=(await Qh()).apiBase||"";const T=await _u();T&&(s.value=T.email,_(T),await Tu()),i.value=!0});async function b(T){s.value=T,_(await _u()),await Tu()}async function C(){jp(),await tp(),s.value=null,l.value="user",u.value="",f.value=""}return(T,M)=>i.value?(p(),m("div",b5,[s.value?(p(),nt(_5,{key:0,email:s.value,role:l.value,organization:u.value,"organization-name":f.value,onLogout:C},null,8,["email","role","organization","organization-name"])):(p(),nt(lm,{key:1,"default-api-base":h.value,onSignedIn:b},null,8,["default-api-base"]))])):(p(),m("div",y5,"Loading…"))}};qh(x5).mount("#app"); diff --git a/Web App/server/dist/assets/index-DwyUIzSZ.js b/Web App/server/dist/assets/index-DwyUIzSZ.js deleted file mode 100644 index ccc8c84..0000000 --- a/Web App/server/dist/assets/index-DwyUIzSZ.js +++ /dev/null @@ -1,20 +0,0 @@ -(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))l(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const h of f.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&l(h)}).observe(document,{childList:!0,subtree:!0});function s(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function l(u){if(u.ep)return;u.ep=!0;const f=s(u);fetch(u.href,f)}})();/** -* @vue/shared v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Xr(t){const i=Object.create(null);for(const s of t.split(","))i[s]=1;return s=>s in i}const vt={},es=[],ui=()=>{},zu=()=>!1,ja=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),Wa=t=>t.startsWith("onUpdate:"),Kt=Object.assign,Qr=(t,i)=>{const s=t.indexOf(i);s>-1&&t.splice(s,1)},pd=Object.prototype.hasOwnProperty,ct=(t,i)=>pd.call(t,i),$e=Array.isArray,ts=t=>ea(t)==="[object Map]",ls=t=>ea(t)==="[object Set]",Al=t=>ea(t)==="[object Date]",je=t=>typeof t=="function",Tt=t=>typeof t=="string",Qn=t=>typeof t=="symbol",dt=t=>t!==null&&typeof t=="object",$u=t=>(dt(t)||je(t))&&je(t.then)&&je(t.catch),Iu=Object.prototype.toString,ea=t=>Iu.call(t),md=t=>ea(t).slice(8,-1),Nu=t=>ea(t)==="[object Object]",el=t=>Tt(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,Rs=Xr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ka=t=>{const i=Object.create(null);return(s=>i[s]||(i[s]=t(s)))},gd=/-\w/g,Jn=Ka(t=>t.replace(gd,i=>i.slice(1).toUpperCase())),vd=/\B([A-Z])/g,to=Ka(t=>t.replace(vd,"-$1").toLowerCase()),Du=Ka(t=>t.charAt(0).toUpperCase()+t.slice(1)),xr=Ka(t=>t?`on${Du(t)}`:""),li=(t,i)=>!Object.is(t,i),Ea=(t,...i)=>{for(let s=0;s{Object.defineProperty(t,i,{configurable:!0,enumerable:!1,writable:l,value:s})},Ga=t=>{const i=parseFloat(t);return isNaN(i)?t:i},_d=t=>{const i=Tt(t)?Number(t):NaN;return isNaN(i)?t:i};let Ml;const qa=()=>Ml||(Ml=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Eo(t){if($e(t)){const i={};for(let s=0;s{if(s){const l=s.split(yd);l.length>1&&(i[l[0].trim()]=l[1].trim())}}),i}function Ce(t){let i="";if(Tt(t))i=t;else if($e(t))for(let s=0;sXi(s,i))}const Bu=t=>!!(t&&t.__v_isRef===!0),w=t=>Tt(t)?t:t==null?"":$e(t)||dt(t)&&(t.toString===Iu||!je(t.toString))?Bu(t)?w(t.value):JSON.stringify(t,Uu,2):String(t),Uu=(t,i)=>Bu(i)?Uu(t,i.value):ts(i)?{[`Map(${i.size})`]:[...i.entries()].reduce((s,[l,u],f)=>(s[wr(l,f)+" =>"]=u,s),{})}:ls(i)?{[`Set(${i.size})`]:[...i.values()].map(s=>wr(s))}:Qn(i)?wr(i):dt(i)&&!$e(i)&&!Nu(i)?String(i):i,wr=(t,i="")=>{var s;return Qn(t)?`Symbol(${(s=t.description)!=null?s:i})`:t};/** -* @vue/reactivity v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Yt;class Pd{constructor(i=!1){this.detached=i,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!i&&Yt&&(Yt.active?(this.parent=Yt,this.index=(Yt.scopes||(Yt.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let i,s;if(this.scopes)for(i=0,s=this.scopes.length;i0&&--this._on===0){if(Yt===this)Yt=this.prevScope;else{let i=Yt;for(;i;){if(i.prevScope===this){i.prevScope=this.prevScope;break}i=i.prevScope}}this.prevScope=void 0}}stop(i){if(this._active){this._active=!1;let s,l;for(s=0,l=this.effects.length;s0)return;if(Us){let i=Us;for(Us=void 0;i;){const s=i.next;i.next=void 0,i.flags&=-9,i=s}}let t;for(;Bs;){let i=Bs;for(Bs=void 0;i;){const s=i.next;if(i.next=void 0,i.flags&=-9,i.flags&1)try{i.trigger()}catch(l){t||(t=l)}i=s}}if(t)throw t}function ju(t){for(let i=t.deps;i;i=i.nextDep)i.version=-1,i.prevActiveLink=i.dep.activeLink,i.dep.activeLink=i}function Wu(t){let i,s=t.depsTail,l=s;for(;l;){const u=l.prevDep;l.version===-1?(l===s&&(s=u),ol(l),Ld(l)):i=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=u}t.deps=i,t.depsTail=s}function Ir(t){for(let i=t.deps;i;i=i.nextDep)if(i.dep.version!==i.version||i.dep.computed&&(Ku(i.dep.computed)||i.dep.version!==i.version))return!0;return!!t._dirty}function Ku(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===Ws)||(t.globalVersion=Ws,!t.isSSR&&t.flags&128&&(!t.deps&&!t._dirty||!Ir(t))))return;t.flags|=2;const i=t.dep,s=xt,l=Xn;xt=t,Xn=!0;try{ju(t);const u=t.fn(t._value);(i.version===0||li(u,t._value))&&(t.flags|=128,t._value=u,i.version++)}catch(u){throw i.version++,u}finally{xt=s,Xn=l,Wu(t),t.flags&=-3}}function ol(t,i=!1){const{dep:s,prevSub:l,nextSub:u}=t;if(l&&(l.nextSub=u,t.prevSub=void 0),u&&(u.prevSub=l,t.nextSub=void 0),s.subs===t&&(s.subs=l,!l&&s.computed)){s.computed.flags&=-5;for(let f=s.computed.deps;f;f=f.nextDep)ol(f,!0)}!i&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ld(t){const{prevDep:i,nextDep:s}=t;i&&(i.nextDep=s,t.prevDep=void 0),s&&(s.prevDep=i,t.nextDep=void 0)}let Xn=!0;const Gu=[];function ci(){Gu.push(Xn),Xn=!1}function di(){const t=Gu.pop();Xn=t===void 0?!0:t}function El(t){const{cleanup:i}=t;if(t.cleanup=void 0,i){const s=xt;xt=void 0;try{i()}finally{xt=s}}}let Ws=0;class Ad{constructor(i,s){this.sub=i,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class sl{constructor(i){this.computed=i,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(i){if(!xt||!Xn||xt===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==xt)s=this.activeLink=new Ad(xt,this),xt.deps?(s.prevDep=xt.depsTail,xt.depsTail.nextDep=s,xt.depsTail=s):xt.deps=xt.depsTail=s,qu(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const l=s.nextDep;l.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=l),s.prevDep=xt.depsTail,s.nextDep=void 0,xt.depsTail.nextDep=s,xt.depsTail=s,xt.deps===s&&(xt.deps=l)}return s}trigger(i){this.version++,Ws++,this.notify(i)}notify(i){nl();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{il()}}}function qu(t){if(t.dep.sc++,t.sub.flags&4){const i=t.dep.computed;if(i&&!t.dep.subs){i.flags|=20;for(let l=i.deps;l;l=l.nextDep)qu(l)}const s=t.dep.subs;s!==t&&(t.prevSub=s,s&&(s.nextSub=t)),t.dep.subs=t}}const Nr=new WeakMap,Ao=Symbol(""),Dr=Symbol(""),Ks=Symbol("");function on(t,i,s){if(Xn&&xt){let l=Nr.get(t);l||Nr.set(t,l=new Map);let u=l.get(s);u||(l.set(s,u=new sl),u.map=l,u.key=s),u.track()}}function Li(t,i,s,l,u,f){const h=Nr.get(t);if(!h){Ws++;return}const _=y=>{y&&y.trigger()};if(nl(),i==="clear")h.forEach(_);else{const y=$e(t),C=y&&el(s);if(y&&s==="length"){const T=Number(l);h.forEach((M,H)=>{(H==="length"||H===Ks||!Qn(H)&&H>=T)&&_(M)})}else switch((s!==void 0||h.has(void 0))&&_(h.get(s)),C&&_(h.get(Ks)),i){case"add":y?C&&_(h.get("length")):(_(h.get(Ao)),ts(t)&&_(h.get(Dr)));break;case"delete":y||(_(h.get(Ao)),ts(t)&&_(h.get(Dr)));break;case"set":ts(t)&&_(h.get(Ao));break}}il()}function Xo(t){const i=ut(t);return i===t?i:(on(i,"iterate",Ks),Vn(t)?i:i.map(ei))}function Ya(t){return on(t=ut(t),"iterate",Ks),t}function ai(t,i){return Ei(t)?as(Mo(t)?ei(i):i):ei(i)}const Md={__proto__:null,[Symbol.iterator](){return Sr(this,Symbol.iterator,t=>ai(this,t))},concat(...t){return Xo(this).concat(...t.map(i=>$e(i)?Xo(i):i))},entries(){return Sr(this,"entries",t=>(t[1]=ai(this,t[1]),t))},every(t,i){return Si(this,"every",t,i,void 0,arguments)},filter(t,i){return Si(this,"filter",t,i,s=>s.map(l=>ai(this,l)),arguments)},find(t,i){return Si(this,"find",t,i,s=>ai(this,s),arguments)},findIndex(t,i){return Si(this,"findIndex",t,i,void 0,arguments)},findLast(t,i){return Si(this,"findLast",t,i,s=>ai(this,s),arguments)},findLastIndex(t,i){return Si(this,"findLastIndex",t,i,void 0,arguments)},forEach(t,i){return Si(this,"forEach",t,i,void 0,arguments)},includes(...t){return Tr(this,"includes",t)},indexOf(...t){return Tr(this,"indexOf",t)},join(t){return Xo(this).join(t)},lastIndexOf(...t){return Tr(this,"lastIndexOf",t)},map(t,i){return Si(this,"map",t,i,void 0,arguments)},pop(){return Es(this,"pop")},push(...t){return Es(this,"push",t)},reduce(t,...i){return Ol(this,"reduce",t,i)},reduceRight(t,...i){return Ol(this,"reduceRight",t,i)},shift(){return Es(this,"shift")},some(t,i){return Si(this,"some",t,i,void 0,arguments)},splice(...t){return Es(this,"splice",t)},toReversed(){return Xo(this).toReversed()},toSorted(t){return Xo(this).toSorted(t)},toSpliced(...t){return Xo(this).toSpliced(...t)},unshift(...t){return Es(this,"unshift",t)},values(){return Sr(this,"values",t=>ai(this,t))}};function Sr(t,i,s){const l=Ya(t),u=l[i]();return l!==t&&!Vn(t)&&(u._next=u.next,u.next=()=>{const f=u._next();return f.done||(f.value=s(f.value)),f}),u}const Ed=Array.prototype;function Si(t,i,s,l,u,f){const h=Ya(t),_=h!==t&&!Vn(t),y=h[i];if(y!==Ed[i]){const M=y.apply(t,f);return _?ei(M):M}let C=s;h!==t&&(_?C=function(M,H){return s.call(this,ai(t,M),H,t)}:s.length>2&&(C=function(M,H){return s.call(this,M,H,t)}));const T=y.call(h,C,l);return _&&u?u(T):T}function Ol(t,i,s,l){const u=Ya(t),f=u!==t&&!Vn(t);let h=s,_=!1;u!==t&&(f?(_=l.length===0,h=function(C,T,M){return _&&(_=!1,C=ai(t,C)),s.call(this,C,ai(t,T),M,t)}):s.length>3&&(h=function(C,T,M){return s.call(this,C,T,M,t)}));const y=u[i](h,...l);return _?ai(t,y):y}function Tr(t,i,s){const l=ut(t);on(l,"iterate",Ks);const u=l[i](...s);return(u===-1||u===!1)&&ll(s[0])?(s[0]=ut(s[0]),l[i](...s)):u}function Es(t,i,s=[]){ci(),nl();const l=ut(t)[i].apply(t,s);return il(),di(),l}const Od=Xr("__proto__,__v_isRef,__isVue"),Yu=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(Qn));function zd(t){Qn(t)||(t=String(t));const i=ut(this);return on(i,"has",t),i.hasOwnProperty(t)}class Ju{constructor(i=!1,s=!1){this._isReadonly=i,this._isShallow=s}get(i,s,l){if(s==="__v_skip")return i.__v_skip;const u=this._isReadonly,f=this._isShallow;if(s==="__v_isReactive")return!u;if(s==="__v_isReadonly")return u;if(s==="__v_isShallow")return f;if(s==="__v_raw")return l===(u?f?Zd:tc:f?ec:Qu).get(i)||Object.getPrototypeOf(i)===Object.getPrototypeOf(l)?i:void 0;const h=$e(i);if(!u){let y;if(h&&(y=Md[s]))return y;if(s==="hasOwnProperty")return zd}const _=Reflect.get(i,s,rn(i)?i:l);if((Qn(s)?Yu.has(s):Od(s))||(u||on(i,"get",s),f))return _;if(rn(_)){const y=h&&el(s)?_:_.value;return u&&dt(y)?Rr(y):y}return dt(_)?u?Rr(_):gt(_):_}}class Xu extends Ju{constructor(i=!1){super(!1,i)}set(i,s,l,u){let f=i[s];const h=$e(i)&&el(s);if(!this._isShallow){const C=Ei(f);if(!Vn(l)&&!Ei(l)&&(f=ut(f),l=ut(l)),!h&&rn(f)&&!rn(l))return C||(f.value=l),!0}const _=h?Number(s)t,Ta=t=>Reflect.getPrototypeOf(t);function Fd(t,i,s){return function(...l){const u=this.__v_raw,f=ut(u),h=ts(f),_=t==="entries"||t===Symbol.iterator&&h,y=t==="keys"&&h,C=u[t](...l),T=s?Fr:i?as:ei;return!i&&on(f,"iterate",y?Dr:Ao),Kt(Object.create(C),{next(){const{value:M,done:H}=C.next();return H?{value:M,done:H}:{value:_?[T(M[0]),T(M[1])]:T(M),done:H}}})}}function Pa(t){return function(...i){return t==="delete"?!1:t==="clear"?void 0:this}}function Rd(t,i){const s={get(u){const f=this.__v_raw,h=ut(f),_=ut(u);t||(li(u,_)&&on(h,"get",u),on(h,"get",_));const{has:y}=Ta(h),C=i?Fr:t?as:ei;if(y.call(h,u))return C(f.get(u));if(y.call(h,_))return C(f.get(_));f!==h&&f.get(u)},get size(){const u=this.__v_raw;return!t&&on(ut(u),"iterate",Ao),u.size},has(u){const f=this.__v_raw,h=ut(f),_=ut(u);return t||(li(u,_)&&on(h,"has",u),on(h,"has",_)),u===_?f.has(u):f.has(u)||f.has(_)},forEach(u,f){const h=this,_=h.__v_raw,y=ut(_),C=i?Fr:t?as:ei;return!t&&on(y,"iterate",Ao),_.forEach((T,M)=>u.call(f,C(T),C(M),h))}};return Kt(s,t?{add:Pa("add"),set:Pa("set"),delete:Pa("delete"),clear:Pa("clear")}:{add(u){const f=ut(this),h=Ta(f),_=ut(u),y=!i&&!Vn(u)&&!Ei(u)?_:u;return h.has.call(f,y)||li(u,y)&&h.has.call(f,u)||li(_,y)&&h.has.call(f,_)||(f.add(y),Li(f,"add",y,y)),this},set(u,f){!i&&!Vn(f)&&!Ei(f)&&(f=ut(f));const h=ut(this),{has:_,get:y}=Ta(h);let C=_.call(h,u);C||(u=ut(u),C=_.call(h,u));const T=y.call(h,u);return h.set(u,f),C?li(f,T)&&Li(h,"set",u,f):Li(h,"add",u,f),this},delete(u){const f=ut(this),{has:h,get:_}=Ta(f);let y=h.call(f,u);y||(u=ut(u),y=h.call(f,u)),_&&_.call(f,u);const C=f.delete(u);return y&&Li(f,"delete",u,void 0),C},clear(){const u=ut(this),f=u.size!==0,h=u.clear();return f&&Li(u,"clear",void 0,void 0),h}}),["keys","values","entries",Symbol.iterator].forEach(u=>{s[u]=Fd(u,t,i)}),s}function al(t,i){const s=Rd(t,i);return(l,u,f)=>u==="__v_isReactive"?!t:u==="__v_isReadonly"?t:u==="__v_raw"?l:Reflect.get(ct(s,u)&&u in l?s:l,u,f)}const Bd={get:al(!1,!1)},Ud={get:al(!1,!0)},Vd={get:al(!0,!1)};const Qu=new WeakMap,ec=new WeakMap,tc=new WeakMap,Zd=new WeakMap;function Hd(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function gt(t){return Ei(t)?t:rl(t,!1,Id,Bd,Qu)}function jd(t){return rl(t,!1,Dd,Ud,ec)}function Rr(t){return rl(t,!0,Nd,Vd,tc)}function rl(t,i,s,l,u){if(!dt(t)||t.__v_raw&&!(i&&t.__v_isReactive)||t.__v_skip||!Object.isExtensible(t))return t;const f=u.get(t);if(f)return f;const h=Hd(md(t));if(h===0)return t;const _=new Proxy(t,h===2?l:s);return u.set(t,_),_}function Mo(t){return Ei(t)?Mo(t.__v_raw):!!(t&&t.__v_isReactive)}function Ei(t){return!!(t&&t.__v_isReadonly)}function Vn(t){return!!(t&&t.__v_isShallow)}function ll(t){return t?!!t.__v_raw:!1}function ut(t){const i=t&&t.__v_raw;return i?ut(i):t}function Wd(t){return!ct(t,"__v_skip")&&Object.isExtensible(t)&&Fu(t,"__v_skip",!0),t}const ei=t=>dt(t)?gt(t):t,as=t=>dt(t)?Rr(t):t;function rn(t){return t?t.__v_isRef===!0:!1}function Y(t){return Kd(t,!1)}function Kd(t,i){return rn(t)?t:new Gd(t,i)}class Gd{constructor(i,s){this.dep=new sl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?i:ut(i),this._value=s?i:ei(i),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(i){const s=this._rawValue,l=this.__v_isShallow||Vn(i)||Ei(i);i=l?i:ut(i),li(i,s)&&(this._rawValue=i,this._value=l?i:ei(i),this.dep.trigger())}}function Ee(t){return rn(t)?t.value:t}const qd={get:(t,i,s)=>i==="__v_raw"?t:Ee(Reflect.get(t,i,s)),set:(t,i,s,l)=>{const u=t[i];return rn(u)&&!rn(s)?(u.value=s,!0):Reflect.set(t,i,s,l)}};function nc(t){return Mo(t)?t:new Proxy(t,qd)}class Yd{constructor(i,s,l){this.fn=i,this.setter=s,this._value=void 0,this.dep=new sl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ws-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=l}notify(){if(this.flags|=16,!(this.flags&8)&&xt!==this)return Hu(this,!0),!0}get value(){const i=this.dep.track();return Ku(this),i&&(i.version=this.dep.version),this._value}set value(i){this.setter&&this.setter(i)}}function Jd(t,i,s=!1){let l,u;return je(t)?l=t:(l=t.get,u=t.set),new Yd(l,u,s)}const Ca={},za=new WeakMap;let Po;function Xd(t,i=!1,s=Po){if(s){let l=za.get(s);l||za.set(s,l=[]),l.push(t)}}function Qd(t,i,s=vt){const{immediate:l,deep:u,once:f,scheduler:h,augmentJob:_,call:y}=s,C=de=>u?de:Vn(de)||u===!1||u===0?Ai(de,1):Ai(de);let T,M,H,j,K=!1,F=!1;if(rn(t)?(M=()=>t.value,K=Vn(t)):Mo(t)?(M=()=>C(t),K=!0):$e(t)?(F=!0,K=t.some(de=>Mo(de)||Vn(de)),M=()=>t.map(de=>{if(rn(de))return de.value;if(Mo(de))return C(de);if(je(de))return y?y(de,2):de()})):je(t)?i?M=y?()=>y(t,2):t:M=()=>{if(H){ci();try{H()}finally{di()}}const de=Po;Po=T;try{return y?y(t,3,[j]):t(j)}finally{Po=de}}:M=ui,i&&u){const de=M,Fe=u===!0?1/0:u;M=()=>Ai(de(),Fe)}const te=Cd(),X=()=>{T.stop(),te&&te.active&&Qr(te.effects,T)};if(f&&i){const de=i;i=(...Fe)=>{const Oe=de(...Fe);return X(),Oe}}let fe=F?new Array(t.length).fill(Ca):Ca;const Se=de=>{if(!(!(T.flags&1)||!T.dirty&&!de))if(i){const Fe=T.run();if(de||u||K||(F?Fe.some((Oe,Te)=>li(Oe,fe[Te])):li(Fe,fe))){H&&H();const Oe=Po;Po=T;try{const Te=[Fe,fe===Ca?void 0:F&&fe[0]===Ca?[]:fe,j];fe=Fe,y?y(i,3,Te):i(...Te)}finally{Po=Oe}}}else T.run()};return _&&_(Se),T=new Vu(M),T.scheduler=h?()=>h(Se,!1):Se,j=de=>Xd(de,!1,T),H=T.onStop=()=>{const de=za.get(T);if(de){if(y)y(de,4);else for(const Fe of de)Fe();za.delete(T)}},i?l?Se(!0):fe=T.run():h?h(Se.bind(null,!0),!0):T.run(),X.pause=T.pause.bind(T),X.resume=T.resume.bind(T),X.stop=X,X}function Ai(t,i=1/0,s){if(i<=0||!dt(t)||t.__v_skip||(s=s||new Map,(s.get(t)||0)>=i))return t;if(s.set(t,i),i--,rn(t))Ai(t.value,i,s);else if($e(t))for(let l=0;l{Ai(l,i,s)});else if(Nu(t)){for(const l in t)Ai(t[l],i,s);for(const l of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,l)&&Ai(t[l],i,s)}return t}/** -* @vue/runtime-core v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ta(t,i,s,l){try{return l?t(...l):t()}catch(u){Ja(u,i,s)}}function Hn(t,i,s,l){if(je(t)){const u=ta(t,i,s,l);return u&&$u(u)&&u.catch(f=>{Ja(f,i,s)}),u}if($e(t)){const u=[];for(let f=0;f>>1,u=fn[l],f=Gs(u);f=Gs(s)?fn.push(t):fn.splice(tf(i),0,t),t.flags|=1,sc()}}function sc(){$a||($a=ic.then(rc))}function nf(t){$e(t)?ns.push(...t):Ji&&t.id===-1?Ji.splice(Qo+1,0,t):t.flags&1||(ns.push(t),t.flags|=1),sc()}function zl(t,i,s=si+1){for(;sGs(s)-Gs(l));if(ns.length=0,Ji){Ji.push(...i);return}for(Ji=i,Qo=0;Qot.id==null?t.flags&2?-1:1/0:t.id;function rc(t){try{for(si=0;si{l._d&&Fa(-1);const f=Ia(i);let h;try{h=t(...u)}finally{Ia(f),l._d&&Fa(1)}return h};return l._n=!0,l._c=!0,l._d=!0,l}function ie(t,i){if(an===null)return t;const s=nr(an),l=t.dirs||(t.dirs=[]);for(let u=0;u1)return s&&je(i)?i.call(l&&l.proxy):i}}const of=Symbol.for("v-scx"),sf=()=>Vs(of);function Bt(t,i,s){return cc(t,i,s)}function cc(t,i,s=vt){const{immediate:l,deep:u,flush:f,once:h}=s,_=Kt({},s),y=i&&l||!i&&f!=="post";let C;if(Xs){if(f==="sync"){const j=sf();C=j.__watcherHandles||(j.__watcherHandles=[])}else if(!y){const j=()=>{};return j.stop=ui,j.resume=ui,j.pause=ui,j}}const T=hn;_.call=(j,K,F)=>Hn(j,T,K,F);let M=!1;f==="post"?_.scheduler=j=>{dn(j,T&&T.suspense)}:f!=="sync"&&(M=!0,_.scheduler=(j,K)=>{K?j():ul(j)}),_.augmentJob=j=>{i&&(j.flags|=4),M&&(j.flags|=2,T&&(j.id=T.uid,j.i=T))};const H=Qd(t,i,_);return Xs&&(C?C.push(H):y&&H()),H}function af(t,i,s){const l=this.proxy,u=Tt(t)?t.includes(".")?dc(l,t):()=>l[t]:t.bind(l,l);let f;je(i)?f=i:(f=i.handler,s=i);const h=na(this),_=cc(u,f.bind(l),s);return h(),_}function dc(t,i){const s=i.split(".");return()=>{let l=t;for(let u=0;ut.__isTeleport,Co=t=>t&&(t.disabled||t.disabled===""),rf=t=>t&&(t.defer||t.defer===""),$l=t=>typeof SVGElement<"u"&&t instanceof SVGElement,Il=t=>typeof MathMLElement=="function"&&t instanceof MathMLElement,Br=(t,i)=>{const s=t&&t.to;return Tt(s)?i?i(s):null:s},lf={name:"Teleport",__isTeleport:!0,process(t,i,s,l,u,f,h,_,y,C){const{mc:T,pc:M,pbc:H,o:{insert:j,querySelector:K,createText:F,createComment:te,parentNode:X}}=C,fe=Co(i.props);let{dynamicChildren:Se}=i;const de=(Te,Ze,he)=>{Te.shapeFlag&16&&T(Te.children,Ze,he,u,f,h,_,y)},Fe=(Te=i)=>{const Ze=Co(Te.props),he=Te.target=Br(Te.props,K),Q=Ur(he,Te,F,j);he&&(h!=="svg"&&$l(he)?h="svg":h!=="mathml"&&Il(he)&&(h="mathml"),u&&u.isCE&&(u.ce._teleportTargets||(u.ce._teleportTargets=new Set)).add(he),Ze||(de(Te,he,Q),Is(Te,!1)))},Oe=Te=>{const Ze=()=>{if(Yi.get(Te)===Ze){if(Yi.delete(Te),Co(Te.props)){const he=X(Te.el)||s;de(Te,he,Te.anchor),Is(Te,!0)}Fe(Te)}};Yi.set(Te,Ze),dn(Ze,f)};if(t==null){const Te=i.el=F(""),Ze=i.anchor=F("");if(j(Te,s,l),j(Ze,s,l),rf(i.props)||f&&f.pendingBranch){Oe(i);return}fe&&(de(i,s,Ze),Is(i,!0)),Fe()}else{i.el=t.el;const Te=i.anchor=t.anchor,Ze=Yi.get(t);if(Ze){Ze.flags|=8,Yi.delete(t),Oe(i);return}i.targetStart=t.targetStart;const he=i.target=t.target,Q=i.targetAnchor=t.targetAnchor,B=Co(t.props),O=B?s:he,N=B?Te:Q;if(h==="svg"||$l(he)?h="svg":(h==="mathml"||Il(he))&&(h="mathml"),Se?(H(t.dynamicChildren,Se,O,u,f,h,_),fl(t,i,!0)):y||M(t,i,O,N,u,f,h,_,!1),fe)B?i.props&&t.props&&i.props.to!==t.props.to&&(i.props.to=t.props.to):La(i,s,Te,C,1);else if((i.props&&i.props.to)!==(t.props&&t.props.to)){const $=Br(i.props,K);$&&(i.target=$,La(i,$,null,C,0))}else B&&La(i,he,Q,C,1);Is(i,fe)}},remove(t,i,s,{um:l,o:{remove:u}},f){const{shapeFlag:h,children:_,anchor:y,targetStart:C,targetAnchor:T,target:M,props:H}=t,j=Co(H),K=f||!j,F=Yi.get(t);if(F&&(F.flags|=8,Yi.delete(t)),M&&(u(C),u(T)),f&&u(y),!F&&(j||M)&&h&16)for(let te=0;te<_.length;te++){const X=_[te];l(X,i,s,K,!!X.dynamicChildren)}},move:La,hydrate:uf};function La(t,i,s,{o:{insert:l},m:u},f=2){f===0&&l(t.targetAnchor,i,s);const{el:h,anchor:_,shapeFlag:y,children:C,props:T}=t,M=f===2;if(M&&l(h,i,s),!Yi.has(t)&&(!M||Co(T))&&y&16)for(let H=0;H{t.isMounted=!0}),us(()=>{t.isUnmounting=!0}),t}const Bn=[Function,Array],pc={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Bn,onEnter:Bn,onAfterEnter:Bn,onEnterCancelled:Bn,onBeforeLeave:Bn,onLeave:Bn,onAfterLeave:Bn,onLeaveCancelled:Bn,onBeforeAppear:Bn,onAppear:Bn,onAfterAppear:Bn,onAppearCancelled:Bn},mc=t=>{const i=t.subTree;return i.component?mc(i.component):i},ff={name:"BaseTransition",props:pc,setup(t,{slots:i}){const s=Uc(),l=df();return()=>{const u=i.default&&_c(i.default(),!0),f=u&&u.length?gc(u):s.subTree?I():void 0;if(!f)return;const h=ut(t),{mode:_}=h;if(l.isLeaving)return Pr(f);const y=Nl(f);if(!y)return Pr(f);let C=Vr(y,h,l,s,M=>C=M);y.type!==sn&&qs(y,C);let T=s.subTree&&Nl(s.subTree);if(T&&T.type!==sn&&!Lo(T,y)&&mc(s).type!==sn){let M=Vr(T,h,l,s);if(qs(T,M),_==="out-in"&&y.type!==sn)return l.isLeaving=!0,M.afterLeave=()=>{l.isLeaving=!1,s.job.flags&8||s.update(),delete M.afterLeave,T=void 0},Pr(f);_==="in-out"&&y.type!==sn?M.delayLeave=(H,j,K)=>{const F=vc(l,T);F[String(T.key)]=T,H[Un]=()=>{j(),H[Un]=void 0,delete C.delayedLeave,T=void 0},C.delayedLeave=()=>{K(),delete C.delayedLeave,T=void 0}}:T=void 0}else T&&(T=void 0);return f}}};function gc(t){let i=t[0];if(t.length>1){for(const s of t)if(s.type!==sn){i=s;break}}return i}const hf=ff;function vc(t,i){const{leavingVNodes:s}=t;let l=s.get(i.type);return l||(l=Object.create(null),s.set(i.type,l)),l}function Vr(t,i,s,l,u){const{appear:f,mode:h,persisted:_=!1,onBeforeEnter:y,onEnter:C,onAfterEnter:T,onEnterCancelled:M,onBeforeLeave:H,onLeave:j,onAfterLeave:K,onLeaveCancelled:F,onBeforeAppear:te,onAppear:X,onAfterAppear:fe,onAppearCancelled:Se}=i,de=String(t.key),Fe=vc(s,t),Oe=(he,Q)=>{he&&Hn(he,l,9,Q)},Te=(he,Q)=>{const B=Q[1];Oe(he,Q),$e(he)?he.every(O=>O.length<=1)&&B():he.length<=1&&B()},Ze={mode:h,persisted:_,beforeEnter(he){let Q=y;if(!s.isMounted)if(f)Q=te||y;else return;he[Un]&&he[Un](!0);const B=Fe[de];B&&Lo(t,B)&&B.el[Un]&&B.el[Un](),Oe(Q,[he])},enter(he){if(Fe[de]===t)return;let Q=C,B=T,O=M;if(!s.isMounted)if(f)Q=X||C,B=fe||T,O=Se||M;else return;let N=!1;he[Os]=Ye=>{N||(N=!0,Ye?Oe(O,[he]):Oe(B,[he]),Ze.delayedLeave&&Ze.delayedLeave(),he[Os]=void 0)};const $=he[Os].bind(null,!1);Q?Te(Q,[he,$]):$()},leave(he,Q){const B=String(t.key);if(he[Os]&&he[Os](!0),s.isUnmounting)return Q();Oe(H,[he]);let O=!1;he[Un]=$=>{O||(O=!0,Q(),$?Oe(F,[he]):Oe(K,[he]),he[Un]=void 0,Fe[B]===t&&delete Fe[B])};const N=he[Un].bind(null,!1);Fe[B]=t,j?Te(j,[he,N]):N()},clone(he){const Q=Vr(he,i,s,l,u);return u&&u(Q),Q}};return Ze}function Pr(t){if(Xa(t))return t=Qi(t),t.children=null,t}function Nl(t){if(!Xa(t))return hc(t.type)&&t.children?gc(t.children):t;if(t.component)return t.component.subTree;const{shapeFlag:i,children:s}=t;if(s){if(i&16)return s[0];if(i&32&&je(s.default))return s.default()}}function qs(t,i){t.shapeFlag&6&&t.component?(t.transition=i,qs(t.component.subTree,i)):t.shapeFlag&128?(t.ssContent.transition=i.clone(t.ssContent),t.ssFallback.transition=i.clone(t.ssFallback)):t.transition=i}function _c(t,i=!1,s){let l=[],u=0;for(let f=0;f1)for(let f=0;fZs(F,i&&($e(i)?i[te]:i),s,l,u));return}if(is(l)&&!u){l.shapeFlag&512&&l.type.__asyncResolved&&l.component.subTree.component&&Zs(t,i,s,l.component.subTree);return}const f=l.shapeFlag&4?nr(l.component):l.el,h=u?null:f,{i:_,r:y}=t,C=i&&i.r,T=_.refs===vt?_.refs={}:_.refs,M=_.setupState,H=ut(M),j=M===vt?zu:F=>Dl(T,F)?!1:ct(H,F),K=(F,te)=>!(te&&Dl(T,te));if(C!=null&&C!==y){if(Fl(i),Tt(C))T[C]=null,j(C)&&(M[C]=null);else if(rn(C)){const F=i;K(C,F.k)&&(C.value=null),F.k&&(T[F.k]=null)}}if(je(y)){ci();try{ta(y,_,12,[h,T])}finally{di()}}else{const F=Tt(y),te=rn(y);if(F||te){const X=()=>{if(t.f){const fe=F?j(y)?M[y]:T[y]:K()||!t.k?y.value:T[t.k];if(u)$e(fe)&&Qr(fe,f);else if($e(fe))fe.includes(f)||fe.push(f);else if(F)T[y]=[f],j(y)&&(M[y]=T[y]);else{const Se=[f];K(y,t.k)&&(y.value=Se),t.k&&(T[t.k]=Se)}}else F?(T[y]=h,j(y)&&(M[y]=h)):te&&(K(y,t.k)&&(y.value=h),t.k&&(T[t.k]=h))};if(h){const fe=()=>{X(),Na.delete(t)};fe.id=-1,Na.set(t,fe),dn(fe,s)}else Fl(t),X()}}}function Fl(t){const i=Na.get(t);i&&(i.flags|=8,Na.delete(t))}qa().requestIdleCallback;qa().cancelIdleCallback;const is=t=>!!t.type.__asyncLoader,Xa=t=>t.type.__isKeepAlive;function pf(t,i){yc(t,"a",i)}function mf(t,i){yc(t,"da",i)}function yc(t,i,s=hn){const l=t.__wdc||(t.__wdc=()=>{let u=s;for(;u;){if(u.isDeactivated)return;u=u.parent}return t()});if(Qa(i,l,s),s){let u=s.parent;for(;u&&u.parent;)Xa(u.parent.vnode)&&gf(l,i,s,u),u=u.parent}}function gf(t,i,s,l){const u=Qa(i,t,l,!0);xc(()=>{Qr(l[i],u)},s)}function Qa(t,i,s=hn,l=!1){if(s){const u=s[t]||(s[t]=[]),f=i.__weh||(i.__weh=(...h)=>{ci();const _=na(s),y=Hn(i,s,t,h);return _(),di(),y});return l?u.unshift(f):u.push(f),f}}const Oi=t=>(i,s=hn)=>{(!Xs||t==="sp")&&Qa(t,(...l)=>i(...l),s)},vf=Oi("bm"),fi=Oi("m"),_f=Oi("bu"),bf=Oi("u"),us=Oi("bum"),xc=Oi("um"),yf=Oi("sp"),xf=Oi("rtg"),wf=Oi("rtc");function kf(t,i=hn){Qa("ec",t,i)}const Sf=Symbol.for("v-ndc");function Ie(t,i,s,l){let u;const f=s,h=$e(t);if(h||Tt(t)){const _=h&&Mo(t);let y=!1,C=!1;_&&(y=!Vn(t),C=Ei(t),t=Ya(t)),u=new Array(t.length);for(let T=0,M=t.length;Ti(_,y,void 0,f));else{const _=Object.keys(t);u=new Array(_.length);for(let y=0,C=_.length;y0;return p(),nt(le,null,[A("slot",s,l)],C?-2:64)}let f=t[i];f&&f._c&&(f._d=!1),p();const h=f&&wc(f(s)),_=s.key||h&&h.key,y=nt(le,{key:(_&&!Qn(_)?_:`_${i}`)+(!h&&l?"_fb":"")},h||[],h&&t._===1?64:-2);return y.scopeId&&(y.slotScopeIds=[y.scopeId+"-s"]),f&&f._c&&(f._d=!0),y}function wc(t){return t.some(i=>Js(i)?!(i.type===sn||i.type===le&&!wc(i.children)):!0)?t:null}const Zr=t=>t?Vc(t)?nr(t):Zr(t.parent):null,Hs=Kt(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Zr(t.parent),$root:t=>Zr(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>Sc(t),$forceUpdate:t=>t.f||(t.f=()=>{ul(t.update)}),$nextTick:t=>t.n||(t.n=oc.bind(t.proxy)),$watch:t=>af.bind(t)}),Cr=(t,i)=>t!==vt&&!t.__isScriptSetup&&ct(t,i),Pf={get({_:t},i){if(i==="__v_skip")return!0;const{ctx:s,setupState:l,data:u,props:f,accessCache:h,type:_,appContext:y}=t;if(i[0]!=="$"){const H=h[i];if(H!==void 0)switch(H){case 1:return l[i];case 2:return u[i];case 4:return s[i];case 3:return f[i]}else{if(Cr(l,i))return h[i]=1,l[i];if(u!==vt&&ct(u,i))return h[i]=2,u[i];if(ct(f,i))return h[i]=3,f[i];if(s!==vt&&ct(s,i))return h[i]=4,s[i];Hr&&(h[i]=0)}}const C=Hs[i];let T,M;if(C)return i==="$attrs"&&on(t.attrs,"get",""),C(t);if((T=_.__cssModules)&&(T=T[i]))return T;if(s!==vt&&ct(s,i))return h[i]=4,s[i];if(M=y.config.globalProperties,ct(M,i))return M[i]},set({_:t},i,s){const{data:l,setupState:u,ctx:f}=t;return Cr(u,i)?(u[i]=s,!0):l!==vt&&ct(l,i)?(l[i]=s,!0):ct(t.props,i)||i[0]==="$"&&i.slice(1)in t?!1:(f[i]=s,!0)},has({_:{data:t,setupState:i,accessCache:s,ctx:l,appContext:u,props:f,type:h}},_){let y;return!!(s[_]||t!==vt&&_[0]!=="$"&&ct(t,_)||Cr(i,_)||ct(f,_)||ct(l,_)||ct(Hs,_)||ct(u.config.globalProperties,_)||(y=h.__cssModules)&&y[_])},defineProperty(t,i,s){return s.get!=null?t._.accessCache[i]=0:ct(s,"value")&&this.set(t,i,s.value,null),Reflect.defineProperty(t,i,s)}};function Rl(t){return $e(t)?t.reduce((i,s)=>(i[s]=null,i),{}):t}let Hr=!0;function Cf(t){const i=Sc(t),s=t.proxy,l=t.ctx;Hr=!1,i.beforeCreate&&Bl(i.beforeCreate,t,"bc");const{data:u,computed:f,methods:h,watch:_,provide:y,inject:C,created:T,beforeMount:M,mounted:H,beforeUpdate:j,updated:K,activated:F,deactivated:te,beforeDestroy:X,beforeUnmount:fe,destroyed:Se,unmounted:de,render:Fe,renderTracked:Oe,renderTriggered:Te,errorCaptured:Ze,serverPrefetch:he,expose:Q,inheritAttrs:B,components:O,directives:N,filters:$}=i;if(C&&Lf(C,l,null),h)for(const ge in h){const ue=h[ge];je(ue)&&(l[ge]=ue.bind(s))}if(u){const ge=u.call(s,s);dt(ge)&&(t.data=gt(ge))}if(Hr=!0,f)for(const ge in f){const ue=f[ge],ft=je(ue)?ue.bind(s,s):je(ue.get)?ue.get.bind(s,s):ui,pe=!je(ue)&&je(ue.set)?ue.set.bind(s):ui,Ue=ce({get:ft,set:pe});Object.defineProperty(l,ge,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Ve=>Ue.value=Ve})}if(_)for(const ge in _)kc(_[ge],l,s,ge);if(y){const ge=je(y)?y.call(s):y;Reflect.ownKeys(ge).forEach(ue=>{uc(ue,ge[ue])})}T&&Bl(T,t,"c");function we(ge,ue){$e(ue)?ue.forEach(ft=>ge(ft.bind(s))):ue&&ge(ue.bind(s))}if(we(vf,M),we(fi,H),we(_f,j),we(bf,K),we(pf,F),we(mf,te),we(kf,Ze),we(wf,Oe),we(xf,Te),we(us,fe),we(xc,de),we(yf,he),$e(Q))if(Q.length){const ge=t.exposed||(t.exposed={});Q.forEach(ue=>{Object.defineProperty(ge,ue,{get:()=>s[ue],set:ft=>s[ue]=ft,enumerable:!0})})}else t.exposed||(t.exposed={});Fe&&t.render===ui&&(t.render=Fe),B!=null&&(t.inheritAttrs=B),O&&(t.components=O),N&&(t.directives=N),he&&bc(t)}function Lf(t,i,s=ui){$e(t)&&(t=jr(t));for(const l in t){const u=t[l];let f;dt(u)?"default"in u?f=Vs(u.from||l,u.default,!0):f=Vs(u.from||l):f=Vs(u),rn(f)?Object.defineProperty(i,l,{enumerable:!0,configurable:!0,get:()=>f.value,set:h=>f.value=h}):i[l]=f}}function Bl(t,i,s){Hn($e(t)?t.map(l=>l.bind(i.proxy)):t.bind(i.proxy),i,s)}function kc(t,i,s,l){let u=l.includes(".")?dc(s,l):()=>s[l];if(Tt(t)){const f=i[t];je(f)&&Bt(u,f)}else if(je(t))Bt(u,t.bind(s));else if(dt(t))if($e(t))t.forEach(f=>kc(f,i,s,l));else{const f=je(t.handler)?t.handler.bind(s):i[t.handler];je(f)&&Bt(u,f,t)}}function Sc(t){const i=t.type,{mixins:s,extends:l}=i,{mixins:u,optionsCache:f,config:{optionMergeStrategies:h}}=t.appContext,_=f.get(i);let y;return _?y=_:!u.length&&!s&&!l?y=i:(y={},u.length&&u.forEach(C=>Da(y,C,h,!0)),Da(y,i,h)),dt(i)&&f.set(i,y),y}function Da(t,i,s,l=!1){const{mixins:u,extends:f}=i;f&&Da(t,f,s,!0),u&&u.forEach(h=>Da(t,h,s,!0));for(const h in i)if(!(l&&h==="expose")){const _=Af[h]||s&&s[h];t[h]=_?_(t[h],i[h]):i[h]}return t}const Af={data:Ul,props:Vl,emits:Vl,methods:Ns,computed:Ns,beforeCreate:cn,created:cn,beforeMount:cn,mounted:cn,beforeUpdate:cn,updated:cn,beforeDestroy:cn,beforeUnmount:cn,destroyed:cn,unmounted:cn,activated:cn,deactivated:cn,errorCaptured:cn,serverPrefetch:cn,components:Ns,directives:Ns,watch:Ef,provide:Ul,inject:Mf};function Ul(t,i){return i?t?function(){return Kt(je(t)?t.call(this,this):t,je(i)?i.call(this,this):i)}:i:t}function Mf(t,i){return Ns(jr(t),jr(i))}function jr(t){if($e(t)){const i={};for(let s=0;si==="modelValue"||i==="model-value"?t.modelModifiers:t[`${i}Modifiers`]||t[`${Jn(i)}Modifiers`]||t[`${to(i)}Modifiers`];function If(t,i,...s){if(t.isUnmounted)return;const l=t.vnode.props||vt;let u=s;const f=i.startsWith("update:"),h=f&&$f(l,i.slice(7));h&&(h.trim&&(u=s.map(T=>Tt(T)?T.trim():T)),h.number&&(u=s.map(Ga)));let _,y=l[_=xr(i)]||l[_=xr(Jn(i))];!y&&f&&(y=l[_=xr(to(i))]),y&&Hn(y,t,6,u);const C=l[_+"Once"];if(C){if(!t.emitted)t.emitted={};else if(t.emitted[_])return;t.emitted[_]=!0,Hn(C,t,6,u)}}const Nf=new WeakMap;function Pc(t,i,s=!1){const l=s?Nf:i.emitsCache,u=l.get(t);if(u!==void 0)return u;const f=t.emits;let h={},_=!1;if(!je(t)){const y=C=>{const T=Pc(C,i,!0);T&&(_=!0,Kt(h,T))};!s&&i.mixins.length&&i.mixins.forEach(y),t.extends&&y(t.extends),t.mixins&&t.mixins.forEach(y)}return!f&&!_?(dt(t)&&l.set(t,null),null):($e(f)?f.forEach(y=>h[y]=null):Kt(h,f),dt(t)&&l.set(t,h),h)}function er(t,i){return!t||!ja(i)?!1:(i=i.slice(2),i=i==="Once"?i:i.replace(/Once$/,""),ct(t,i[0].toLowerCase()+i.slice(1))||ct(t,to(i))||ct(t,i))}function Zl(t){const{type:i,vnode:s,proxy:l,withProxy:u,propsOptions:[f],slots:h,attrs:_,emit:y,render:C,renderCache:T,props:M,data:H,setupState:j,ctx:K,inheritAttrs:F}=t,te=Ia(t);let X,fe;try{if(s.shapeFlag&4){const de=u||l,Fe=de;X=ri(C.call(Fe,de,T,M,j,H,K)),fe=_}else{const de=i;X=ri(de.length>1?de(M,{attrs:_,slots:h,emit:y}):de(M,null)),fe=i.props?_:Df(_)}}catch(de){js.length=0,Ja(de,t,1),X=A(sn)}let Se=X;if(fe&&F!==!1){const de=Object.keys(fe),{shapeFlag:Fe}=Se;de.length&&Fe&7&&(f&&de.some(Wa)&&(fe=Ff(fe,f)),Se=Qi(Se,fe,!1,!0))}return s.dirs&&(Se=Qi(Se,null,!1,!0),Se.dirs=Se.dirs?Se.dirs.concat(s.dirs):s.dirs),s.transition&&qs(Se,s.transition),X=Se,Ia(te),X}const Df=t=>{let i;for(const s in t)(s==="class"||s==="style"||ja(s))&&((i||(i={}))[s]=t[s]);return i},Ff=(t,i)=>{const s={};for(const l in t)(!Wa(l)||!(l.slice(9)in i))&&(s[l]=t[l]);return s};function Rf(t,i,s){const{props:l,children:u,component:f}=t,{props:h,children:_,patchFlag:y}=i,C=f.emitsOptions;if(i.dirs||i.transition)return!0;if(s&&y>=0){if(y&1024)return!0;if(y&16)return l?Hl(l,h,C):!!h;if(y&8){const T=i.dynamicProps;for(let M=0;MObject.create(Lc),Mc=t=>Object.getPrototypeOf(t)===Lc;function Uf(t,i,s,l=!1){const u={},f=Ac();t.propsDefaults=Object.create(null),Ec(t,i,u,f);for(const h in t.propsOptions[0])h in u||(u[h]=void 0);s?t.props=l?u:jd(u):t.type.props?t.props=u:t.props=f,t.attrs=f}function Vf(t,i,s,l){const{props:u,attrs:f,vnode:{patchFlag:h}}=t,_=ut(u),[y]=t.propsOptions;let C=!1;if((l||h>0)&&!(h&16)){if(h&8){const T=t.vnode.dynamicProps;for(let M=0;M{y=!0;const[H,j]=Oc(M,i,!0);Kt(h,H),j&&_.push(...j)};!s&&i.mixins.length&&i.mixins.forEach(T),t.extends&&T(t.extends),t.mixins&&t.mixins.forEach(T)}if(!f&&!y)return dt(t)&&l.set(t,es),es;if($e(f))for(let T=0;Tt==="_"||t==="_ctx"||t==="$stable",dl=t=>$e(t)?t.map(ri):[ri(t)],Hf=(t,i,s)=>{if(i._n)return i;const l=ye((...u)=>dl(i(...u)),s);return l._c=!1,l},zc=(t,i,s)=>{const l=t._ctx;for(const u in t){if(cl(u))continue;const f=t[u];if(je(f))i[u]=Hf(u,f,l);else if(f!=null){const h=dl(f);i[u]=()=>h}}},$c=(t,i)=>{const s=dl(i);t.slots.default=()=>s},Ic=(t,i,s)=>{for(const l in i)(s||!cl(l))&&(t[l]=i[l])},jf=(t,i,s)=>{const l=t.slots=Ac();if(t.vnode.shapeFlag&32){const u=i._;u?(Ic(l,i,s),s&&Fu(l,"_",u,!0)):zc(i,l)}else i&&$c(t,i)},Wf=(t,i,s)=>{const{vnode:l,slots:u}=t;let f=!0,h=vt;if(l.shapeFlag&32){const _=i._;_?s&&_===1?f=!1:Ic(u,i,s):(f=!i.$stable,zc(i,u)),h=i}else i&&($c(t,i),h={default:1});if(f)for(const _ in u)!cl(_)&&h[_]==null&&delete u[_]},dn=Jf;function Kf(t){return Gf(t)}function Gf(t,i){const s=qa();s.__VUE__=!0;const{insert:l,remove:u,patchProp:f,createElement:h,createText:_,createComment:y,setText:C,setElementText:T,parentNode:M,nextSibling:H,setScopeId:j=ui,insertStaticContent:K}=t,F=(x,b,S,W=null,V=null,G=null,re=void 0,ae=null,oe=!!b.dynamicChildren)=>{if(x===b)return;x&&!Lo(x,b)&&(W=zt(x),Ve(x,V,G,!0),x=null),b.patchFlag===-2&&(oe=!1,b.dynamicChildren=null);const{type:ee,ref:ve,shapeFlag:se}=b;switch(ee){case tr:te(x,b,S,W);break;case sn:X(x,b,S,W);break;case Ar:x==null&&fe(b,S,W,re);break;case le:O(x,b,S,W,V,G,re,ae,oe);break;default:se&1?Fe(x,b,S,W,V,G,re,ae,oe):se&6?N(x,b,S,W,V,G,re,ae,oe):(se&64||se&128)&&ee.process(x,b,S,W,V,G,re,ae,oe,Pt)}ve!=null&&V?Zs(ve,x&&x.ref,G,b||x,!b):ve==null&&x&&x.ref!=null&&Zs(x.ref,null,G,x,!0)},te=(x,b,S,W)=>{if(x==null)l(b.el=_(b.children),S,W);else{const V=b.el=x.el;b.children!==x.children&&C(V,b.children)}},X=(x,b,S,W)=>{x==null?l(b.el=y(b.children||""),S,W):b.el=x.el},fe=(x,b,S,W)=>{[x.el,x.anchor]=K(x.children,b,S,W,x.el,x.anchor)},Se=({el:x,anchor:b},S,W)=>{let V;for(;x&&x!==b;)V=H(x),l(x,S,W),x=V;l(b,S,W)},de=({el:x,anchor:b})=>{let S;for(;x&&x!==b;)S=H(x),u(x),x=S;u(b)},Fe=(x,b,S,W,V,G,re,ae,oe)=>{if(b.type==="svg"?re="svg":b.type==="math"&&(re="mathml"),x==null)Oe(b,S,W,V,G,re,ae,oe);else{const ee=x.el&&x.el._isVueCE?x.el:null;try{ee&&ee._beginPatch(),he(x,b,V,G,re,ae,oe)}finally{ee&&ee._endPatch()}}},Oe=(x,b,S,W,V,G,re,ae)=>{let oe,ee;const{props:ve,shapeFlag:se,transition:ke,dirs:Pe}=x;if(oe=x.el=h(x.type,G,ve&&ve.is,ve),se&8?T(oe,x.children):se&16&&Ze(x.children,oe,null,W,V,Lr(x,G),re,ae),Pe&&wo(x,null,W,"created"),Te(oe,x,x.scopeId,re,W),ve){for(const Ke in ve)Ke!=="value"&&!Rs(Ke)&&f(oe,Ke,null,ve[Ke],G,W);"value"in ve&&f(oe,"value",null,ve.value,G),(ee=ve.onVnodeBeforeMount)&&oi(ee,W,x)}Pe&&wo(x,null,W,"beforeMount");const Re=qf(V,ke);Re&&ke.beforeEnter(oe),l(oe,b,S),((ee=ve&&ve.onVnodeMounted)||Re||Pe)&&dn(()=>{try{ee&&oi(ee,W,x),Re&&ke.enter(oe),Pe&&wo(x,null,W,"mounted")}finally{}},V)},Te=(x,b,S,W,V)=>{if(S&&j(x,S),W)for(let G=0;G{for(let ee=oe;ee{const ae=b.el=x.el;let{patchFlag:oe,dynamicChildren:ee,dirs:ve}=b;oe|=x.patchFlag&16;const se=x.props||vt,ke=b.props||vt;let Pe;if(S&&ko(S,!1),(Pe=ke.onVnodeBeforeUpdate)&&oi(Pe,S,b,x),ve&&wo(b,x,S,"beforeUpdate"),S&&ko(S,!0),ee&&(!x.dynamicChildren||x.dynamicChildren.length!==ee.length)&&(oe=0,re=!1,ee=null),(se.innerHTML&&ke.innerHTML==null||se.textContent&&ke.textContent==null)&&T(ae,""),ee?Q(x.dynamicChildren,ee,ae,S,W,Lr(b,V),G):re||ue(x,b,ae,null,S,W,Lr(b,V),G,!1),oe>0){if(oe&16)B(ae,se,ke,S,V);else if(oe&2&&se.class!==ke.class&&f(ae,"class",null,ke.class,V),oe&4&&f(ae,"style",se.style,ke.style,V),oe&8){const Re=b.dynamicProps;for(let Ke=0;Ke{Pe&&oi(Pe,S,b,x),ve&&wo(b,x,S,"updated")},W)},Q=(x,b,S,W,V,G,re)=>{for(let ae=0;ae{if(b!==S){if(b!==vt)for(const G in b)!Rs(G)&&!(G in S)&&f(x,G,b[G],null,V,W);for(const G in S){if(Rs(G))continue;const re=S[G],ae=b[G];re!==ae&&G!=="value"&&f(x,G,ae,re,V,W)}"value"in S&&f(x,"value",b.value,S.value,V)}},O=(x,b,S,W,V,G,re,ae,oe)=>{const ee=b.el=x?x.el:_(""),ve=b.anchor=x?x.anchor:_("");let{patchFlag:se,dynamicChildren:ke,slotScopeIds:Pe}=b;Pe&&(ae=ae?ae.concat(Pe):Pe),x==null?(l(ee,S,W),l(ve,S,W),Ze(b.children||[],S,ve,V,G,re,ae,oe)):se>0&&se&64&&ke&&x.dynamicChildren&&x.dynamicChildren.length===ke.length?(Q(x.dynamicChildren,ke,S,V,G,re,ae),(b.key!=null||V&&b===V.subTree)&&fl(x,b,!0)):ue(x,b,S,ve,V,G,re,ae,oe)},N=(x,b,S,W,V,G,re,ae,oe)=>{b.slotScopeIds=ae,x==null?b.shapeFlag&512?V.ctx.activate(b,S,W,re,oe):$(b,S,W,V,G,re,oe):Ye(x,b,oe)},$=(x,b,S,W,V,G,re)=>{const ae=x.component=oh(x,W,V);if(Xa(x)&&(ae.ctx.renderer=Pt),sh(ae,!1,re),ae.asyncDep){if(V&&V.registerDep(ae,we,re),!x.el){const oe=ae.subTree=A(sn);X(null,oe,b,S),x.placeholder=oe.el}}else we(ae,x,b,S,V,G,re)},Ye=(x,b,S)=>{const W=b.component=x.component;if(Rf(x,b,S))if(W.asyncDep&&!W.asyncResolved){ge(W,b,S);return}else W.next=b,W.update();else b.el=x.el,W.vnode=b},we=(x,b,S,W,V,G,re)=>{const ae=()=>{if(x.isMounted){let{next:se,bu:ke,u:Pe,parent:Re,vnode:Ke}=x;{const Jt=Nc(x);if(Jt){se&&(se.el=Ke.el,ge(x,se,re)),Jt.asyncDep.then(()=>{dn(()=>{x.isUnmounted||ee()},V)});return}}let Ge=se,pt;ko(x,!1),se?(se.el=Ke.el,ge(x,se,re)):se=Ke,ke&&Ea(ke),(pt=se.props&&se.props.onVnodeBeforeUpdate)&&oi(pt,Re,se,Ke),ko(x,!0);const ht=Zl(x),Vt=x.subTree;x.subTree=ht,F(Vt,ht,M(Vt.el),zt(Vt),x,V,G),se.el=ht.el,Ge===null&&Bf(x,ht.el),Pe&&dn(Pe,V),(pt=se.props&&se.props.onVnodeUpdated)&&dn(()=>oi(pt,Re,se,Ke),V)}else{let se;const{el:ke,props:Pe}=b,{bm:Re,m:Ke,parent:Ge,root:pt,type:ht}=x,Vt=is(b);ko(x,!1),Re&&Ea(Re),!Vt&&(se=Pe&&Pe.onVnodeBeforeMount)&&oi(se,Ge,b),ko(x,!0);{pt.ce&&pt.ce._hasShadowRoot()&&pt.ce._injectChildStyle(ht,x.parent?x.parent.type:void 0);const Jt=x.subTree=Zl(x);F(null,Jt,S,W,x,V,G),b.el=Jt.el}if(Ke&&dn(Ke,V),!Vt&&(se=Pe&&Pe.onVnodeMounted)){const Jt=b;dn(()=>oi(se,Ge,Jt),V)}(b.shapeFlag&256||Ge&&is(Ge.vnode)&&Ge.vnode.shapeFlag&256)&&x.a&&dn(x.a,V),x.isMounted=!0,b=S=W=null}};x.scope.on();const oe=x.effect=new Vu(ae);x.scope.off();const ee=x.update=oe.run.bind(oe),ve=x.job=oe.runIfDirty.bind(oe);ve.i=x,ve.id=x.uid,oe.scheduler=()=>ul(ve),ko(x,!0),ee()},ge=(x,b,S)=>{b.component=x;const W=x.vnode.props;x.vnode=b,x.next=null,Vf(x,b.props,W,S),Wf(x,b.children,S),ci(),zl(x),di()},ue=(x,b,S,W,V,G,re,ae,oe=!1)=>{const ee=x&&x.children,ve=x?x.shapeFlag:0,se=b.children,{patchFlag:ke,shapeFlag:Pe}=b;if(ke>0){if(ke&128){pe(ee,se,S,W,V,G,re,ae,oe);return}else if(ke&256){ft(ee,se,S,W,V,G,re,ae,oe);return}}Pe&8?(ve&16&&De(ee,V,G),se!==ee&&T(S,se)):ve&16?Pe&16?pe(ee,se,S,W,V,G,re,ae,oe):De(ee,V,G,!0):(ve&8&&T(S,""),Pe&16&&Ze(se,S,W,V,G,re,ae,oe))},ft=(x,b,S,W,V,G,re,ae,oe)=>{x=x||es,b=b||es;const ee=x.length,ve=b.length,se=Math.min(ee,ve);let ke;for(ke=0;keve?De(x,V,G,!0,!1,se):Ze(b,S,W,V,G,re,ae,oe,se)},pe=(x,b,S,W,V,G,re,ae,oe)=>{let ee=0;const ve=b.length;let se=x.length-1,ke=ve-1;for(;ee<=se&&ee<=ke;){const Pe=x[ee],Re=b[ee]=oe?Ci(b[ee]):ri(b[ee]);if(Lo(Pe,Re))F(Pe,Re,S,null,V,G,re,ae,oe);else break;ee++}for(;ee<=se&&ee<=ke;){const Pe=x[se],Re=b[ke]=oe?Ci(b[ke]):ri(b[ke]);if(Lo(Pe,Re))F(Pe,Re,S,null,V,G,re,ae,oe);else break;se--,ke--}if(ee>se){if(ee<=ke){const Pe=ke+1,Re=Peke)for(;ee<=se;)Ve(x[ee],V,G,!0),ee++;else{const Pe=ee,Re=ee,Ke=new Map;for(ee=Re;ee<=ke;ee++){const Ct=b[ee]=oe?Ci(b[ee]):ri(b[ee]);Ct.key!=null&&Ke.set(Ct.key,ee)}let Ge,pt=0;const ht=ke-Re+1;let Vt=!1,Jt=0;const Zt=new Array(ht);for(ee=0;ee=ht){Ve(Ct,V,G,!0);continue}let $t;if(Ct.key!=null)$t=Ke.get(Ct.key);else for(Ge=Re;Ge<=ke;Ge++)if(Zt[Ge-Re]===0&&Lo(Ct,b[Ge])){$t=Ge;break}$t===void 0?Ve(Ct,V,G,!0):(Zt[$t-Re]=ee+1,$t>=Jt?Jt=$t:Vt=!0,F(Ct,b[$t],S,null,V,G,re,ae,oe),pt++)}const pn=Vt?Yf(Zt):es;for(Ge=pn.length-1,ee=ht-1;ee>=0;ee--){const Ct=Re+ee,$t=b[Ct],kn=b[Ct+1],zi=Ct+1{const{el:G,type:re,transition:ae,children:oe,shapeFlag:ee}=x;if(ee&6){Ue(x.component.subTree,b,S,W);return}if(ee&128){x.suspense.move(b,S,W);return}if(ee&64){re.move(x,b,S,Pt);return}if(re===le){l(G,b,S);for(let se=0;seae.enter(G),V));else{const{leave:se,delayLeave:ke,afterLeave:Pe}=ae,Re=()=>{x.ctx.isUnmounted?u(G):l(G,b,S)},Ke=()=>{const Ge=G._isLeaving||!!G[Un];G._isLeaving&&G[Un](!0),ae.persisted&&!Ge?Re():se(G,()=>{Re(),Pe&&Pe()})};ke?ke(G,Re,Ke):Ke()}else l(G,b,S)},Ve=(x,b,S,W=!1,V=!1)=>{const{type:G,props:re,ref:ae,children:oe,dynamicChildren:ee,shapeFlag:ve,patchFlag:se,dirs:ke,cacheIndex:Pe,memo:Re}=x;if(se===-2&&(V=!1),ae!=null&&(ci(),Zs(ae,null,S,x,!0),di()),Pe!=null&&(b.renderCache[Pe]=void 0),ve&256){b.ctx.deactivate(x);return}const Ke=ve&1&&ke,Ge=!is(x);let pt;if(Ge&&(pt=re&&re.onVnodeBeforeUnmount)&&oi(pt,b,x),ve&6)Le(x.component,S,W);else{if(ve&128){x.suspense.unmount(S,W);return}Ke&&wo(x,null,b,"beforeUnmount"),ve&64?x.type.remove(x,b,S,Pt,W):ee&&!ee.hasOnce&&(G!==le||se>0&&se&64)?De(ee,b,S,!1,!0):(G===le&&se&384||!V&&ve&16)&&De(oe,b,S),W&&wt(x)}const ht=Re!=null&&Pe==null;(Ge&&(pt=re&&re.onVnodeUnmounted)||Ke||ht)&&dn(()=>{pt&&oi(pt,b,x),Ke&&wo(x,null,b,"unmounted"),ht&&(x.el=null)},S)},wt=x=>{const{type:b,el:S,anchor:W,transition:V}=x;if(b===le){st(S,W);return}if(b===Ar){de(x);return}const G=()=>{u(S),V&&!V.persisted&&V.afterLeave&&V.afterLeave()};if(x.shapeFlag&1&&V&&!V.persisted){const{leave:re,delayLeave:ae}=V,oe=()=>re(S,G);ae?ae(x.el,G,oe):oe()}else G()},st=(x,b)=>{let S;for(;x!==b;)S=H(x),u(x),x=S;u(b)},Le=(x,b,S)=>{const{bum:W,scope:V,job:G,subTree:re,um:ae,m:oe,a:ee}=x;Wl(oe),Wl(ee),W&&Ea(W),V.stop(),G&&(G.flags|=8,Ve(re,x,b,S)),ae&&dn(ae,b),dn(()=>{x.isUnmounted=!0},b)},De=(x,b,S,W=!1,V=!1,G=0)=>{for(let re=G;re{if(x.shapeFlag&6)return zt(x.component.subTree);if(x.shapeFlag&128)return x.suspense.next();const b=H(x.anchor||x.el),S=b&&b[fc];return S?H(S):b};let At=!1;const Ut=(x,b,S)=>{let W;x==null?b._vnode&&(Ve(b._vnode,null,null,!0),W=b._vnode.component):F(b._vnode||null,x,b,null,null,null,S),b._vnode=x,At||(At=!0,zl(W),ac(),At=!1)},Pt={p:F,um:Ve,m:Ue,r:wt,mt:$,mc:Ze,pc:ue,pbc:Q,n:zt,o:t};return{render:Ut,hydrate:void 0,createApp:zf(Ut)}}function Lr({type:t,props:i},s){return s==="svg"&&t==="foreignObject"||s==="mathml"&&t==="annotation-xml"&&i&&i.encoding&&i.encoding.includes("html")?void 0:s}function ko({effect:t,job:i},s){s?(t.flags|=32,i.flags|=4):(t.flags&=-33,i.flags&=-5)}function qf(t,i){return(!t||t&&!t.pendingBranch)&&i&&!i.persisted}function fl(t,i,s=!1){const l=t.children,u=i.children;if($e(l)&&$e(u))for(let f=0;f>1,t[s[_]]0&&(i[l]=s[f-1]),s[f]=l)}}for(f=s.length,h=s[f-1];f-- >0;)s[f]=h,h=i[h];return s}function Nc(t){const i=t.subTree.component;if(i)return i.asyncDep&&!i.asyncResolved?i:Nc(i)}function Wl(t){if(t)for(let i=0;it.__isSuspense;function Jf(t,i){i&&i.pendingBranch?$e(t)?i.effects.push(...t):i.effects.push(t):nf(t)}const le=Symbol.for("v-fgt"),tr=Symbol.for("v-txt"),sn=Symbol.for("v-cmt"),Ar=Symbol.for("v-stc"),js=[];let zn=null;function p(t=!1){js.push(zn=t?null:[])}function Xf(){js.pop(),zn=js[js.length-1]||null}let Ys=1;function Fa(t,i=!1){Ys+=t,t<0&&zn&&i&&(zn.hasOnce=!0)}function Rc(t){return t.dynamicChildren=Ys>0?zn||es:null,Xf(),Ys>0&&zn&&zn.push(t),t}function m(t,i,s,l,u,f){return Rc(a(t,i,s,l,u,f,!0))}function nt(t,i,s,l,u){return Rc(A(t,i,s,l,u,!0))}function Js(t){return t?t.__v_isVNode===!0:!1}function Lo(t,i){return t.type===i.type&&t.key===i.key}const Bc=({key:t})=>t??null,Oa=({ref:t,ref_key:i,ref_for:s})=>(typeof t=="number"&&(t=""+t),t!=null?Tt(t)||rn(t)||je(t)?{i:an,r:t,k:i,f:!!s}:t:null);function a(t,i=null,s=null,l=0,u=null,f=t===le?0:1,h=!1,_=!1){const y={__v_isVNode:!0,__v_skip:!0,type:t,props:i,key:i&&Bc(i),ref:i&&Oa(i),scopeId:lc,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:f,patchFlag:l,dynamicProps:u,dynamicChildren:null,appContext:null,ctx:an};return _?(Ra(y,s),f&128&&t.normalize(y)):s&&(y.shapeFlag|=Tt(s)?8:16),Ys>0&&!h&&zn&&(y.patchFlag>0||f&6)&&y.patchFlag!==32&&zn.push(y),y}const A=Qf;function Qf(t,i=null,s=null,l=0,u=null,f=!1){if((!t||t===Sf)&&(t=sn),Js(t)){const _=Qi(t,i,!0);return s&&Ra(_,s),Ys>0&&!f&&zn&&(_.shapeFlag&6?zn[zn.indexOf(t)]=_:zn.push(_)),_.patchFlag=-2,_}if(uh(t)&&(t=t.__vccOpts),i){i=eh(i);let{class:_,style:y}=i;_&&!Tt(_)&&(i.class=Ce(_)),dt(y)&&(ll(y)&&!$e(y)&&(y=Kt({},y)),i.style=Eo(y))}const h=Tt(t)?1:Fc(t)?128:hc(t)?64:dt(t)?4:je(t)?2:0;return a(t,i,s,l,u,h,f,!0)}function eh(t){return t?ll(t)||Mc(t)?Kt({},t):t:null}function Qi(t,i,s=!1,l=!1){const{props:u,ref:f,patchFlag:h,children:_,transition:y}=t,C=i?th(u||{},i):u,T={__v_isVNode:!0,__v_skip:!0,type:t.type,props:C,key:C&&Bc(C),ref:i&&i.ref?s&&f?$e(f)?f.concat(Oa(i)):[f,Oa(i)]:Oa(i):f,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:_,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:i&&t.type!==le?h===-1?16:h|16:h,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:y,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&Qi(t.ssContent),ssFallback:t.ssFallback&&Qi(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return y&&l&&qs(T,y.clone(T)),T}function z(t=" ",i=0){return A(tr,null,t,i)}function I(t="",i=!1){return i?(p(),nt(sn,null,t)):A(sn,null,t)}function ri(t){return t==null||typeof t=="boolean"?A(sn):$e(t)?A(le,null,t.slice()):Js(t)?Ci(t):A(tr,null,String(t))}function Ci(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:Qi(t)}function Ra(t,i){let s=0;const{shapeFlag:l}=t;if(i==null)i=null;else if($e(i))s=16;else if(typeof i=="object")if(l&65){const u=i.default;u&&(u._c&&(u._d=!1),Ra(t,u()),u._c&&(u._d=!0));return}else{s=32;const u=i._;!u&&!Mc(i)?i._ctx=an:u===3&&an&&(an.slots._===1?i._=1:(i._=2,t.patchFlag|=1024))}else if(je(i)){if(l&65){Ra(t,{default:i});return}i={default:i,_ctx:an},s=32}else i=String(i),l&64?(s=16,i=[z(i)]):s=8;t.children=i,t.shapeFlag|=s}function th(...t){const i={};for(let s=0;shn||an;let Ba,Kr;{const t=qa(),i=(s,l)=>{let u;return(u=t[s])||(u=t[s]=[]),u.push(l),f=>{u.length>1?u.forEach(h=>h(f)):u[0](f)}};Ba=i("__VUE_INSTANCE_SETTERS__",s=>hn=s),Kr=i("__VUE_SSR_SETTERS__",s=>Xs=s)}const na=t=>{const i=hn;return Ba(t),t.scope.on(),()=>{t.scope.off(),Ba(i)}},Kl=()=>{hn&&hn.scope.off(),Ba(null)};function Vc(t){return t.vnode.shapeFlag&4}let Xs=!1;function sh(t,i=!1,s=!1){i&&Kr(i);const{props:l,children:u}=t.vnode,f=Vc(t);Uf(t,l,f,i),jf(t,u,s||i);const h=f?ah(t,i):void 0;return i&&Kr(!1),h}function ah(t,i){const s=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,Pf);const{setup:l}=s;if(l){ci();const u=t.setupContext=l.length>1?lh(t):null,f=na(t),h=ta(l,t,0,[t.props,u]),_=$u(h);if(di(),f(),(_||t.sp)&&!is(t)&&bc(t),_){if(h.then(Kl,Kl),i)return h.then(y=>{Gl(t,y)}).catch(y=>{Ja(y,t,0)});t.asyncDep=h}else Gl(t,h)}else Zc(t)}function Gl(t,i,s){je(i)?t.type.__ssrInlineRender?t.ssrRender=i:t.render=i:dt(i)&&(t.setupState=nc(i)),Zc(t)}function Zc(t,i,s){const l=t.type;t.render||(t.render=l.render||ui);{const u=na(t);ci();try{Cf(t)}finally{di(),u()}}}const rh={get(t,i){return on(t,"get",""),t[i]}};function lh(t){const i=s=>{t.exposed=s||{}};return{attrs:new Proxy(t.attrs,rh),slots:t.slots,emit:t.emit,expose:i}}function nr(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(nc(Wd(t.exposed)),{get(i,s){if(s in i)return i[s];if(s in Hs)return Hs[s](t)},has(i,s){return s in i||s in Hs}})):t.proxy}function uh(t){return je(t)&&"__vccOpts"in t}const ce=(t,i)=>Jd(t,i,Xs);function ch(t,i,s){try{Fa(-1);const l=arguments.length;return l===2?dt(i)&&!$e(i)?Js(i)?A(t,null,[i]):A(t,i):A(t,null,i):(l>3?s=Array.prototype.slice.call(arguments,2):l===3&&Js(s)&&(s=[s]),A(t,i,s))}finally{Fa(1)}}const dh="3.5.39";/** -* @vue/runtime-dom v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Gr;const ql=typeof window<"u"&&window.trustedTypes;if(ql)try{Gr=ql.createPolicy("vue",{createHTML:t=>t})}catch{}const Hc=Gr?t=>Gr.createHTML(t):t=>t,fh="http://www.w3.org/2000/svg",hh="http://www.w3.org/1998/Math/MathML",Pi=typeof document<"u"?document:null,Yl=Pi&&Pi.createElement("template"),ph={insert:(t,i,s)=>{i.insertBefore(t,s||null)},remove:t=>{const i=t.parentNode;i&&i.removeChild(t)},createElement:(t,i,s,l)=>{const u=i==="svg"?Pi.createElementNS(fh,t):i==="mathml"?Pi.createElementNS(hh,t):s?Pi.createElement(t,{is:s}):Pi.createElement(t);return t==="select"&&l&&l.multiple!=null&&u.setAttribute("multiple",l.multiple),u},createText:t=>Pi.createTextNode(t),createComment:t=>Pi.createComment(t),setText:(t,i)=>{t.nodeValue=i},setElementText:(t,i)=>{t.textContent=i},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Pi.querySelector(t),setScopeId(t,i){t.setAttribute(i,"")},insertStaticContent(t,i,s,l,u,f){const h=s?s.previousSibling:i.lastChild;if(u&&(u===f||u.nextSibling))for(;i.insertBefore(u.cloneNode(!0),s),!(u===f||!(u=u.nextSibling)););else{Yl.innerHTML=Hc(l==="svg"?`${t}`:l==="mathml"?`${t}`:t);const _=Yl.content;if(l==="svg"||l==="mathml"){const y=_.firstChild;for(;y.firstChild;)_.appendChild(y.firstChild);_.removeChild(y)}i.insertBefore(_,s)}return[h?h.nextSibling:i.firstChild,s?s.previousSibling:i.lastChild]}},Gi="transition",zs="animation",Qs=Symbol("_vtc"),jc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},mh=Kt({},pc,jc),gh=t=>(t.displayName="Transition",t.props=mh,t),vh=gh((t,{slots:i})=>ch(hf,_h(t),i)),So=(t,i=[])=>{$e(t)?t.forEach(s=>s(...i)):t&&t(...i)},Jl=t=>t?$e(t)?t.some(i=>i.length>1):t.length>1:!1;function _h(t){const i={};for(const O in t)O in jc||(i[O]=t[O]);if(t.css===!1)return i;const{name:s="v",type:l,duration:u,enterFromClass:f=`${s}-enter-from`,enterActiveClass:h=`${s}-enter-active`,enterToClass:_=`${s}-enter-to`,appearFromClass:y=f,appearActiveClass:C=h,appearToClass:T=_,leaveFromClass:M=`${s}-leave-from`,leaveActiveClass:H=`${s}-leave-active`,leaveToClass:j=`${s}-leave-to`}=t,K=bh(u),F=K&&K[0],te=K&&K[1],{onBeforeEnter:X,onEnter:fe,onEnterCancelled:Se,onLeave:de,onLeaveCancelled:Fe,onBeforeAppear:Oe=X,onAppear:Te=fe,onAppearCancelled:Ze=Se}=i,he=(O,N,$,Ye)=>{O._enterCancelled=Ye,To(O,N?T:_),To(O,N?C:h),$&&$()},Q=(O,N)=>{O._isLeaving=!1,To(O,M),To(O,j),To(O,H),N&&N()},B=O=>(N,$)=>{const Ye=O?Te:fe,we=()=>he(N,O,$);So(Ye,[N,we]),Xl(()=>{To(N,O?y:f),Ti(N,O?T:_),Jl(Ye)||Ql(N,l,F,we)})};return Kt(i,{onBeforeEnter(O){So(X,[O]),Ti(O,f),Ti(O,h)},onBeforeAppear(O){So(Oe,[O]),Ti(O,y),Ti(O,C)},onEnter:B(!1),onAppear:B(!0),onLeave(O,N){O._isLeaving=!0;const $=()=>Q(O,N);Ti(O,M),O._enterCancelled?(Ti(O,H),nu(O)):(nu(O),Ti(O,H)),Xl(()=>{O._isLeaving&&(To(O,M),Ti(O,j),Jl(de)||Ql(O,l,te,$))}),So(de,[O,$])},onEnterCancelled(O){he(O,!1,void 0,!0),So(Se,[O])},onAppearCancelled(O){he(O,!0,void 0,!0),So(Ze,[O])},onLeaveCancelled(O){Q(O),So(Fe,[O])}})}function bh(t){if(t==null)return null;if(dt(t))return[Mr(t.enter),Mr(t.leave)];{const i=Mr(t);return[i,i]}}function Mr(t){return _d(t)}function Ti(t,i){i.split(/\s+/).forEach(s=>s&&t.classList.add(s)),(t[Qs]||(t[Qs]=new Set)).add(i)}function To(t,i){i.split(/\s+/).forEach(l=>l&&t.classList.remove(l));const s=t[Qs];s&&(s.delete(i),s.size||(t[Qs]=void 0))}function Xl(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let yh=0;function Ql(t,i,s,l){const u=t._endId=++yh,f=()=>{u===t._endId&&l()};if(s!=null)return setTimeout(f,s);const{type:h,timeout:_,propCount:y}=xh(t,i);if(!h)return l();const C=h+"end";let T=0;const M=()=>{t.removeEventListener(C,H),f()},H=j=>{j.target===t&&++T>=y&&M()};setTimeout(()=>{T(s[K]||"").split(", "),u=l(`${Gi}Delay`),f=l(`${Gi}Duration`),h=eu(u,f),_=l(`${zs}Delay`),y=l(`${zs}Duration`),C=eu(_,y);let T=null,M=0,H=0;i===Gi?h>0&&(T=Gi,M=h,H=f.length):i===zs?C>0&&(T=zs,M=C,H=y.length):(M=Math.max(h,C),T=M>0?h>C?Gi:zs:null,H=T?T===Gi?f.length:y.length:0);const j=T===Gi&&/\b(?:transform|all)(?:,|$)/.test(l(`${Gi}Property`).toString());return{type:T,timeout:M,propCount:H,hasTransform:j}}function eu(t,i){for(;t.lengthtu(s)+tu(t[l])))}function tu(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function nu(t){return(t?t.ownerDocument:document).body.offsetHeight}function wh(t,i,s){const l=t[Qs];l&&(i=(i?[i,...l]:[...l]).join(" ")),i==null?t.removeAttribute("class"):s?t.setAttribute("class",i):t.className=i}const Ua=Symbol("_vod"),Wc=Symbol("_vsh"),kh={name:"show",beforeMount(t,{value:i},{transition:s}){t[Ua]=t.style.display==="none"?"":t.style.display,s&&i?s.beforeEnter(t):$s(t,i)},mounted(t,{value:i},{transition:s}){s&&i&&s.enter(t)},updated(t,{value:i,oldValue:s},{transition:l}){!i!=!s&&(l?i?(l.beforeEnter(t),$s(t,!0),l.enter(t)):l.leave(t,()=>{$s(t,!1)}):$s(t,i))},beforeUnmount(t,{value:i}){$s(t,i)}};function $s(t,i){t.style.display=i?t[Ua]:"none",t[Wc]=!i}const Sh=Symbol(""),Th=/(?:^|;)\s*display\s*:/;function Ph(t,i,s){const l=t.style,u=Tt(s);let f=!1;if(s&&!u){if(i)if(Tt(i))for(const h of i.split(";")){const _=h.slice(0,h.indexOf(":")).trim();s[_]==null&&Ds(l,_,"")}else for(const h in i)s[h]==null&&Ds(l,h,"");for(const h in s){h==="display"&&(f=!0);const _=s[h];_!=null?Lh(t,h,!Tt(i)&&i?i[h]:void 0,_)||Ds(l,h,_):Ds(l,h,"")}}else if(u){if(i!==s){const h=l[Sh];h&&(s+=";"+h),l.cssText=s,f=Th.test(s)}}else i&&t.removeAttribute("style");Ua in t&&(t[Ua]=f?l.display:"",t[Wc]&&(l.display="none"))}const iu=/\s*!important$/;function Ds(t,i,s){if($e(s))s.forEach(l=>Ds(t,i,l));else if(s==null&&(s=""),i.startsWith("--"))t.setProperty(i,s);else{const l=Ch(t,i);iu.test(s)?t.setProperty(to(l),s.replace(iu,""),"important"):t[l]=s}}const ou=["Webkit","Moz","ms"],Er={};function Ch(t,i){const s=Er[i];if(s)return s;let l=Jn(i);if(l!=="filter"&&l in t)return Er[i]=l;l=Du(l);for(let u=0;uOr||($h.then(()=>Or=0),Or=Date.now());function Nh(t,i){const s=l=>{if(!l._vts)l._vts=Date.now();else if(l._vts<=s.attached)return;const u=s.value;if($e(u)){const f=l.stopImmediatePropagation;l.stopImmediatePropagation=()=>{f.call(l),l._stopped=!0};const h=u.slice(),_=[l];for(let y=0;yt.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,Dh=(t,i,s,l,u,f)=>{const h=u==="svg";i==="class"?wh(t,l,h):i==="style"?Ph(t,s,l):ja(i)?Wa(i)||Mh(t,i,s,l,f):(i[0]==="."?(i=i.slice(1),!0):i[0]==="^"?(i=i.slice(1),!1):Fh(t,i,l,h))?(ru(t,i,l),!t.tagName.includes("-")&&(i==="value"||i==="checked"||i==="selected")&&au(t,i,l,h,f,i!=="value")):t._isVueCE&&(Rh(t,i)||t._def.__asyncLoader&&(/[A-Z]/.test(i)||!Tt(l)))?ru(t,Jn(i),l,f,i):(i==="true-value"?t._trueValue=l:i==="false-value"&&(t._falseValue=l),au(t,i,l,h))};function Fh(t,i,s,l){if(l)return!!(i==="innerHTML"||i==="textContent"||i in t&&uu(i)&&je(s));if(i==="spellcheck"||i==="draggable"||i==="translate"||i==="autocorrect"||i==="sandbox"&&t.tagName==="IFRAME"||i==="form"||i==="list"&&t.tagName==="INPUT"||i==="type"&&t.tagName==="TEXTAREA")return!1;if(i==="width"||i==="height"){const u=t.tagName;if(u==="IMG"||u==="VIDEO"||u==="CANVAS"||u==="SOURCE")return!1}return uu(i)&&Tt(s)?!1:i in t}function Rh(t,i){const s=t._def.props;if(!s)return!1;const l=Jn(i);return Array.isArray(s)?s.some(u=>Jn(u)===l):Object.keys(s).some(u=>Jn(u)===l)}const eo=t=>{const i=t.props["onUpdate:modelValue"]||!1;return $e(i)?s=>Ea(i,s):i};function Bh(t){t.target.composing=!0}function cu(t){const i=t.target;i.composing&&(i.composing=!1,i.dispatchEvent(new Event("input")))}const Zn=Symbol("_assign");function du(t,i,s){return i&&(t=t.trim()),s&&(t=Ga(t)),t}const me={created(t,{modifiers:{lazy:i,trim:s,number:l}},u){t[Zn]=eo(u);const f=l||u.props&&u.props.type==="number";Mi(t,i?"change":"input",h=>{h.target.composing||t[Zn](du(t.value,s,f))}),(s||f)&&Mi(t,"change",()=>{t.value=du(t.value,s,f)}),i||(Mi(t,"compositionstart",Bh),Mi(t,"compositionend",cu),Mi(t,"change",cu))},mounted(t,{value:i}){t.value=i??""},beforeUpdate(t,{value:i,oldValue:s,modifiers:{lazy:l,trim:u,number:f}},h){if(t[Zn]=eo(h),t.composing)return;const _=(f||t.type==="number")&&!/^0\d/.test(t.value)?Ga(t.value):t.value,y=i??"";if(_===y)return;const C=t.getRootNode();(C instanceof Document||C instanceof ShadowRoot)&&C.activeElement===t&&t.type!=="range"&&(l&&i===s||u&&t.value.trim()===y)||(t.value=y)}},Va={deep:!0,created(t,i,s){t[Zn]=eo(s),Mi(t,"change",()=>{const l=t._modelValue,u=rs(t),f=t.checked,h=t[Zn];if($e(l)){const _=tl(l,u),y=_!==-1;if(f&&!y)h(l.concat(u));else if(!f&&y){const C=[...l];C.splice(_,1),h(C)}}else if(ls(l)){const _=new Set(l);f?_.add(u):_.delete(u),h(_)}else h(Kc(t,f))})},mounted:fu,beforeUpdate(t,i,s){t[Zn]=eo(s),fu(t,i,s)}};function fu(t,{value:i,oldValue:s},l){t._modelValue=i;let u;if($e(i))u=tl(i,l.props.value)>-1;else if(ls(i))u=i.has(l.props.value);else{if(i===s)return;u=Xi(i,Kc(t,!0))}t.checked!==u&&(t.checked=u)}const Uh={created(t,{value:i},s){t.checked=Xi(i,s.props.value),t[Zn]=eo(s),Mi(t,"change",()=>{t[Zn](rs(t))})},beforeUpdate(t,{value:i,oldValue:s},l){t[Zn]=eo(l),i!==s&&(t.checked=Xi(i,l.props.value))}},Ot={deep:!0,created(t,{value:i,modifiers:{number:s}},l){const u=ls(i);Mi(t,"change",()=>{const f=Array.prototype.filter.call(t.options,h=>h.selected).map(h=>s?Ga(rs(h)):rs(h));t[Zn](t.multiple?u?new Set(f):f:f[0]),t._assigning=!0,oc(()=>{t._assigning=!1})}),t[Zn]=eo(l)},mounted(t,{value:i}){hu(t,i)},beforeUpdate(t,i,s){t[Zn]=eo(s)},updated(t,{value:i}){t._assigning||hu(t,i)}};function hu(t,i){const s=t.multiple,l=$e(i);if(!(s&&!l&&!ls(i))){for(let u=0,f=t.options.length;uString(C)===String(_)):h.selected=tl(i,_)>-1}else h.selected=i.has(_);else if(Xi(rs(h),i)){t.selectedIndex!==u&&(t.selectedIndex=u);return}}!s&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function rs(t){return"_value"in t?t._value:t.value}function Kc(t,i){const s=i?"_trueValue":"_falseValue";return s in t?t[s]:i}const Vh={created(t,i,s){Aa(t,i,s,null,"created")},mounted(t,i,s){Aa(t,i,s,null,"mounted")},beforeUpdate(t,i,s,l){Aa(t,i,s,l,"beforeUpdate")},updated(t,i,s,l){Aa(t,i,s,l,"updated")}};function Zh(t,i){switch(t){case"SELECT":return Ot;case"TEXTAREA":return me;default:switch(i){case"checkbox":return Va;case"radio":return Uh;default:return me}}}function Aa(t,i,s,l,u){const h=Zh(t.tagName,s.props&&s.props.type)[u];h&&h(t,i,s,l)}const Hh=["ctrl","shift","alt","meta"],jh={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,i)=>Hh.some(s=>t[`${s}Key`]&&!i.includes(s))},hl=(t,i)=>{if(!t)return t;const s=t._withMods||(t._withMods={}),l=i.join(".");return s[l]||(s[l]=((u,...f)=>{for(let h=0;h{const s=t._withKeys||(t._withKeys={}),l=i.join(".");return s[l]||(s[l]=(u=>{if(!("key"in u))return;const f=to(u.key);if(i.some(h=>h===f||Wh[h]===f))return t(u)}))},Kh=Kt({patchProp:Dh},ph);let mu;function Gh(){return mu||(mu=Kf(Kh))}const qh=((...t)=>{const i=Gh().createApp(...t),{mount:s}=i;return i.mount=l=>{const u=Jh(l);if(!u)return;const f=i._component;!je(f)&&!f.render&&!f.template&&(f.template=u.innerHTML),u.nodeType===1&&(u.textContent="");const h=s(u,!1,Yh(u));return u instanceof Element&&(u.removeAttribute("v-cloak"),u.setAttribute("data-v-app","")),h},i});function Yh(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function Jh(t){return Tt(t)?document.querySelector(t):t}const Gc="pv_theme",gu={light:"#EEF0F3",dark:"#0B1730"},Za=typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null;function qc(){return Za&&Za.matches?"dark":"light"}function Xh(){try{return localStorage.getItem(Gc)||"light"}catch{return"light"}}function Yc(t){return t==="system"?qc():t}function Jc(t){const i=document.documentElement;i.setAttribute("data-theme",t),i.style.backgroundColor=gu[t]||gu.light}const Oo=Y(Xh()),ss=Y(Yc(Oo.value));function Ha(t){Oo.value=t;const i=Yc(t);ss.value=i,Jc(i);try{localStorage.setItem(Gc,t)}catch{}}function vu(){Ha(ss.value==="dark"?"light":"dark")}Za&&Za.addEventListener("change",()=>{if(Oo.value==="system"){const t=qc();ss.value=t,Jc(t)}});async function Qh(){try{const t=await fetch("/bff/config");return t.ok?await t.json():{apiBase:""}}catch{return{apiBase:""}}}async function _u(){try{const t=await fetch("/bff/me");return t.ok?await t.json():null}catch{return null}}async function ep(t,i,s){const l=await fetch("/bff/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,password:i,apiBase:s})});return{ok:l.ok,status:l.status,body:await l.json().catch(()=>({}))}}async function tp(){try{await fetch("/bff/logout",{method:"POST"})}catch{}}async function np(){try{const t=await fetch("/bff/devices");return t.ok?await t.json():[]}catch{return[]}}async function ip(){try{const t=await fetch("/bff/users");return t.ok?{ok:!0,status:200,users:(await t.json()).users||[]}:{ok:!1,status:t.status,users:[]}}catch{return{ok:!1,status:0,users:[]}}}async function op(t,i,s,l){const u=await fetch("/bff/users",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,password:i,role:s,organization:l})});return{ok:u.ok,status:u.status,body:await u.json().catch(()=>({}))}}async function sp(t,i){const s=await fetch(`/bff/users/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function ap(t){const i=await fetch(`/bff/users/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function rp(){try{const t=await fetch("/bff/orgs");return t.ok?{ok:!0,status:200,organizations:(await t.json()).organizations||[]}:{ok:!1,status:t.status,organizations:[]}}catch{return{ok:!1,status:0,organizations:[]}}}async function lp(t){const i=await fetch("/bff/orgs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t})});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function up(t,i){const s=await fetch(`/bff/orgs/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:i})});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function cp(t){const i=await fetch(`/bff/orgs/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function dp(){try{const t=await fetch("/bff/preferences");if(!t.ok)return null;const i=await t.json();return i&&typeof i.preferences=="object"?i.preferences:null}catch{return null}}async function fp(t){try{return(await fetch("/bff/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({preferences:t})})).ok}catch{return!1}}async function hp(){try{const t=await fetch("/bff/integrations/opensky");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function bu(t){const i=await fetch("/bff/integrations/opensky",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function pp(t){const i=t?`?bbox=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/integrations/opensky/health${i}`,{method:"POST"});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function mp(t){try{const i=t?`?bbox=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/integrations/opensky/states${i}`);if(!s.ok)return{states:[],unavailable:!0,detail:"OpenSky unavailable"};const l=await s.json();return{states:l.states||[],time:l.time,unavailable:!!l.unavailable,detail:l.detail||"",plan:l.plan||"",recommendedInterval:l.recommendedInterval||0}}catch{return{states:[],unavailable:!0,detail:"OpenSky unavailable"}}}async function gp(){try{const t=await fetch("/bff/integrations/filetransfer");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function yu(t){const i=await fetch("/bff/integrations/filetransfer",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function vp(){const t=await fetch("/bff/integrations/filetransfer/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function _p(){try{const t=await fetch("/bff/integrations/localstorage");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function Ma(t){const i=await fetch("/bff/integrations/localstorage",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function bp(){const t=await fetch("/bff/integrations/localstorage/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function yp(){try{const t=await fetch("/bff/integrations/webdav");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function xu(t){const i=await fetch("/bff/integrations/webdav",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function xp(){const t=await fetch("/bff/integrations/webdav/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function wp(){try{const t=await fetch("/bff/integrations/openweather");return t.ok?{ok:!0,status:200,body:await t.json()}:{ok:!1,status:t.status,body:await t.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function wu(t){const i=await fetch("/bff/integrations/openweather",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function kp(){const t=await fetch("/bff/integrations/openweather/health",{method:"POST"});return{ok:t.ok,status:t.status,body:await t.json().catch(()=>({}))}}async function Sp(t,i){try{const s=t!=null&&i!=null?`?lat=${encodeURIComponent(t)}&lon=${encodeURIComponent(i)}`:"",l=await fetch(`/bff/integrations/openweather/current${s}`);return l.ok?await l.json():{unavailable:!0,detail:"Weather unavailable"}}catch{return{unavailable:!0,detail:"Weather unavailable"}}}async function pl(){try{const t=await fetch("/bff/drones");return t.ok?{ok:!0,status:200,drones:(await t.json()).drones||[]}:{ok:!1,status:t.status,drones:[]}}catch{return{ok:!1,status:0,drones:[]}}}async function Tp(t){const i=await fetch("/bff/drones",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Pp(t){try{const i=await fetch("/bff/drones/auto",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}catch{return{ok:!1,status:0,body:{}}}}async function Cp(t,i){const s=await fetch(`/bff/drones/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Lp(t){const i=await fetch(`/bff/drones/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Ap(){try{const t=await fetch("/bff/flights");return t.ok?{ok:!0,status:200,flights:(await t.json()).flights||[]}:{ok:!1,status:t.status,flights:[]}}catch{return{ok:!1,status:0,flights:[]}}}async function Mp(t){const i=await fetch("/bff/flights",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}async function Ep(t,i){const s=await fetch(`/bff/flights/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Op(t){const i=await fetch(`/bff/flights/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}function zp(){return"/bff/logbook/export"}async function $p(t){try{const i=t!=null&&t!==""?`?expiring=${encodeURIComponent(t)}`:"",s=await fetch(`/bff/documents${i}`);return s.ok?{ok:!0,status:200,documents:(await s.json()).documents||[]}:{ok:!1,status:s.status,documents:[]}}catch{return{ok:!1,status:0,documents:[]}}}async function Ip(t,i){const s=new FormData;Object.entries(t).forEach(([u,f])=>{f!=null&&f!==""&&s.append(u,f)}),i&&s.append("file",i);const l=await fetch("/bff/documents",{method:"POST",body:s});return{ok:l.ok,status:l.status,body:await l.json().catch(()=>({}))}}async function Np(t,i){const s=await fetch(`/bff/documents/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return{ok:s.ok,status:s.status,body:await s.json().catch(()=>({}))}}async function Dp(t){const i=await fetch(`/bff/documents/${encodeURIComponent(t)}`,{method:"DELETE"});return{ok:i.ok,status:i.status,body:await i.json().catch(()=>({}))}}function zr(t){return`/bff/documents/${encodeURIComponent(t)}/file`}function Fp(t){return`/bff/documents/${encodeURIComponent(t)}/file?inline=1`}async function Rp(t,i,s){const l=await fetch(`/bff/devices/${encodeURIComponent(t)}/command`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:i,payload:s})});return{ok:l.ok,body:await l.json().catch(()=>({}))}}const Xc="pv_prefs",qr={name:"",username:"",displayName:"",bio:"",avatar:"",showEmail:!1,fontSize:"md",language:"en",region:"US",dateFormat:"MDY",timeFormat:"24",reduceMotion:!1,showAirTraffic:!0,autoBbox:!0,airTrafficInterval:"auto",twoFactor:!1};function Bp(){try{return{...qr,...JSON.parse(localStorage.getItem(Xc)||"{}")||{}}}catch{return{...qr}}}const be=gt(Bp());function Qc(){try{localStorage.setItem(Xc,JSON.stringify(be))}catch{}}function ed(t){if(!t||typeof t!="object")return!1;for(const i of Object.keys(qr))i in t&&(be[i]=t[i]);return!0}const Up={sm:15,md:16,lg:18};function ml(t){document.documentElement.style.fontSize=(Up[t]||16)+"px"}function gl(t){document.documentElement.classList.toggle("reduce-motion",!!t)}function td(t){const i=new Date(t),s=i.getFullYear(),l=String(i.getMonth()+1).padStart(2,"0"),u=String(i.getDate()).padStart(2,"0");let f;switch(be.dateFormat){case"DMY":f=`${u}/${l}/${s}`;break;case"YMD":f=`${s}/${l}/${u}`;break;case"ISO":f=`${s}-${l}-${u}`;break;default:f=`${l}/${u}/${s}`}let h;return be.timeFormat==="12"?h=i.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0}):h=`${String(i.getHours()).padStart(2,"0")}:${String(i.getMinutes()).padStart(2,"0")}:${String(i.getSeconds()).padStart(2,"0")}`,{date:f,time:h}}function ku(t){return td(t).time}function Su(t){const i=td(t);return`${i.date} ${i.time}`}let vl=!1,Yr=!1,Jr=null;function Vp(){return{...JSON.parse(JSON.stringify(be)),themeMode:Oo.value}}function _l(){!vl||Yr||(clearTimeout(Jr),Jr=setTimeout(()=>{fp(Vp())},600))}function Zp(t){Yr=!0;try{ed(t),t.themeMode&&Ha(t.themeMode),ml(be.fontSize),gl(be.reduceMotion),Qc()}finally{Yr=!1}}async function Tu(){vl=!0;const t=await dp();t&&Object.keys(t).length?Zp(t):_l()}function Hp(){vl=!1,clearTimeout(Jr)}Bt(be,()=>{Qc(),_l()},{deep:!0});Bt(Oo,_l);Bt(()=>be.fontSize,ml,{immediate:!0});Bt(()=>be.reduceMotion,gl,{immediate:!0});const jp=["width","height"],nd={__name:"BrandMark",props:{size:{type:[Number,String],default:28}},setup(t){return(i,s)=>(p(),m("svg",{width:t.size,height:t.size,viewBox:"0 0 48 48",fill:"none","aria-hidden":"true"},[...s[0]||(s[0]=[a("g",{"stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"},[a("polyline",{points:"8,30 19,17 30,30",stroke:"var(--accent)"}),a("polyline",{points:"18,33 29,20 40,33",stroke:"currentColor"})],-1)])],8,jp))}},Wp=["title","aria-label"],Kp={key:0,width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Gp={key:1,width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},qp={__name:"ThemeToggle",setup(t){return(i,s)=>(p(),m("button",{class:"btn-icon",type:"button",title:Ee(ss)==="dark"?"Switch to light":"Switch to dark","aria-label":Ee(ss)==="dark"?"Switch to light theme":"Switch to dark theme",onClick:s[0]||(s[0]=(...l)=>Ee(vu)&&Ee(vu)(...l))},[Ee(ss)==="dark"?(p(),m("svg",Kp,[...s[1]||(s[1]=[a("circle",{cx:"12",cy:"12",r:"4"},null,-1),a("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"},null,-1)])])):(p(),m("svg",Gp,[...s[2]||(s[2]=[a("path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"},null,-1)])]))],8,Wp))}},Yp={class:"relative grid h-full place-items-center p-5"},Jp={class:"absolute right-5 top-5"},Xp={class:"mb-6 flex items-center gap-3 text-ink"},Qp={class:"relative mb-1"},em=["type"],tm=["aria-label","title"],nm={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-[18px] w-[18px]"},im={key:1,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-[18px] w-[18px]"},om={key:0,class:"mt-4"},sm={key:1,class:"mt-4 rounded border border-line bg-danger-soft px-3 py-2 text-sm text-danger-fg"},am=["disabled"],rm={__name:"LoginView",props:{defaultApiBase:{type:String,default:""}},emits:["signed-in"],setup(t,{emit:i}){const s=t,l=i,u=Y(""),f=Y(""),h=Y(localStorage.getItem("api_url")||s.defaultApiBase||"http://localhost:8080"),_=Y(!1),y=Y(!1),C=Y(!1),T=Y("");async function M(){C.value=!0,T.value="",localStorage.setItem("api_url",h.value.trim());const{ok:H,status:j,body:K}=await ep(u.value.trim(),f.value,h.value.trim());if(C.value=!1,H){l("signed-in",K.email);return}T.value=j===400?"Invalid email or password.":j===502?"API server can't reach PocketBase.":K.message||K.error||"Cannot reach the API server."}return(H,j)=>(p(),m("div",Yp,[a("div",Jp,[A(qp)]),a("form",{class:"panel w-[380px] p-8 shadow-md",onSubmit:hl(M,["prevent"])},[a("div",Xp,[A(nd,{size:34}),j[5]||(j[5]=a("div",{class:"leading-tight"},[a("div",{class:"text-mode"},"PilotVault"),a("div",{class:"eyebrow mt-0.5"},"Control panel")],-1))]),j[9]||(j[9]=a("label",{class:"eyebrow mb-1.5 block"},"Email",-1)),ie(a("input",{"onUpdate:modelValue":j[0]||(j[0]=K=>u.value=K),type:"email",autocomplete:"username",required:"",class:"field mb-4",placeholder:"you@example.com"},null,512),[[me,u.value]]),j[10]||(j[10]=a("label",{class:"eyebrow mb-1.5 block"},"Password",-1)),a("div",Qp,[ie(a("input",{"onUpdate:modelValue":j[1]||(j[1]=K=>f.value=K),type:y.value?"text":"password",autocomplete:"current-password",required:"",class:"field w-full pr-10",placeholder:"••••••••"},null,8,em),[[Vh,f.value]]),a("button",{type:"button",class:"absolute inset-y-0 right-0 grid w-10 place-items-center text-ink-muted transition hover:text-ink-secondary","aria-label":y.value?"Hide password":"Show password",title:y.value?"Hide password":"Show password",onClick:j[2]||(j[2]=K=>y.value=!y.value)},[y.value?(p(),m("svg",nm,[...j[6]||(j[6]=[a("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"},null,-1),a("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1)])])):(p(),m("svg",im,[...j[7]||(j[7]=[a("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1),a("circle",{cx:"12",cy:"12",r:"3"},null,-1)])]))],8,tm)]),_.value?(p(),m("div",om,[j[8]||(j[8]=a("label",{class:"eyebrow mb-1.5 block"},"API Server",-1)),ie(a("input",{"onUpdate:modelValue":j[3]||(j[3]=K=>h.value=K),type:"text",class:"field font-mono",placeholder:"10.2.1.101:8080"},null,512),[[me,h.value]])])):I("",!0),T.value?(p(),m("p",sm,w(T.value),1)):I("",!0),a("button",{type:"submit",class:"btn-accent mt-6 w-full",disabled:C.value},w(C.value?"Signing in…":"Sign in"),9,am),a("button",{type:"button",class:"mx-auto mt-3 block text-xs text-ink-muted transition hover:text-ink-secondary",onClick:j[4]||(j[4]=K=>_.value=!_.value)},w(_.value?"Hide server settings":"Server settings"),1)],32)]))}};function lm(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Fs={exports:{}};/* @preserve - * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com - * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade - */var um=Fs.exports,Pu;function cm(){return Pu||(Pu=1,(function(t,i){(function(s,l){l(i)})(um,(function(s){var l="1.9.4";function u(e){var n,o,r,d;for(o=1,r=arguments.length;o"u"||!L||!L.Mixin)){e=Se(e)?e:[e];for(var n=0;n0?Math.floor(e):Math.ceil(e)};ue.prototype={clone:function(){return new ue(this.x,this.y)},add:function(e){return this.clone()._add(pe(e))},_add:function(e){return this.x+=e.x,this.y+=e.y,this},subtract:function(e){return this.clone()._subtract(pe(e))},_subtract:function(e){return this.x-=e.x,this.y-=e.y,this},divideBy:function(e){return this.clone()._divideBy(e)},_divideBy:function(e){return this.x/=e,this.y/=e,this},multiplyBy:function(e){return this.clone()._multiplyBy(e)},_multiplyBy:function(e){return this.x*=e,this.y*=e,this},scaleBy:function(e){return new ue(this.x*e.x,this.y*e.y)},unscaleBy:function(e){return new ue(this.x/e.x,this.y/e.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=ft(this.x),this.y=ft(this.y),this},distanceTo:function(e){e=pe(e);var n=e.x-this.x,o=e.y-this.y;return Math.sqrt(n*n+o*o)},equals:function(e){return e=pe(e),e.x===this.x&&e.y===this.y},contains:function(e){return e=pe(e),Math.abs(e.x)<=Math.abs(this.x)&&Math.abs(e.y)<=Math.abs(this.y)},toString:function(){return"Point("+H(this.x)+", "+H(this.y)+")"}};function pe(e,n,o){return e instanceof ue?e:Se(e)?new ue(e[0],e[1]):e==null?e:typeof e=="object"&&"x"in e&&"y"in e?new ue(e.x,e.y):new ue(e,n,o)}function Ue(e,n){if(e)for(var o=n?[e,n]:e,r=0,d=o.length;r=this.min.x&&o.x<=this.max.x&&n.y>=this.min.y&&o.y<=this.max.y},intersects:function(e){e=Ve(e);var n=this.min,o=this.max,r=e.min,d=e.max,v=d.x>=n.x&&r.x<=o.x,P=d.y>=n.y&&r.y<=o.y;return v&&P},overlaps:function(e){e=Ve(e);var n=this.min,o=this.max,r=e.min,d=e.max,v=d.x>n.x&&r.xn.y&&r.y=n.lat&&d.lat<=o.lat&&r.lng>=n.lng&&d.lng<=o.lng},intersects:function(e){e=st(e);var n=this._southWest,o=this._northEast,r=e.getSouthWest(),d=e.getNorthEast(),v=d.lat>=n.lat&&r.lat<=o.lat,P=d.lng>=n.lng&&r.lng<=o.lng;return v&&P},overlaps:function(e){e=st(e);var n=this._southWest,o=this._northEast,r=e.getSouthWest(),d=e.getNorthEast(),v=d.lat>n.lat&&r.latn.lng&&r.lng1,jn=(function(){var e=!1;try{var n=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("testPassiveEventSupport",M,n),window.removeEventListener("testPassiveEventSupport",M,n)}catch{}return e})(),U=(function(){return!!document.createElement("canvas").getContext})(),E=!!(document.createElementNS&&W("svg").createSVGRect),Me=!!E&&(function(){var e=document.createElement("div");return e.innerHTML="",(e.firstChild&&e.firstChild.namespaceURI)==="http://www.w3.org/2000/svg"})(),tt=!E&&(function(){try{var e=document.createElement("div");e.innerHTML='';var n=e.firstChild;return n.style.behavior="url(#default#VML)",n&&typeof n.adj=="object"}catch{return!1}})(),It=navigator.platform.indexOf("Mac")===0,St=navigator.platform.indexOf("Linux")===0;function Et(e){return navigator.userAgent.toLowerCase().indexOf(e)>=0}var Z={ie:re,ielt9:ae,edge:oe,webkit:ee,android:ve,android23:se,androidStock:Pe,opera:Re,chrome:Ke,gecko:Ge,safari:pt,phantom:ht,opera12:Vt,win:Jt,ie3d:Zt,webkit3d:pn,gecko3d:Ct,any3d:$t,mobile:kn,mobileWebkit:zi,mobileWebkit3d:at,msPointer:Sn,pointer:$i,touch:hi,touchNative:rt,mobileOpera:pi,mobileGecko:Ii,retina:Gt,passiveEvents:jn,canvas:U,svg:E,vml:tt,inlineSvg:Me,mac:It,linux:St},_t=Z.msPointer?"MSPointerDown":"pointerdown",bt=Z.msPointer?"MSPointerMove":"pointermove",oa=Z.msPointer?"MSPointerUp":"pointerup",cs=Z.msPointer?"MSPointerCancel":"pointercancel",no={touchstart:_t,touchmove:bt,touchend:oa,touchcancel:cs},sa={touchstart:ds,touchmove:Wn,touchend:Wn,touchcancel:Wn},Ni={},aa=!1;function ir(e,n,o){return n==="touchstart"&<(),sa[n]?(o=sa[n].bind(this,o),e.addEventListener(no[n],o,!1),o):(console.warn("wrong event specified:",n),M)}function ra(e,n,o){if(!no[n]){console.warn("wrong event specified:",n);return}e.removeEventListener(no[n],o,!1)}function or(e){Ni[e.pointerId]=e}function sr(e){Ni[e.pointerId]&&(Ni[e.pointerId]=e)}function la(e){delete Ni[e.pointerId]}function lt(){aa||(document.addEventListener(_t,or,!0),document.addEventListener(bt,sr,!0),document.addEventListener(oa,la,!0),document.addEventListener(cs,la,!0),aa=!0)}function Wn(e,n){if(n.pointerType!==(n.MSPOINTER_TYPE_MOUSE||"mouse")){n.touches=[];for(var o in Ni)n.touches.push(Ni[o]);n.changedTouches=[n],e(n)}}function ds(e,n){n.MSPOINTER_TYPE_TOUCH&&n.pointerType===n.MSPOINTER_TYPE_TOUCH&&Ft(n),Wn(e,n)}function Xt(e){var n={},o,r;for(r in e)o=e[r],n[r]=o&&o.bind?o.bind(e):o;return e=n,n.type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}var io=200;function zo(e,n){e.addEventListener("dblclick",n);var o=0,r;function d(v){if(v.detail!==1){r=v.detail;return}if(!(v.pointerType==="mouse"||v.sourceCapabilities&&!v.sourceCapabilities.firesTouchEvents)){var P=da(v);if(!(P.some(function(R){return R instanceof HTMLLabelElement&&R.attributes.for})&&!P.some(function(R){return R instanceof HTMLInputElement||R instanceof HTMLSelectElement}))){var D=Date.now();D-o<=io?(r++,r===2&&n(Xt(v))):r=1,o=D}}}return e.addEventListener("click",d),{dblclick:n,simDblclick:d}}function $o(e,n){e.removeEventListener("dblclick",n.dblclick),e.removeEventListener("click",n.simDblclick)}var Tn=Fo(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),$n=Fo(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ua=$n==="webkitTransition"||$n==="OTransition"?$n+"End":"transitionend";function Io(e){return typeof e=="string"?document.getElementById(e):e}function mi(e,n){var o=e.style[n]||e.currentStyle&&e.currentStyle[n];if((!o||o==="auto")&&document.defaultView){var r=document.defaultView.getComputedStyle(e,null);o=r?r[n]:null}return o==="auto"?null:o}function it(e,n,o){var r=document.createElement(e);return r.className=n||"",o&&o.appendChild(r),r}function ot(e){var n=e.parentNode;n&&n.removeChild(e)}function Pn(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function Cn(e){var n=e.parentNode;n&&n.lastChild!==e&&n.appendChild(e)}function qt(e){var n=e.parentNode;n&&n.firstChild!==e&&n.insertBefore(e,n.firstChild)}function No(e,n){if(e.classList!==void 0)return e.classList.contains(n);var o=Do(e);return o.length>0&&new RegExp("(^|\\s)"+n+"(\\s|$)").test(o)}function He(e,n){if(e.classList!==void 0)for(var o=K(n),r=0,d=o.length;r0?2*window.devicePixelRatio:1;function fa(e){return Z.edge?e.wheelDeltaY/2:e.deltaY&&e.deltaMode===0?-e.deltaY/vs:e.deltaY&&e.deltaMode===1?-e.deltaY*20:e.deltaY&&e.deltaMode===2?-e.deltaY*60:e.deltaX||e.deltaZ?0:e.wheelDelta?(e.wheelDeltaY||e.wheelDelta)/2:e.detail&&Math.abs(e.detail)<32765?-e.detail*20:e.detail?e.detail/-32765*60:0}function Ae(e,n){var o=n.relatedTarget;if(!o)return!0;try{for(;o&&o!==e;)o=o.parentNode}catch{return!1}return o!==e}var Vi={__proto__:null,on:ze,off:Je,stopPropagation:_i,disableScrollPropagation:gs,disableClickPropagation:Bi,preventDefault:Ft,stop:bi,getPropagationPath:da,getMousePosition:Ui,getWheelDelta:fa,isExternalTarget:Ae,addListener:ze,removeListener:Je},so=ge.extend({run:function(e,n,o,r){this.stop(),this._el=e,this._inProgress=!0,this._duration=o||.25,this._easeOutPower=1/Math.max(r||.5,.2),this._startPos=Xe(e),this._offset=n.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=B(this._animate,this),this._step()},_step:function(e){var n=+new Date-this._startTime,o=this._duration*1e3;nthis.options.maxZoom)?this.setZoom(e):this},panInsideBounds:function(e,n){this._enforcingBounds=!0;var o=this.getCenter(),r=this._limitCenter(o,this._zoom,st(e));return o.equals(r)||this.panTo(r,n),this._enforcingBounds=!1,this},panInside:function(e,n){n=n||{};var o=pe(n.paddingTopLeft||n.padding||[0,0]),r=pe(n.paddingBottomRight||n.padding||[0,0]),d=this.project(this.getCenter()),v=this.project(e),P=this.getPixelBounds(),D=Ve([P.min.add(o),P.max.subtract(r)]),R=D.getSize();if(!D.contains(v)){this._enforcingBounds=!0;var ne=v.subtract(D.getCenter()),_e=D.extend(v).getSize().subtract(R);d.x+=ne.x<0?-_e.x:_e.x,d.y+=ne.y<0?-_e.y:_e.y,this.panTo(this.unproject(d),n),this._enforcingBounds=!1}return this},invalidateSize:function(e){if(!this._loaded)return this;e=u({animate:!1,pan:!0},e===!0?{animate:!0}:e);var n=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),r=n.divideBy(2).round(),d=o.divideBy(2).round(),v=r.subtract(d);return!v.x&&!v.y?this:(e.animate&&e.pan?this.panBy(v):(e.pan&&this._rawPanBy(v),this.fire("move"),e.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(h(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:n,newSize:o}))},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(e){if(e=this._locateOptions=u({timeout:1e4,watch:!1},e),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var n=h(this._handleGeolocationResponse,this),o=h(this._handleGeolocationError,this);return e.watch?this._locationWatchId=navigator.geolocation.watchPosition(n,o,e):navigator.geolocation.getCurrentPosition(n,o,e),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(e){if(this._container._leaflet_id){var n=e.code,o=e.message||(n===1?"permission denied":n===2?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:n,message:"Geolocation error: "+o+"."})}},_handleGeolocationResponse:function(e){if(this._container._leaflet_id){var n=e.coords.latitude,o=e.coords.longitude,r=new Le(n,o),d=r.toBounds(e.coords.accuracy*2),v=this._locateOptions;if(v.setView){var P=this.getBoundsZoom(d);this.setView(r,v.maxZoom?Math.min(P,v.maxZoom):P)}var D={latlng:r,bounds:d,timestamp:e.timestamp};for(var R in e.coords)typeof e.coords[R]=="number"&&(D[R]=e.coords[R]);this.fire("locationfound",D)}},addHandler:function(e,n){if(!n)return this;var o=this[e]=new n(this);return this._handlers.push(o),this.options[e]&&o.enable(),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch{this._container._leaflet_id=void 0,this._containerId=void 0}this._locationWatchId!==void 0&&this.stopLocate(),this._stop(),ot(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(O(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload");var e;for(e in this._layers)this._layers[e].remove();for(e in this._panes)ot(this._panes[e]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(e,n){var o="leaflet-pane"+(e?" leaflet-"+e.replace("Pane","")+"-pane":""),r=it("div",o,n||this._mapPane);return e&&(this._panes[e]=r),r},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var e=this.getPixelBounds(),n=this.unproject(e.getBottomLeft()),o=this.unproject(e.getTopRight());return new wt(n,o)},getMinZoom:function(){return this.options.minZoom===void 0?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===void 0?this._layersMaxZoom===void 0?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(e,n,o){e=st(e),o=pe(o||[0,0]);var r=this.getZoom()||0,d=this.getMinZoom(),v=this.getMaxZoom(),P=e.getNorthWest(),D=e.getSouthEast(),R=this.getSize().subtract(o),ne=Ve(this.project(D,r),this.project(P,r)).getSize(),_e=Z.any3d?this.options.zoomSnap:1,Ne=R.x/ne.x,et=R.y/ne.y,un=n?Math.max(Ne,et):Math.min(Ne,et);return r=this.getScaleZoom(un,r),_e&&(r=Math.round(r/(_e/100))*(_e/100),r=n?Math.ceil(r/_e)*_e:Math.floor(r/_e)*_e),Math.max(d,Math.min(v,r))},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new ue(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(e,n){var o=this._getTopLeftPoint(e,n);return new Ue(o,o.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(e){return this.options.crs.getProjectedBounds(e===void 0?this.getZoom():e)},getPane:function(e){return typeof e=="string"?this._panes[e]:e},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(e,n){var o=this.options.crs;return n=n===void 0?this._zoom:n,o.scale(e)/o.scale(n)},getScaleZoom:function(e,n){var o=this.options.crs;n=n===void 0?this._zoom:n;var r=o.zoom(e*o.scale(n));return isNaN(r)?1/0:r},project:function(e,n){return n=n===void 0?this._zoom:n,this.options.crs.latLngToPoint(De(e),n)},unproject:function(e,n){return n=n===void 0?this._zoom:n,this.options.crs.pointToLatLng(pe(e),n)},layerPointToLatLng:function(e){var n=pe(e).add(this.getPixelOrigin());return this.unproject(n)},latLngToLayerPoint:function(e){var n=this.project(De(e))._round();return n._subtract(this.getPixelOrigin())},wrapLatLng:function(e){return this.options.crs.wrapLatLng(De(e))},wrapLatLngBounds:function(e){return this.options.crs.wrapLatLngBounds(st(e))},distance:function(e,n){return this.options.crs.distance(De(e),De(n))},containerPointToLayerPoint:function(e){return pe(e).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(e){return pe(e).add(this._getMapPanePos())},containerPointToLatLng:function(e){var n=this.containerPointToLayerPoint(pe(e));return this.layerPointToLatLng(n)},latLngToContainerPoint:function(e){return this.layerPointToContainerPoint(this.latLngToLayerPoint(De(e)))},mouseEventToContainerPoint:function(e){return Ui(e,this._container)},mouseEventToLayerPoint:function(e){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e))},mouseEventToLatLng:function(e){return this.layerPointToLatLng(this.mouseEventToLayerPoint(e))},_initContainer:function(e){var n=this._container=Io(e);if(n){if(n._leaflet_id)throw new Error("Map container is already initialized.")}else throw new Error("Map container not found.");ze(n,"scroll",this._onScroll,this),this._containerId=y(n)},_initLayout:function(){var e=this._container;this._fadeAnimated=this.options.fadeAnimation&&Z.any3d,He(e,"leaflet-container"+(Z.touch?" leaflet-touch":"")+(Z.retina?" leaflet-retina":"")+(Z.ielt9?" leaflet-oldie":"")+(Z.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var n=mi(e,"position");n!=="absolute"&&n!=="relative"&&n!=="fixed"&&n!=="sticky"&&(e.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var e=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Mt(this._mapPane,new ue(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(He(e.markerPane,"leaflet-zoom-hide"),He(e.shadowPane,"leaflet-zoom-hide"))},_resetView:function(e,n,o){Mt(this._mapPane,new ue(0,0));var r=!this._loaded;this._loaded=!0,n=this._limitZoom(n),this.fire("viewprereset");var d=this._zoom!==n;this._moveStart(d,o)._move(e,n)._moveEnd(d),this.fire("viewreset"),r&&this.fire("load")},_moveStart:function(e,n){return e&&this.fire("zoomstart"),n||this.fire("movestart"),this},_move:function(e,n,o,r){n===void 0&&(n=this._zoom);var d=this._zoom!==n;return this._zoom=n,this._lastCenter=e,this._pixelOrigin=this._getNewPixelOrigin(e),r?o&&o.pinch&&this.fire("zoom",o):((d||o&&o.pinch)&&this.fire("zoom",o),this.fire("move",o)),this},_moveEnd:function(e){return e&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return O(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(e){Mt(this._mapPane,this._getMapPanePos().subtract(e))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){this._targets={},this._targets[y(this._container)]=this;var n=e?Je:ze;n(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&n(window,"resize",this._onResize,this),Z.any3d&&this.options.transform3DLimit&&(e?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){O(this._resizeRequest),this._resizeRequest=B(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var e=this._getMapPanePos();Math.max(Math.abs(e.x),Math.abs(e.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(e,n){for(var o=[],r,d=n==="mouseout"||n==="mouseover",v=e.target||e.srcElement,P=!1;v;){if(r=this._targets[y(v)],r&&(n==="click"||n==="preclick")&&this._draggableMoved(r)){P=!0;break}if(r&&r.listens(n,!0)&&(d&&!Ae(v,e)||(o.push(r),d))||v===this._container)break;v=v.parentNode}return!o.length&&!P&&!d&&this.listens(n,!0)&&(o=[this]),o},_isClickDisabled:function(e){for(;e&&e!==this._container;){if(e._leaflet_disable_click)return!0;e=e.parentNode}},_handleDOMEvent:function(e){var n=e.target||e.srcElement;if(!(!this._loaded||n._leaflet_disable_events||e.type==="click"&&this._isClickDisabled(n))){var o=e.type;o==="mousedown"&&Ro(n),this._fireDOMEvent(e,o)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(e,n,o){if(e.type==="click"){var r=u({},e);r.type="preclick",this._fireDOMEvent(r,r.type,o)}var d=this._findEventTargets(e,n);if(o){for(var v=[],P=0;P0?Math.round(e-n)/2:Math.max(0,Math.ceil(e))-Math.max(0,Math.floor(n))},_limitZoom:function(e){var n=this.getMinZoom(),o=this.getMaxZoom(),r=Z.any3d?this.options.zoomSnap:1;return r&&(e=Math.round(e/r)*r),Math.max(n,Math.min(o,e))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){Lt(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(e,n){var o=this._getCenterOffset(e)._trunc();return(n&&n.animate)!==!0&&!this.getSize().contains(o)?!1:(this.panBy(o,n),!0)},_createAnimProxy:function(){var e=this._proxy=it("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(e),this.on("zoomanim",function(n){var o=Tn,r=this._proxy.style[o];gi(this._proxy,this.project(n.center,n.zoom),this.getZoomScale(n.zoom,1)),r===this._proxy.style[o]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ot(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var e=this.getCenter(),n=this.getZoom();gi(this._proxy,this.project(e,n),this.getZoomScale(n,1))},_catchTransitionEnd:function(e){this._animatingZoom&&e.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(e,n,o){if(this._animatingZoom)return!0;if(o=o||{},!this._zoomAnimated||o.animate===!1||this._nothingToAnimate()||Math.abs(n-this._zoom)>this.options.zoomAnimationThreshold)return!1;var r=this.getZoomScale(n),d=this._getCenterOffset(e)._divideBy(1-1/r);return o.animate!==!0&&!this.getSize().contains(d)?!1:(B(function(){this._moveStart(!0,o.noMoveStart||!1)._animateZoom(e,n,!0)},this),!0)},_animateZoom:function(e,n,o,r){this._mapPane&&(o&&(this._animatingZoom=!0,this._animateToCenter=e,this._animateToZoom=n,He(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:e,zoom:n,noUpdate:r}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(h(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&Lt(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Vo(e,n){return new qe(e,n)}var en=$.extend({options:{position:"topright"},initialize:function(e){F(this,e)},getPosition:function(){return this.options.position},setPosition:function(e){var n=this._map;return n&&n.removeControl(this),this.options.position=e,n&&n.addControl(this),this},getContainer:function(){return this._container},addTo:function(e){this.remove(),this._map=e;var n=this._container=this.onAdd(e),o=this.getPosition(),r=e._controlCorners[o];return He(n,"leaflet-control"),o.indexOf("bottom")!==-1?r.insertBefore(n,r.firstChild):r.appendChild(n),this._map.on("unload",this.remove,this),this},remove:function(){return this._map?(ot(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null,this):this},_refocusOnMap:function(e){this._map&&e&&e.screenX>0&&e.screenY>0&&this._map.getContainer().focus()}}),ln=function(e){return new en(e)};qe.include({addControl:function(e){return e.addTo(this),this},removeControl:function(e){return e.remove(),this},_initControlPos:function(){var e=this._controlCorners={},n="leaflet-",o=this._controlContainer=it("div",n+"control-container",this._container);function r(d,v){var P=n+d+" "+n+v;e[d+v]=it("div",P,o)}r("top","left"),r("top","right"),r("bottom","left"),r("bottom","right")},_clearControlPos:function(){for(var e in this._controlCorners)ot(this._controlCorners[e]);ot(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var yi=en.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(e,n,o,r){return o1,this._baseLayersList.style.display=e?"":"none"),this._separator.style.display=n&&e?"":"none",this},_onLayerChange:function(e){this._handlingClick||this._update();var n=this._getLayer(y(e.target)),o=n.overlay?e.type==="add"?"overlayadd":"overlayremove":e.type==="add"?"baselayerchange":null;o&&this._map.fire(o,n)},_createRadioElement:function(e,n){var o='",r=document.createElement("div");return r.innerHTML=o,r.firstChild},_addItem:function(e){var n=document.createElement("label"),o=this._map.hasLayer(e.layer),r;e.overlay?(r=document.createElement("input"),r.type="checkbox",r.className="leaflet-control-layers-selector",r.defaultChecked=o):r=this._createRadioElement("leaflet-base-layers_"+y(this),o),this._layerControlInputs.push(r),r.layerId=y(e.layer),ze(r,"click",this._onInputClick,this);var d=document.createElement("span");d.innerHTML=" "+e.name;var v=document.createElement("span");n.appendChild(v),v.appendChild(r),v.appendChild(d);var P=e.overlay?this._overlaysList:this._baseLayersList;return P.appendChild(n),this._checkDisabledLayers(),n},_onInputClick:function(){if(!this._preventClick){var e=this._layerControlInputs,n,o,r=[],d=[];this._handlingClick=!0;for(var v=e.length-1;v>=0;v--)n=e[v],o=this._getLayer(n.layerId).layer,n.checked?r.push(o):n.checked||d.push(o);for(v=0;v=0;d--)n=e[d],o=this._getLayer(n.layerId).layer,n.disabled=o.options.minZoom!==void 0&&ro.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var e=this._section;this._preventClick=!0,ze(e,"click",Ft),this.expand();var n=this;setTimeout(function(){Je(e,"click",Ft),n._preventClick=!1})}}),ao=function(e,n,o){return new yi(e,n,o)},Zo=en.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(e){var n="leaflet-control-zoom",o=it("div",n+" leaflet-bar"),r=this.options;return this._zoomInButton=this._createButton(r.zoomInText,r.zoomInTitle,n+"-in",o,this._zoomIn),this._zoomOutButton=this._createButton(r.zoomOutText,r.zoomOutTitle,n+"-out",o,this._zoomOut),this._updateDisabled(),e.on("zoomend zoomlevelschange",this._updateDisabled,this),o},onRemove:function(e){e.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(e){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(e.shiftKey?3:1))},_createButton:function(e,n,o,r,d){var v=it("a",o,r);return v.innerHTML=e,v.href="#",v.title=n,v.setAttribute("role","button"),v.setAttribute("aria-label",n),Bi(v),ze(v,"click",bi),ze(v,"click",d,this),ze(v,"click",this._refocusOnMap,this),v},_updateDisabled:function(){var e=this._map,n="leaflet-disabled";Lt(this._zoomInButton,n),Lt(this._zoomOutButton,n),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),(this._disabled||e._zoom===e.getMinZoom())&&(He(this._zoomOutButton,n),this._zoomOutButton.setAttribute("aria-disabled","true")),(this._disabled||e._zoom===e.getMaxZoom())&&(He(this._zoomInButton,n),this._zoomInButton.setAttribute("aria-disabled","true"))}});qe.mergeOptions({zoomControl:!0}),qe.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Zo,this.addControl(this.zoomControl))});var _s=function(e){return new Zo(e)},Ho=en.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(e){var n="leaflet-control-scale",o=it("div",n),r=this.options;return this._addScales(r,n+"-line",o),e.on(r.updateWhenIdle?"moveend":"move",this._update,this),e.whenReady(this._update,this),o},onRemove:function(e){e.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(e,n,o){e.metric&&(this._mScale=it("div",n,o)),e.imperial&&(this._iScale=it("div",n,o))},_update:function(){var e=this._map,n=e.getSize().y/2,o=e.distance(e.containerPointToLatLng([0,n]),e.containerPointToLatLng([this.options.maxWidth,n]));this._updateScales(o)},_updateScales:function(e){this.options.metric&&e&&this._updateMetric(e),this.options.imperial&&e&&this._updateImperial(e)},_updateMetric:function(e){var n=this._getRoundNum(e),o=n<1e3?n+" m":n/1e3+" km";this._updateScale(this._mScale,o,n/e)},_updateImperial:function(e){var n=e*3.2808399,o,r,d;n>5280?(o=n/5280,r=this._getRoundNum(o),this._updateScale(this._iScale,r+" mi",r/o)):(d=this._getRoundNum(n),this._updateScale(this._iScale,d+" ft",d/n))},_updateScale:function(e,n,o){e.style.width=Math.round(this.options.maxWidth*o)+"px",e.innerHTML=n},_getRoundNum:function(e){var n=Math.pow(10,(Math.floor(e)+"").length-1),o=e/n;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,n*o}}),ar=function(e){return new Ho(e)},gn='',Zi=en.extend({options:{position:"bottomright",prefix:''+(Z.inlineSvg?gn+" ":"")+"Leaflet"},initialize:function(e){F(this,e),this._attributions={}},onAdd:function(e){e.attributionControl=this,this._container=it("div","leaflet-control-attribution"),Bi(this._container);for(var n in e._layers)e._layers[n].getAttribution&&this.addAttribution(e._layers[n].getAttribution());return this._update(),e.on("layeradd",this._addAttribution,this),this._container},onRemove:function(e){e.off("layeradd",this._addAttribution,this)},_addAttribution:function(e){e.layer.getAttribution&&(this.addAttribution(e.layer.getAttribution()),e.layer.once("remove",function(){this.removeAttribution(e.layer.getAttribution())},this))},setPrefix:function(e){return this.options.prefix=e,this._update(),this},addAttribution:function(e){return e?(this._attributions[e]||(this._attributions[e]=0),this._attributions[e]++,this._update(),this):this},removeAttribution:function(e){return e?(this._attributions[e]&&(this._attributions[e]--,this._update()),this):this},_update:function(){if(this._map){var e=[];for(var n in this._attributions)this._attributions[n]&&e.push(n);var o=[];this.options.prefix&&o.push(this.options.prefix),e.length&&o.push(e.join(", ")),this._container.innerHTML=o.join(' ')}}});qe.mergeOptions({attributionControl:!0}),qe.addInitHook(function(){this.options.attributionControl&&new Zi().addTo(this)});var ha=function(e){return new Zi(e)};en.Layers=yi,en.Zoom=Zo,en.Scale=Ho,en.Attribution=Zi,ln.layers=ao,ln.zoom=_s,ln.scale=ar,ln.attribution=ha;var An=$.extend({initialize:function(e){this._map=e},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});An.addTo=function(e,n){return e.addHandler(n,this),this};var rr={Events:we},bs=Z.touch?"touchstart mousedown":"mousedown",vn=ge.extend({options:{clickTolerance:3},initialize:function(e,n,o,r){F(this,r),this._element=e,this._dragStartTarget=n||e,this._preventOutline=o},enable:function(){this._enabled||(ze(this._dragStartTarget,bs,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(vn._dragging===this&&this.finishDrag(!0),Je(this._dragStartTarget,bs,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(e){if(this._enabled&&(this._moved=!1,!No(this._element,"leaflet-zoom-anim"))){if(e.touches&&e.touches.length!==1){vn._dragging===this&&this.finishDrag();return}if(!(vn._dragging||e.shiftKey||e.which!==1&&e.button!==1&&!e.touches)&&(vn._dragging=this,this._preventOutline&&Ro(this._element),Di(),In(),!this._moving)){this.fire("down");var n=e.touches?e.touches[0]:e,o=Bo(this._element);this._startPoint=new ue(n.clientX,n.clientY),this._startPos=Xe(this._element),this._parentScale=hs(o);var r=e.type==="mousedown";ze(document,r?"mousemove":"touchmove",this._onMove,this),ze(document,r?"mouseup":"touchend touchcancel",this._onUp,this)}}},_onMove:function(e){if(this._enabled){if(e.touches&&e.touches.length>1){this._moved=!0;return}var n=e.touches&&e.touches.length===1?e.touches[0]:e,o=new ue(n.clientX,n.clientY)._subtract(this._startPoint);!o.x&&!o.y||Math.abs(o.x)+Math.abs(o.y)v&&(P=D,v=R);v>o&&(n[P]=1,ws(e,n,o,r,P),ws(e,n,o,P,d))}function va(e,n){for(var o=[e[0]],r=1,d=0,v=e.length;rn&&(o.push(e[r]),d=r);return dn.max.x&&(o|=2),e.yn.max.y&&(o|=8),o}function ks(e,n){var o=n.x-e.x,r=n.y-e.y;return o*o+r*r}function We(e,n,o,r){var d=n.x,v=n.y,P=o.x-d,D=o.y-v,R=P*P+D*D,ne;return R>0&&(ne=((e.x-d)*P+(e.y-v)*D)/R,ne>1?(d=o.x,v=o.y):ne>0&&(d+=P*ne,v+=D*ne)),P=e.x-d,D=e.y-v,r?P*P+D*D:new ue(d,v)}function yt(e){return!Se(e[0])||typeof e[0][0]!="object"&&typeof e[0][0]<"u"}function xi(e){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),yt(e)}function Ss(e,n){var o,r,d,v,P,D,R,ne;if(!e||e.length===0)throw new Error("latlngs not passed");yt(e)||(console.warn("latlngs are not flat! Only the first ring will be used"),e=e[0]);var _e=De([0,0]),Ne=st(e),et=Ne.getNorthWest().distanceTo(Ne.getSouthWest())*Ne.getNorthEast().distanceTo(Ne.getNorthWest());et<1700&&(_e=ys(e));var un=e.length,Wt=[];for(o=0;or){R=(v-r)/d,ne=[D.x-R*(D.x-P.x),D.y-R*(D.y-P.y)];break}var xn=n.unproject(pe(ne));return De([xn.lat+_e.lat,xn.lng+_e.lng])}var dr={__proto__:null,simplify:xs,pointToSegmentDistance:ga,closestPointOnSegment:ur,clipSegment:jo,_getEdgeIntersection:Hi,_getBitCode:Nn,_sqClosestPointOnSegment:We,isFlat:yt,_flat:xi,polylineCenter:Ss},ro={project:function(e){return new ue(e.lng,e.lat)},unproject:function(e){return new Le(e.y,e.x)},bounds:new Ue([-180,-90],[180,90])},Ts={R:6378137,R_MINOR:6356752314245179e-9,bounds:new Ue([-2003750834279e-5,-1549657073972e-5],[2003750834279e-5,1876465623138e-5]),project:function(e){var n=Math.PI/180,o=this.R,r=e.lat*n,d=this.R_MINOR/o,v=Math.sqrt(1-d*d),P=v*Math.sin(r),D=Math.tan(Math.PI/4-r/2)/Math.pow((1-P)/(1+P),v/2);return r=-o*Math.log(Math.max(D,1e-10)),new ue(e.lng*n*o,r)},unproject:function(e){for(var n=180/Math.PI,o=this.R,r=this.R_MINOR/o,d=Math.sqrt(1-r*r),v=Math.exp(-e.y/o),P=Math.PI/2-2*Math.atan(v),D=0,R=.1,ne;D<15&&Math.abs(R)>1e-7;D++)ne=d*Math.sin(P),ne=Math.pow((1-ne)/(1+ne),d/2),R=Math.PI/2-2*Math.atan(v*ne)-P,P+=R;return new Le(P*n,e.x*n/o)}},fr={__proto__:null,LonLat:ro,Mercator:Ts,SphericalMercator:Pt},hr=u({},At,{code:"EPSG:3395",projection:Ts,transformation:(function(){var e=.5/(Math.PI*Ts.R);return x(e,.5,-e,.5)})()}),ba=u({},At,{code:"EPSG:4326",projection:ro,transformation:x(1/180,1,-1/180,.5)}),lo=u({},zt,{projection:ro,transformation:x(1,0,-1,0),scale:function(e){return Math.pow(2,e)},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,n){var o=n.lng-e.lng,r=n.lat-e.lat;return Math.sqrt(o*o+r*r)},infinite:!0});zt.Earth=At,zt.EPSG3395=hr,zt.EPSG3857=b,zt.EPSG900913=S,zt.EPSG4326=ba,zt.Simple=lo;var _n=ge.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(e){return e.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(e){return e&&e.removeLayer(this),this},getPane:function(e){return this._map.getPane(e?this.options[e]||e:this.options.pane)},addInteractiveTarget:function(e){return this._map._targets[y(e)]=this,this},removeInteractiveTarget:function(e){return delete this._map._targets[y(e)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(e){var n=e.target;if(n.hasLayer(this)){if(this._map=n,this._zoomAnimated=n._zoomAnimated,this.getEvents){var o=this.getEvents();n.on(o,this),this.once("remove",function(){n.off(o,this)},this)}this.onAdd(n),this.fire("add"),n.fire("layeradd",{layer:this})}}});qe.include({addLayer:function(e){if(!e._layerAdd)throw new Error("The provided object is not a Layer.");var n=y(e);return this._layers[n]?this:(this._layers[n]=e,e._mapToAdd=this,e.beforeAdd&&e.beforeAdd(this),this.whenReady(e._layerAdd,e),this)},removeLayer:function(e){var n=y(e);return this._layers[n]?(this._loaded&&e.onRemove(this),delete this._layers[n],this._loaded&&(this.fire("layerremove",{layer:e}),e.fire("remove")),e._map=e._mapToAdd=null,this):this},hasLayer:function(e){return y(e)in this._layers},eachLayer:function(e,n){for(var o in this._layers)e.call(n,this._layers[o]);return this},_addLayers:function(e){e=e?Se(e)?e:[e]:[];for(var n=0,o=e.length;nthis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),this.options.minZoom===void 0&&this._layersMinZoom&&this.getZoom()=2&&n[0]instanceof Le&&n[0].equals(n[o-1])&&n.pop(),n},_setLatLngs:function(e){tn.prototype._setLatLngs.call(this,e),yt(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return yt(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var e=this._renderer._bounds,n=this.options.weight,o=new ue(n,n);if(e=new Ue(e.min.subtract(o),e.max.add(o)),this._parts=[],!(!this._pxBounds||!this._pxBounds.intersects(e))){if(this.options.noClip){this._parts=this._rings;return}for(var r=0,d=this._rings.length,v;re.y!=d.y>e.y&&e.x<(d.x-r.x)*(e.y-r.y)/(d.y-r.y)+r.x&&(n=!n);return n||tn.prototype._containsPoint.call(this,e,!0)}});function ya(e,n){return new Dn(e,n)}var yn=bn.extend({initialize:function(e,n){F(this,n),this._layers={},e&&this.addData(e)},addData:function(e){var n=Se(e)?e:e.features,o,r,d;if(n){for(o=0,r=n.length;o0&&d.push(d[0].slice()),d}function Qe(e,n){return e.feature?u({},e.feature,{geometry:n}):En(n)}function En(e){return e.type==="Feature"||e.type==="FeatureCollection"?e:{type:"Feature",properties:{},geometry:e}}var Ki={toGeoJSON:function(e){return Qe(this,{type:"Point",coordinates:Ls(this.getLatLng(),e)})}};Wo.include(Ki),Wi.include(Ki),wi.include(Ki),tn.include({toGeoJSON:function(e){var n=!yt(this._latlngs),o=Go(this._latlngs,n?1:0,!1,e);return Qe(this,{type:(n?"Multi":"")+"LineString",coordinates:o})}}),Dn.include({toGeoJSON:function(e){var n=!yt(this._latlngs),o=n&&!yt(this._latlngs[0]),r=Go(this._latlngs,o?2:n?1:0,!0,e);return n||(r=[r]),Qe(this,{type:(o?"Multi":"")+"Polygon",coordinates:r})}}),qn.include({toMultiPoint:function(e){var n=[];return this.eachLayer(function(o){n.push(o.toGeoJSON(e).geometry.coordinates)}),Qe(this,{type:"MultiPoint",coordinates:n})},toGeoJSON:function(e){var n=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(n==="MultiPoint")return this.toMultiPoint(e);var o=n==="GeometryCollection",r=[];return this.eachLayer(function(d){if(d.toGeoJSON){var v=d.toGeoJSON(e);if(o)r.push(v.geometry);else{var P=En(v);P.type==="FeatureCollection"?r.push.apply(r,P.features):r.push(P)}}}),o?Qe(this,{geometries:r,type:"GeometryCollection"}):{type:"FeatureCollection",features:r}}});function qo(e,n){return new yn(e,n)}var gr=qo,ho=_n.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(e,n,o){this._url=e,this._bounds=st(n),F(this,o)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(He(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ot(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(e){return this.options.opacity=e,this._image&&this._updateOpacity(),this},setStyle:function(e){return e.opacity&&this.setOpacity(e.opacity),this},bringToFront:function(){return this._map&&Cn(this._image),this},bringToBack:function(){return this._map&&qt(this._image),this},setUrl:function(e){return this._url=e,this._image&&(this._image.src=e),this},setBounds:function(e){return this._bounds=st(e),this._map&&this._reset(),this},getEvents:function(){var e={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(e.zoomanim=this._animateZoom),e},setZIndex:function(e){return this.options.zIndex=e,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var e=this._url.tagName==="IMG",n=this._image=e?this._url:it("img");if(He(n,"leaflet-image-layer"),this._zoomAnimated&&He(n,"leaflet-zoom-animated"),this.options.className&&He(n,this.options.className),n.onselectstart=M,n.onmousemove=M,n.onload=h(this.fire,this,"load"),n.onerror=h(this._overlayOnError,this,"error"),(this.options.crossOrigin||this.options.crossOrigin==="")&&(n.crossOrigin=this.options.crossOrigin===!0?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),e){this._url=n.src;return}n.src=this._url,n.alt=this.options.alt},_animateZoom:function(e){var n=this._map.getZoomScale(e.zoom),o=this._map._latLngBoundsToNewLayerBounds(this._bounds,e.zoom,e.center).min;gi(this._image,o,n)},_reset:function(){var e=this._image,n=new Ue(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),o=n.getSize();Mt(e,n.min),e.style.width=o.x+"px",e.style.height=o.y+"px"},_updateOpacity:function(){mn(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&this.options.zIndex!==void 0&&this.options.zIndex!==null&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var e=this.options.errorOverlayUrl;e&&this._url!==e&&(this._url=e,this._image.src=e)},getCenter:function(){return this._bounds.getCenter()}}),vr=function(e,n,o){return new ho(e,n,o)},po=ho.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1,playsInline:!0},_initImage:function(){var e=this._url.tagName==="VIDEO",n=this._image=e?this._url:it("video");if(He(n,"leaflet-image-layer"),this._zoomAnimated&&He(n,"leaflet-zoom-animated"),this.options.className&&He(n,this.options.className),n.onselectstart=M,n.onmousemove=M,n.onloadeddata=h(this.fire,this,"load"),e){for(var o=n.getElementsByTagName("source"),r=[],d=0;d0?r:[n.src];return}Se(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(n.style,"objectFit")&&(n.style.objectFit="fill"),n.autoplay=!!this.options.autoplay,n.loop=!!this.options.loop,n.muted=!!this.options.muted,n.playsInline=!!this.options.playsInline;for(var v=0;vd?(n.height=d+"px",He(e,v)):Lt(e,v),this._containerWidth=this._container.offsetWidth},_animateZoom:function(e){var n=this._map._latLngToNewLayerPoint(this._latlng,e.zoom,e.center),o=this._getAnchor();Mt(this._container,n.add(o))},_adjustPan:function(){if(this.options.autoPan){if(this._map._panAnim&&this._map._panAnim.stop(),this._autopanning){this._autopanning=!1;return}var e=this._map,n=parseInt(mi(this._container,"marginBottom"),10)||0,o=this._container.offsetHeight+n,r=this._containerWidth,d=new ue(this._containerLeft,-o-this._containerBottom);d._add(Xe(this._container));var v=e.layerPointToContainerPoint(d),P=pe(this.options.autoPanPadding),D=pe(this.options.autoPanPaddingTopLeft||P),R=pe(this.options.autoPanPaddingBottomRight||P),ne=e.getSize(),_e=0,Ne=0;v.x+r+R.x>ne.x&&(_e=v.x+r-ne.x+R.x),v.x-_e-D.x<0&&(_e=v.x-D.x),v.y+o+R.y>ne.y&&(Ne=v.y+o-ne.y+R.y),v.y-Ne-D.y<0&&(Ne=v.y-D.y),(_e||Ne)&&(this.options.keepInView&&(this._autopanning=!0),e.fire("autopanstart").panBy([_e,Ne]))}},_getAnchor:function(){return pe(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}}),As=function(e,n){return new Fn(e,n)};qe.mergeOptions({closePopupOnClick:!0}),qe.include({openPopup:function(e,n,o){return this._initOverlay(Fn,e,n,o).openOn(this),this},closePopup:function(e){return e=arguments.length?e:this._popup,e&&e.close(),this}}),_n.include({bindPopup:function(e,n){return this._popup=this._initOverlay(Fn,this._popup,e,n),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(e){return this._popup&&(this instanceof bn||(this._popup._source=this),this._popup._prepareOpen(e||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return this._popup?this._popup.isOpen():!1},setPopupContent:function(e){return this._popup&&this._popup.setContent(e),this},getPopup:function(){return this._popup},_openPopup:function(e){if(!(!this._popup||!this._map)){bi(e);var n=e.layer||e.target;if(this._popup._source===n&&!(n instanceof ti)){this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(e.latlng);return}this._popup._source=n,this.openPopup(e.latlng)}},_movePopup:function(e){this._popup.setLatLng(e.latlng)},_onKeyPress:function(e){e.originalEvent.keyCode===13&&this._openPopup(e)}});var _o=Nt.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(e){Nt.prototype.onAdd.call(this,e),this.setOpacity(this.options.opacity),e.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(e){Nt.prototype.onRemove.call(this,e),e.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var e=Nt.prototype.getEvents.call(this);return this.options.permanent||(e.preclick=this.close),e},_initLayout:function(){var e="leaflet-tooltip",n=e+" "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=it("div",n),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+y(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(e){var n,o,r=this._map,d=this._container,v=r.latLngToContainerPoint(r.getCenter()),P=r.layerPointToContainerPoint(e),D=this.options.direction,R=d.offsetWidth,ne=d.offsetHeight,_e=pe(this.options.offset),Ne=this._getAnchor();D==="top"?(n=R/2,o=ne):D==="bottom"?(n=R/2,o=0):D==="center"?(n=R/2,o=ne/2):D==="right"?(n=0,o=ne/2):D==="left"?(n=R,o=ne/2):P.xthis.options.maxZoom||or?this._retainParent(d,v,P,r):!1)},_retainChildren:function(e,n,o,r){for(var d=2*e;d<2*e+2;d++)for(var v=2*n;v<2*n+2;v++){var P=new ue(d,v);P.z=o+1;var D=this._tileCoordsToKey(P),R=this._tiles[D];if(R&&R.active){R.retain=!0;continue}else R&&R.loaded&&(R.retain=!0);o+1this.options.maxZoom||this.options.minZoom!==void 0&&d1){this._setView(e,o);return}for(var Ne=d.min.y;Ne<=d.max.y;Ne++)for(var et=d.min.x;et<=d.max.x;et++){var un=new ue(et,Ne);if(un.z=this._tileZoom,!!this._isValidTile(un)){var Wt=this._tiles[this._tileCoordsToKey(un)];Wt?Wt.current=!0:P.push(un)}}if(P.sort(function(xn,Jo){return xn.distanceTo(v)-Jo.distanceTo(v)}),P.length!==0){this._loading||(this._loading=!0,this.fire("loading"));var Rn=document.createDocumentFragment();for(et=0;eto.max.x)||!n.wrapLat&&(e.yo.max.y))return!1}if(!this.options.bounds)return!0;var r=this._tileCoordsToBounds(e);return st(this.options.bounds).overlaps(r)},_keyToBounds:function(e){return this._tileCoordsToBounds(this._keyToTileCoords(e))},_tileCoordsToNwSe:function(e){var n=this._map,o=this.getTileSize(),r=e.scaleBy(o),d=r.add(o),v=n.unproject(r,e.z),P=n.unproject(d,e.z);return[v,P]},_tileCoordsToBounds:function(e){var n=this._tileCoordsToNwSe(e),o=new wt(n[0],n[1]);return this.options.noWrap||(o=this._map.wrapLatLngBounds(o)),o},_tileCoordsToKey:function(e){return e.x+":"+e.y+":"+e.z},_keyToTileCoords:function(e){var n=e.split(":"),o=new ue(+n[0],+n[1]);return o.z=+n[2],o},_removeTile:function(e){var n=this._tiles[e];n&&(ot(n.el),delete this._tiles[e],this.fire("tileunload",{tile:n.el,coords:this._keyToTileCoords(e)}))},_initTile:function(e){He(e,"leaflet-tile");var n=this.getTileSize();e.style.width=n.x+"px",e.style.height=n.y+"px",e.onselectstart=M,e.onmousemove=M,Z.ielt9&&this.options.opacity<1&&mn(e,this.options.opacity)},_addTile:function(e,n){var o=this._getTilePos(e),r=this._tileCoordsToKey(e),d=this.createTile(this._wrapCoords(e),h(this._tileReady,this,e));this._initTile(d),this.createTile.length<2&&B(h(this._tileReady,this,e,null,d)),Mt(d,o),this._tiles[r]={el:d,coords:e,current:!0},n.appendChild(d),this.fire("tileloadstart",{tile:d,coords:e})},_tileReady:function(e,n,o){n&&this.fire("tileerror",{error:n,tile:o,coords:e});var r=this._tileCoordsToKey(e);o=this._tiles[r],o&&(o.loaded=+new Date,this._map._fadeAnimated?(mn(o.el,0),O(this._fadeFrame),this._fadeFrame=B(this._updateOpacity,this)):(o.active=!0,this._pruneTiles()),n||(He(o.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:o.el,coords:e})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),Z.ielt9||!this._map._fadeAnimated?B(this._pruneTiles,this):setTimeout(h(this._pruneTiles,this),250)))},_getTilePos:function(e){return e.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(e){var n=new ue(this._wrapX?T(e.x,this._wrapX):e.x,this._wrapY?T(e.y,this._wrapY):e.y);return n.z=e.z,n},_pxBoundsToTileRange:function(e){var n=this.getTileSize();return new Ue(e.min.unscaleBy(n).floor(),e.max.unscaleBy(n).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var e in this._tiles)if(!this._tiles[e].loaded)return!1;return!0}});function br(e){return new bo(e)}var Yn=bo.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(e,n){this._url=e,n=F(this,n),n.detectRetina&&Z.retina&&n.maxZoom>0?(n.tileSize=Math.floor(n.tileSize/2),n.zoomReverse?(n.zoomOffset--,n.minZoom=Math.min(n.maxZoom,n.minZoom+1)):(n.zoomOffset++,n.maxZoom=Math.max(n.minZoom,n.maxZoom-1)),n.minZoom=Math.max(0,n.minZoom)):n.zoomReverse?n.minZoom=Math.min(n.maxZoom,n.minZoom):n.maxZoom=Math.max(n.minZoom,n.maxZoom),typeof n.subdomains=="string"&&(n.subdomains=n.subdomains.split("")),this.on("tileunload",this._onTileRemove)},setUrl:function(e,n){return this._url===e&&n===void 0&&(n=!0),this._url=e,n||this.redraw(),this},createTile:function(e,n){var o=document.createElement("img");return ze(o,"load",h(this._tileOnLoad,this,n,o)),ze(o,"error",h(this._tileOnError,this,n,o)),(this.options.crossOrigin||this.options.crossOrigin==="")&&(o.crossOrigin=this.options.crossOrigin===!0?"":this.options.crossOrigin),typeof this.options.referrerPolicy=="string"&&(o.referrerPolicy=this.options.referrerPolicy),o.alt="",o.src=this.getTileUrl(e),o},getTileUrl:function(e){var n={r:Z.retina?"@2x":"",s:this._getSubdomain(e),x:e.x,y:e.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var o=this._globalTileRange.max.y-e.y;this.options.tms&&(n.y=o),n["-y"]=o}return fe(this._url,u(n,this.options))},_tileOnLoad:function(e,n){Z.ielt9?setTimeout(h(e,this,null,n),0):e(null,n)},_tileOnError:function(e,n,o){var r=this.options.errorTileUrl;r&&n.getAttribute("src")!==r&&(n.src=r),e(o,n)},_onTileRemove:function(e){e.tile.onload=null},_getZoomForUrl:function(){var e=this._tileZoom,n=this.options.maxZoom,o=this.options.zoomReverse,r=this.options.zoomOffset;return o&&(e=n-e),e+r},_getSubdomain:function(e){var n=Math.abs(e.x+e.y)%this.options.subdomains.length;return this.options.subdomains[n]},_abortLoading:function(){var e,n;for(e in this._tiles)if(this._tiles[e].coords.z!==this._tileZoom&&(n=this._tiles[e].el,n.onload=M,n.onerror=M,!n.complete)){n.src=Fe;var o=this._tiles[e].coords;ot(n),delete this._tiles[e],this.fire("tileabort",{tile:n,coords:o})}},_removeTile:function(e){var n=this._tiles[e];if(n)return n.el.setAttribute("src",Fe),bo.prototype._removeTile.call(this,e)},_tileReady:function(e,n,o){if(!(!this._map||o&&o.getAttribute("src")===Fe))return bo.prototype._tileReady.call(this,e,n,o)}});function wa(e,n){return new Yn(e,n)}var mt=Yn.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(e,n){this._url=e;var o=u({},this.defaultWmsParams);for(var r in n)r in this.options||(o[r]=n[r]);n=F(this,n);var d=n.detectRetina&&Z.retina?2:1,v=this.getTileSize();o.width=v.x*d,o.height=v.y*d,this.wmsParams=o},onAdd:function(e){this._crs=this.options.crs||e.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var n=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[n]=this._crs.code,Yn.prototype.onAdd.call(this,e)},getTileUrl:function(e){var n=this._tileCoordsToNwSe(e),o=this._crs,r=Ve(o.project(n[0]),o.project(n[1])),d=r.min,v=r.max,P=(this._wmsVersion>=1.3&&this._crs===ba?[d.y,d.x,v.y,v.x]:[d.x,d.y,v.x,v.y]).join(","),D=Yn.prototype.getTileUrl.call(this,e);return D+te(this.wmsParams,D,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+P},setParams:function(e,n){return u(this.wmsParams,e),n||this.redraw(),this}});function yo(e,n){return new mt(e,n)}Yn.WMS=mt,wa.wms=yo;var On=_n.extend({options:{padding:.1},initialize:function(e){F(this,e),y(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),He(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var e={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(e.zoomanim=this._onAnimZoom),e},_onAnimZoom:function(e){this._updateTransform(e.center,e.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(e,n){var o=this._map.getZoomScale(n,this._zoom),r=this._map.getSize().multiplyBy(.5+this.options.padding),d=this._map.project(this._center,n),v=r.multiplyBy(-o).add(d).subtract(this._map._getNewPixelOrigin(e,n));Z.any3d?gi(this._container,v,o):Mt(this._container,v)},_reset:function(){this._update(),this._updateTransform(this._center,this._zoom);for(var e in this._layers)this._layers[e]._reset()},_onZoomEnd:function(){for(var e in this._layers)this._layers[e]._project()},_updatePaths:function(){for(var e in this._layers)this._layers[e]._update()},_update:function(){var e=this.options.padding,n=this._map.getSize(),o=this._map.containerPointToLayerPoint(n.multiplyBy(-e)).round();this._bounds=new Ue(o,o.add(n.multiplyBy(1+e*2)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),Yo=On.extend({options:{tolerance:0},getEvents:function(){var e=On.prototype.getEvents.call(this);return e.viewprereset=this._onViewPreReset,e},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){On.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var e=this._container=document.createElement("canvas");ze(e,"mousemove",this._onMouseMove,this),ze(e,"click dblclick mousedown mouseup contextmenu",this._onClick,this),ze(e,"mouseout",this._handleMouseOut,this),e._leaflet_disable_events=!0,this._ctx=e.getContext("2d")},_destroyContainer:function(){O(this._redrawRequest),delete this._ctx,ot(this._container),Je(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){var e;this._redrawBounds=null;for(var n in this._layers)e=this._layers[n],e._update();this._redraw()}},_update:function(){if(!(this._map._animatingZoom&&this._bounds)){On.prototype._update.call(this);var e=this._bounds,n=this._container,o=e.getSize(),r=Z.retina?2:1;Mt(n,e.min),n.width=r*o.x,n.height=r*o.y,n.style.width=o.x+"px",n.style.height=o.y+"px",Z.retina&&this._ctx.scale(2,2),this._ctx.translate(-e.min.x,-e.min.y),this.fire("update")}},_reset:function(){On.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(e){this._updateDashArray(e),this._layers[y(e)]=e;var n=e._order={layer:e,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=n),this._drawLast=n,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(e){this._requestRedraw(e)},_removePath:function(e){var n=e._order,o=n.next,r=n.prev;o?o.prev=r:this._drawLast=r,r?r.next=o:this._drawFirst=o,delete e._order,delete this._layers[y(e)],this._requestRedraw(e)},_updatePath:function(e){this._extendRedrawBounds(e),e._project(),e._update(),this._requestRedraw(e)},_updateStyle:function(e){this._updateDashArray(e),this._requestRedraw(e)},_updateDashArray:function(e){if(typeof e.options.dashArray=="string"){var n=e.options.dashArray.split(/[, ]+/),o=[],r,d;for(d=0;d')}}catch{}return function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}})(),g={_initContainer:function(){this._container=it("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(On.prototype._update.call(this),this.fire("update"))},_initPath:function(e){var n=e._container=xo("shape");He(n,"leaflet-vml-shape "+(this.options.className||"")),n.coordsize="1 1",e._path=xo("path"),n.appendChild(e._path),this._updateStyle(e),this._layers[y(e)]=e},_addPath:function(e){var n=e._container;this._container.appendChild(n),e.options.interactive&&e.addInteractiveTarget(n)},_removePath:function(e){var n=e._container;ot(n),e.removeInteractiveTarget(n),delete this._layers[y(e)]},_updateStyle:function(e){var n=e._stroke,o=e._fill,r=e.options,d=e._container;d.stroked=!!r.stroke,d.filled=!!r.fill,r.stroke?(n||(n=e._stroke=xo("stroke")),d.appendChild(n),n.weight=r.weight+"px",n.color=r.color,n.opacity=r.opacity,r.dashArray?n.dashStyle=Se(r.dashArray)?r.dashArray.join(" "):r.dashArray.replace(/( *, *)/g," "):n.dashStyle="",n.endcap=r.lineCap.replace("butt","flat"),n.joinstyle=r.lineJoin):n&&(d.removeChild(n),e._stroke=null),r.fill?(o||(o=e._fill=xo("fill")),d.appendChild(o),o.color=r.fillColor||r.color,o.opacity=r.fillOpacity):o&&(d.removeChild(o),e._fill=null)},_updateCircle:function(e){var n=e._point.round(),o=Math.round(e._radius),r=Math.round(e._radiusY||o);this._setPath(e,e._empty()?"M0 0":"AL "+n.x+","+n.y+" "+o+","+r+" 0,"+65535*360)},_setPath:function(e,n){e._path.v=n},_bringToFront:function(e){Cn(e._container)},_bringToBack:function(e){qt(e._container)}},c=Z.vml?xo:W,q=On.extend({_initContainer:function(){this._container=c("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=c("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ot(this._container),Je(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){if(!(this._map._animatingZoom&&this._bounds)){On.prototype._update.call(this);var e=this._bounds,n=e.getSize(),o=this._container;(!this._svgSize||!this._svgSize.equals(n))&&(this._svgSize=n,o.setAttribute("width",n.x),o.setAttribute("height",n.y)),Mt(o,e.min),o.setAttribute("viewBox",[e.min.x,e.min.y,n.x,n.y].join(" ")),this.fire("update")}},_initPath:function(e){var n=e._path=c("path");e.options.className&&He(n,e.options.className),e.options.interactive&&He(n,"leaflet-interactive"),this._updateStyle(e),this._layers[y(e)]=e},_addPath:function(e){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(e._path),e.addInteractiveTarget(e._path)},_removePath:function(e){ot(e._path),e.removeInteractiveTarget(e._path),delete this._layers[y(e)]},_updatePath:function(e){e._project(),e._update()},_updateStyle:function(e){var n=e._path,o=e.options;n&&(o.stroke?(n.setAttribute("stroke",o.color),n.setAttribute("stroke-opacity",o.opacity),n.setAttribute("stroke-width",o.weight),n.setAttribute("stroke-linecap",o.lineCap),n.setAttribute("stroke-linejoin",o.lineJoin),o.dashArray?n.setAttribute("stroke-dasharray",o.dashArray):n.removeAttribute("stroke-dasharray"),o.dashOffset?n.setAttribute("stroke-dashoffset",o.dashOffset):n.removeAttribute("stroke-dashoffset")):n.setAttribute("stroke","none"),o.fill?(n.setAttribute("fill",o.fillColor||o.color),n.setAttribute("fill-opacity",o.fillOpacity),n.setAttribute("fill-rule",o.fillRule||"evenodd")):n.setAttribute("fill","none"))},_updatePoly:function(e,n){this._setPath(e,V(e._parts,n))},_updateCircle:function(e){var n=e._point,o=Math.max(Math.round(e._radius),1),r=Math.max(Math.round(e._radiusY),1)||o,d="a"+o+","+r+" 0 1,0 ",v=e._empty()?"M0 0":"M"+(n.x-o)+","+n.y+d+o*2+",0 "+d+-o*2+",0 ";this._setPath(e,v)},_setPath:function(e,n){e._path.setAttribute("d",n)},_bringToFront:function(e){Cn(e._path)},_bringToBack:function(e){qt(e._path)}});Z.vml&&q.include(g);function k(e){return Z.svg||Z.vml?new q(e):null}qe.include({getRenderer:function(e){var n=e.options.renderer||this._getPaneRenderer(e.options.pane)||this.options.renderer||this._renderer;return n||(n=this._renderer=this._createRenderer()),this.hasLayer(n)||this.addLayer(n),n},_getPaneRenderer:function(e){if(e==="overlayPane"||e===void 0)return!1;var n=this._paneRenderers[e];return n===void 0&&(n=this._createRenderer({pane:e}),this._paneRenderers[e]=n),n},_createRenderer:function(e){return this.options.preferCanvas&&ka(e)||k(e)}});var Be=Dn.extend({initialize:function(e,n){Dn.prototype.initialize.call(this,this._boundsToLatLngs(e),n)},setBounds:function(e){return this.setLatLngs(this._boundsToLatLngs(e))},_boundsToLatLngs:function(e){return e=st(e),[e.getSouthWest(),e.getNorthWest(),e.getNorthEast(),e.getSouthEast()]}});function id(e,n){return new Be(e,n)}q.create=c,q.pointsToPath=V,yn.geometryToLayer=ni,yn.coordsToLatLng=ii,yn.coordsToLatLngs=ki,yn.latLngToCoords=Ls,yn.latLngsToCoords=Go,yn.getFeature=Qe,yn.asFeature=En,qe.mergeOptions({boxZoom:!0});var bl=An.extend({initialize:function(e){this._map=e,this._container=e._container,this._pane=e._panes.overlayPane,this._resetStateTimeout=0,e.on("unload",this._destroy,this)},addHooks:function(){ze(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Je(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ot(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){this._resetStateTimeout!==0&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(e){if(!e.shiftKey||e.which!==1&&e.button!==1)return!1;this._clearDeferredResetState(),this._resetState(),In(),Di(),this._startPoint=this._map.mouseEventToContainerPoint(e),ze(document,{contextmenu:bi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(e){this._moved||(this._moved=!0,this._box=it("div","leaflet-zoom-box",this._container),He(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(e);var n=new Ue(this._point,this._startPoint),o=n.getSize();Mt(this._box,n.min),this._box.style.width=o.x+"px",this._box.style.height=o.y+"px"},_finish:function(){this._moved&&(ot(this._box),Lt(this._container,"leaflet-crosshair")),vi(),Fi(),Je(document,{contextmenu:bi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(e){if(!(e.which!==1&&e.button!==1)&&(this._finish(),!!this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(h(this._resetState,this),0);var n=new wt(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(n).fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(e){e.keyCode===27&&(this._finish(),this._clearDeferredResetState(),this._resetState())}});qe.addInitHook("addHandler","boxZoom",bl),qe.mergeOptions({doubleClickZoom:!0});var yl=An.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(e){var n=this._map,o=n.getZoom(),r=n.options.zoomDelta,d=e.originalEvent.shiftKey?o-r:o+r;n.options.doubleClickZoom==="center"?n.setZoom(d):n.setZoomAround(e.containerPoint,d)}});qe.addInitHook("addHandler","doubleClickZoom",yl),qe.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var xl=An.extend({addHooks:function(){if(!this._draggable){var e=this._map;this._draggable=new vn(e._mapPane,e._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),e.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),e.on("zoomend",this._onZoomEnd,this),e.whenReady(this._onZoomEnd,this))}He(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){Lt(this._map._container,"leaflet-grab"),Lt(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var e=this._map;if(e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var n=st(this._map.options.maxBounds);this._offsetLimit=Ve(this._map.latLngToContainerPoint(n.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(n.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(e){if(this._map.options.inertia){var n=this._lastTime=+new Date,o=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(o),this._times.push(n),this._prunePositions(n)}this._map.fire("move",e).fire("drag",e)},_prunePositions:function(e){for(;this._positions.length>1&&e-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var e=this._map.getSize().divideBy(2),n=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=n.subtract(e).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(e,n){return e-(e-n)*this._viscosity},_onPreDragLimit:function(){if(!(!this._viscosity||!this._offsetLimit)){var e=this._draggable._newPos.subtract(this._draggable._startPos),n=this._offsetLimit;e.xn.max.x&&(e.x=this._viscousLimit(e.x,n.max.x)),e.y>n.max.y&&(e.y=this._viscousLimit(e.y,n.max.y)),this._draggable._newPos=this._draggable._startPos.add(e)}},_onPreDragWrap:function(){var e=this._worldWidth,n=Math.round(e/2),o=this._initialWorldOffset,r=this._draggable._newPos.x,d=(r-n+o)%e+n-o,v=(r+n+o)%e-n-o,P=Math.abs(d+o)0?v:-v))-n;this._delta=0,this._startTime=null,P&&(e.options.scrollWheelZoom==="center"?e.setZoom(n+P):e.setZoomAround(this._lastMousePos,n+P))}});qe.addInitHook("addHandler","scrollWheelZoom",kl);var od=600;qe.mergeOptions({tapHold:Z.touchNative&&Z.safari&&Z.mobile,tapTolerance:15});var Sl=An.extend({addHooks:function(){ze(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Je(this._map._container,"touchstart",this._onDown,this)},_onDown:function(e){if(clearTimeout(this._holdTimeout),e.touches.length===1){var n=e.touches[0];this._startPos=this._newPos=new ue(n.clientX,n.clientY),this._holdTimeout=setTimeout(h(function(){this._cancel(),this._isTapValid()&&(ze(document,"touchend",Ft),ze(document,"touchend touchcancel",this._cancelClickPrevent),this._simulateEvent("contextmenu",n))},this),od),ze(document,"touchend touchcancel contextmenu",this._cancel,this),ze(document,"touchmove",this._onMove,this)}},_cancelClickPrevent:function e(){Je(document,"touchend",Ft),Je(document,"touchend touchcancel",e)},_cancel:function(){clearTimeout(this._holdTimeout),Je(document,"touchend touchcancel contextmenu",this._cancel,this),Je(document,"touchmove",this._onMove,this)},_onMove:function(e){var n=e.touches[0];this._newPos=new ue(n.clientX,n.clientY)},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_simulateEvent:function(e,n){var o=new MouseEvent(e,{bubbles:!0,cancelable:!0,view:window,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY});o._simulated=!0,n.target.dispatchEvent(o)}});qe.addInitHook("addHandler","tapHold",Sl),qe.mergeOptions({touchZoom:Z.touch,bounceAtZoomLimits:!0});var Tl=An.extend({addHooks:function(){He(this._map._container,"leaflet-touch-zoom"),ze(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){Lt(this._map._container,"leaflet-touch-zoom"),Je(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(e){var n=this._map;if(!(!e.touches||e.touches.length!==2||n._animatingZoom||this._zooming)){var o=n.mouseEventToContainerPoint(e.touches[0]),r=n.mouseEventToContainerPoint(e.touches[1]);this._centerPoint=n.getSize()._divideBy(2),this._startLatLng=n.containerPointToLatLng(this._centerPoint),n.options.touchZoom!=="center"&&(this._pinchStartLatLng=n.containerPointToLatLng(o.add(r)._divideBy(2))),this._startDist=o.distanceTo(r),this._startZoom=n.getZoom(),this._moved=!1,this._zooming=!0,n._stop(),ze(document,"touchmove",this._onTouchMove,this),ze(document,"touchend touchcancel",this._onTouchEnd,this),Ft(e)}},_onTouchMove:function(e){if(!(!e.touches||e.touches.length!==2||!this._zooming)){var n=this._map,o=n.mouseEventToContainerPoint(e.touches[0]),r=n.mouseEventToContainerPoint(e.touches[1]),d=o.distanceTo(r)/this._startDist;if(this._zoom=n.getScaleZoom(d,this._startZoom),!n.options.bounceAtZoomLimits&&(this._zoomn.getMaxZoom()&&d>1)&&(this._zoom=n._limitZoom(this._zoom)),n.options.touchZoom==="center"){if(this._center=this._startLatLng,d===1)return}else{var v=o._add(r)._divideBy(2)._subtract(this._centerPoint);if(d===1&&v.x===0&&v.y===0)return;this._center=n.unproject(n.project(this._pinchStartLatLng,this._zoom).subtract(v),this._zoom)}this._moved||(n._moveStart(!0,!1),this._moved=!0),O(this._animRequest);var P=h(n._move,n,this._center,this._zoom,{pinch:!0,round:!1},void 0);this._animRequest=B(P,this,!0),Ft(e)}},_onTouchEnd:function(){if(!this._moved||!this._zooming){this._zooming=!1;return}this._zooming=!1,O(this._animRequest),Je(document,"touchmove",this._onTouchMove,this),Je(document,"touchend touchcancel",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))}});qe.addInitHook("addHandler","touchZoom",Tl),qe.BoxZoom=bl,qe.DoubleClickZoom=yl,qe.Drag=xl,qe.Keyboard=wl,qe.ScrollWheelZoom=kl,qe.TapHold=Sl,qe.TouchZoom=Tl,s.Bounds=Ue,s.Browser=Z,s.CRS=zt,s.Canvas=Yo,s.Circle=Wi,s.CircleMarker=wi,s.Class=$,s.Control=en,s.DivIcon=Ms,s.DivOverlay=Nt,s.DomEvent=Vi,s.DomUtil=Ln,s.Draggable=vn,s.Evented=ge,s.FeatureGroup=bn,s.GeoJSON=yn,s.GridLayer=bo,s.Handler=An,s.Icon=ji,s.ImageOverlay=ho,s.LatLng=Le,s.LatLngBounds=wt,s.Layer=_n,s.LayerGroup=qn,s.LineUtil=dr,s.Map=qe,s.Marker=Wo,s.Mixin=rr,s.Path=ti,s.Point=ue,s.PolyUtil=lr,s.Polygon=Dn,s.Polyline=tn,s.Popup=Fn,s.PosAnimation=so,s.Projection=fr,s.Rectangle=Be,s.Renderer=On,s.SVG=q,s.SVGOverlay=go,s.TileLayer=Yn,s.Tooltip=_o,s.Transformation=kt,s.Util=N,s.VideoOverlay=po,s.bind=h,s.bounds=Ve,s.canvas=ka,s.circle=Rt,s.circleMarker=fo,s.control=ln,s.divIcon=xa,s.extend=u,s.featureGroup=Ps,s.geoJSON=qo,s.geoJson=gr,s.gridLayer=br,s.icon=pr,s.imageOverlay=vr,s.latLng=De,s.latLngBounds=st,s.layerGroup=uo,s.map=Vo,s.marker=mr,s.point=pe,s.polygon=ya,s.polyline=Ko,s.popup=As,s.rectangle=id,s.setOptions=F,s.stamp=y,s.svg=k,s.svgOverlay=vo,s.tileLayer=wa,s.tooltip=_r,s.transformation=x,s.version=l,s.videoOverlay=mo;var sd=window.L;s.noConflict=function(){return window.L=sd,this},window.L=s}))})(Fs,Fs.exports)),Fs.exports}var dm=cm();const qi=lm(dm),Cu={__name:"DeviceMap",props:{position:{type:Object,default:null},trail:{type:Array,default:()=>[]},aircraft:{type:Array,default:()=>[]}},setup(t){const i=t,s=Y(null);let l,u,f,h;const _=new Map;function y(K,F){const te=getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#3D7BF0",X=F?"#8a94a6":te,fe=typeof K=="number"?K:0;return qi.divIcon({className:"plane-marker",iconSize:[22,22],iconAnchor:[11,11],html:``})}function C(K){const te=[`${K.callsign||K.icao24||"aircraft"}`];return K.country&&te.push(K.country),typeof K.altitude=="number"&&te.push(`${Math.round(K.altitude)} m`),typeof K.velocity=="number"&&te.push(`${Math.round(K.velocity*3.6)} km/h`),K.onGround&&te.push("on ground"),te.join(" · ")}function T(){if(!l)return;h||(h=qi.layerGroup().addTo(l));const K=new Set;for(const F of i.aircraft){if(typeof F.lat!="number"||typeof F.lng!="number")continue;K.add(F.icao24);const te=[F.lat,F.lng];let X=_.get(F.icao24);X?(X.setLatLng(te),X.setIcon(y(F.heading,F.onGround)),X.setTooltipContent(C(F))):(X=qi.marker(te,{icon:y(F.heading,F.onGround)}).bindTooltip(C(F)),X.addTo(h),_.set(F.icao24,X))}for(const[F,te]of _)K.has(F)||(h.removeLayer(te),_.delete(F))}function M(){if(!l)return;const K=i.position;if(K&&(K.lat||K.lng)){const F=[K.lat,K.lng];u?u.setLatLng(F):(u=qi.marker(F).addTo(l),l.setView(F,17))}if(f&&f.remove(),i.trail.length){const F=getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#3D7BF0";f=qi.polyline(i.trail,{color:F,weight:3}).addTo(l)}}fi(()=>{l=qi.map(s.value,{zoomControl:!0}).setView([20,0],2),qi.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:"© OpenStreetMap",maxZoom:19}).addTo(l),setTimeout(()=>l.invalidateSize(),60),M(),T(),(!i.position||!i.position.lat&&!i.position.lng)&&i.aircraft.length&&j()});let H=!1;function j(){if(H||!l||!i.aircraft.length)return;const K=i.aircraft.filter(F=>typeof F.lat=="number"&&typeof F.lng=="number").map(F=>[F.lat,F.lng]);K.length&&(l.fitBounds(qi.latLngBounds(K).pad(.2)),H=!0)}return us(()=>{l&&l.remove(),l=null}),Bt(()=>i.position,M,{deep:!0}),Bt(()=>i.trail,M,{deep:!0}),Bt(()=>i.aircraft,()=>{T(),(!i.position||!i.position.lat&&!i.position.lng)&&j()},{deep:!0}),(K,F)=>(p(),m("div",{ref_key:"el",ref:s,class:"h-[320px] w-full rounded-lg"},null,512))}},fm=["width","height","stroke-width"],hm=["d"],J={__name:"Icon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:18},stroke:{type:[Number,String],default:2}},setup(t){const l=({grid:"M3 3h7v7H3zM14 3h7v7h-7zM14 14h7v7h-7zM3 14h7v7H3z",radio:"M4.9 19.1a10 10 0 0 1 0-14.2M7.8 16.2a6 6 0 0 1 0-8.4M16.2 7.8a6 6 0 0 1 0 8.4M19.1 4.9a10 10 0 0 1 0 14.2M12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2z",route:"M6 19a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM18 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM6 13V9a4 4 0 0 1 4-4h4",calendar:"M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z",book:"M4 19.5A2.5 2.5 0 0 1 6.5 17H20M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z",fileText:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M16 13H8M16 17H8M10 9H8",settings:"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",search:"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.3-4.3",plus:"M12 5v14M5 12h14",battery:"M3 8h14a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1zM22 11v2",signal:"M2 20h.01M7 20v-4M12 20v-8M17 20V8M22 20V4",clock:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 7v5l3 2",chevronRight:"M9 6l6 6-6 6",play:"M6 3l14 9-14 9V3z",logout:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9",wind:"M12.8 19.6A2 2 0 1 0 14 16H2M17.5 8a2.5 2.5 0 1 1 2 4H2M9.6 4.6A2 2 0 1 1 11 8H2",drone:"M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM6 6 4 4M18 6l2-2M6 18l-2 2M18 18l2 2",user:"M20 21a8 8 0 1 0-16 0M12 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z",users:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",sliders:"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6",alertTriangle:"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4M12 17h.01",download:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3",upload:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12",trash:"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6",check:"M20 6 9 17l-5-5",mail:"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM22 6l-10 7L2 6",lock:"M5 11h14a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2zM7 11V7a5 5 0 0 1 10 0v4",monitor:"M3 4h18a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM8 21h8M12 17v4",globe:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM3 12h18M12 3a15 15 0 0 1 0 18 15 15 0 0 1 0-18z",smartphone:"M7 2h10a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1zM11 18h2",image:"M4 4h16a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM8.5 11a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM21 15l-5-5L5 21",eye:"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",type:"M4 7V4h16v3M9 20h6M12 4v16",sun:"M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4",moon:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z",x:"M18 6 6 18M6 6l12 12",server:"M20 4H4a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zM20 13H4a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2zM6 7.5h.01M6 16.5h.01",cloud:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9z"}[t.name]||"").split(" M").map((u,f)=>f?"M"+u:u);return(u,f)=>(p(),m("svg",{width:t.size,height:t.size,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":t.stroke,"stroke-linecap":"round","stroke-linejoin":"round",style:{flex:"none"},"aria-hidden":"true"},[(p(!0),m(le,null,Ie(Ee(l),(h,_)=>(p(),m("path",{key:_,d:h},null,8,hm))),128))],8,fm))}},pm=["aria-checked","disabled"],nn={__name:"Toggle",props:{modelValue:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(t,{emit:i}){const s=i;return(l,u)=>(p(),m("button",{type:"button",role:"switch","aria-checked":t.modelValue,disabled:t.disabled,class:Ce(["relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition disabled:opacity-40",t.modelValue?"bg-accent":"bg-surface-2 border border-line-strong"]),onClick:u[0]||(u[0]=f=>s("update:modelValue",!t.modelValue))},[a("span",{class:Ce(["inline-block h-4 w-4 transform rounded-full bg-white shadow-sm transition",t.modelValue?"translate-x-6":"translate-x-1"])},null,2)],10,pm))}},mm={class:"inline-flex rounded-[10px] border border-line bg-surface-2 p-0.5"},gm=["onClick"],wn={__name:"Segmented",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(t,{emit:i}){const s=i;return(l,u)=>(p(),m("div",mm,[(p(!0),m(le,null,Ie(t.options,f=>(p(),m("button",{key:f.value,type:"button",class:Ce(["inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-[13px] font-semibold transition",t.modelValue===f.value?"bg-surface-1 text-ink shadow-xs":"text-ink-secondary hover:text-ink"]),onClick:h=>s("update:modelValue",f.value)},[f.icon?(p(),nt(J,{key:0,name:f.icon,size:15},null,8,["name"])):I("",!0),z(" "+w(f.label),1)],10,gm))),128))]))}},vm={class:"text-sm font-semibold text-ink"},_m={key:0,class:"mt-0.5 text-xs text-ink-muted"},xe={__name:"Row",props:{title:{type:String,default:""},desc:{type:String,default:""},keywords:{type:String,default:""},block:{type:Boolean,default:!1}},setup(t){const i=t,s=Vs("settingsSearch",{value:""}),l=ce(()=>{const u=(s.value||"").trim().toLowerCase();return u?`${i.title} ${i.desc} ${i.keywords}`.toLowerCase().includes(u):!0});return(u,f)=>l.value?(p(),m("div",{key:0,class:Ce(["border-b border-line py-4 last:border-0",t.block?"":"flex items-center justify-between gap-6"])},[a("div",{class:Ce(t.block?"mb-3":"min-w-0")},[a("div",vm,w(t.title),1),t.desc?(p(),m("div",_m,w(t.desc),1)):I("",!0)],2),a("div",{class:Ce(t.block?"":"shrink-0")},[Tf(u.$slots,"default")],2)],2)):I("",!0)}},ia=[{code:"AL",name:"Albania",continent:"EU",bbox:"39.6,19.3,42.7,21.1"},{code:"AD",name:"Andorra",continent:"EU",bbox:"42.4,1.4,42.7,1.8"},{code:"AT",name:"Austria",continent:"EU",bbox:"46.4,9.5,49.0,17.2"},{code:"BY",name:"Belarus",continent:"EU",bbox:"51.2,23.2,56.2,32.8"},{code:"BE",name:"Belgium",continent:"EU",bbox:"49.5,2.5,51.5,6.4"},{code:"BA",name:"Bosnia and Herzegovina",continent:"EU",bbox:"42.6,15.7,45.3,19.6"},{code:"BG",name:"Bulgaria",continent:"EU",bbox:"41.2,22.4,44.2,28.6"},{code:"HR",name:"Croatia",continent:"EU",bbox:"42.4,13.5,46.6,19.4"},{code:"CY",name:"Cyprus",continent:"EU",bbox:"34.6,32.3,35.7,34.6"},{code:"CZ",name:"Czechia",continent:"EU",bbox:"48.6,12.1,51.1,18.9"},{code:"DK",name:"Denmark",continent:"EU",bbox:"54.6,8.1,57.8,12.7"},{code:"EE",name:"Estonia",continent:"EU",bbox:"57.5,21.8,59.7,28.2"},{code:"FI",name:"Finland",continent:"EU",bbox:"59.8,20.6,70.1,31.6"},{code:"FR",name:"France",continent:"EU",bbox:"41.3,-5.2,51.1,9.6"},{code:"DE",name:"Germany",continent:"EU",bbox:"47.2,5.8,55.1,15.1"},{code:"GR",name:"Greece",continent:"EU",bbox:"34.8,19.4,41.8,28.3"},{code:"HU",name:"Hungary",continent:"EU",bbox:"45.7,16.1,48.6,22.9"},{code:"IS",name:"Iceland",continent:"EU",bbox:"63.3,-24.6,66.6,-13.5"},{code:"IE",name:"Ireland",continent:"EU",bbox:"51.4,-10.6,55.4,-6.0"},{code:"IT",name:"Italy",continent:"EU",bbox:"36.6,6.6,47.1,18.6"},{code:"XK",name:"Kosovo",continent:"EU",bbox:"41.8,20.0,43.3,21.8"},{code:"LV",name:"Latvia",continent:"EU",bbox:"55.7,20.9,58.1,28.2"},{code:"LI",name:"Liechtenstein",continent:"EU",bbox:"47.0,9.4,47.3,9.6"},{code:"LT",name:"Lithuania",continent:"EU",bbox:"53.9,20.9,56.5,26.9"},{code:"LU",name:"Luxembourg",continent:"EU",bbox:"49.4,5.7,50.2,6.5"},{code:"MT",name:"Malta",continent:"EU",bbox:"35.8,14.1,36.1,14.6"},{code:"MD",name:"Moldova",continent:"EU",bbox:"45.4,26.6,48.5,30.2"},{code:"MC",name:"Monaco",continent:"EU",bbox:"43.72,7.40,43.75,7.44"},{code:"ME",name:"Montenegro",continent:"EU",bbox:"41.8,18.4,43.6,20.4"},{code:"NL",name:"Netherlands",continent:"EU",bbox:"50.7,3.3,53.7,7.2"},{code:"MK",name:"North Macedonia",continent:"EU",bbox:"40.8,20.4,42.4,23.0"},{code:"NO",name:"Norway",continent:"EU",bbox:"57.9,4.6,71.2,31.1"},{code:"PL",name:"Poland",continent:"EU",bbox:"49.0,14.1,54.9,24.2"},{code:"PT",name:"Portugal",continent:"EU",bbox:"36.9,-9.5,42.2,-6.2"},{code:"RO",name:"Romania",continent:"EU",bbox:"43.6,20.2,48.3,29.7"},{code:"SM",name:"San Marino",continent:"EU",bbox:"43.89,12.40,43.99,12.52"},{code:"RS",name:"Serbia",continent:"EU",bbox:"42.2,18.8,46.2,23.0"},{code:"SK",name:"Slovakia",continent:"EU",bbox:"47.7,16.8,49.6,22.6"},{code:"SI",name:"Slovenia",continent:"EU",bbox:"45.4,13.4,46.9,16.6"},{code:"ES",name:"Spain",continent:"EU",bbox:"35.9,-9.4,43.8,3.4"},{code:"SE",name:"Sweden",continent:"EU",bbox:"55.3,11.1,69.1,24.2"},{code:"CH",name:"Switzerland",continent:"EU",bbox:"45.8,5.9,47.8,10.5"},{code:"UA",name:"Ukraine",continent:"EU",bbox:"44.4,22.1,52.4,40.2"},{code:"GB",name:"United Kingdom",continent:"EU",bbox:"49.9,-8.7,60.9,1.8"},{code:"VA",name:"Vatican City",continent:"EU",bbox:"41.900,12.445,41.908,12.458"},{code:"RU",name:"Russia",continent:"EU",bbox:"41.2,19.6,81.9,180"},{code:"TR",name:"Turkey",continent:"EU",bbox:"35.8,25.7,42.3,44.8"},{code:"AF",name:"Afghanistan",continent:"AS",bbox:"29.4,60.5,38.5,74.9"},{code:"AM",name:"Armenia",continent:"AS",bbox:"38.8,43.4,41.3,46.6"},{code:"AZ",name:"Azerbaijan",continent:"AS",bbox:"38.4,44.8,41.9,50.4"},{code:"BH",name:"Bahrain",continent:"AS",bbox:"25.8,50.4,26.3,50.7"},{code:"BD",name:"Bangladesh",continent:"AS",bbox:"20.7,88.0,26.6,92.7"},{code:"BT",name:"Bhutan",continent:"AS",bbox:"26.7,88.7,28.3,92.1"},{code:"BN",name:"Brunei",continent:"AS",bbox:"4.0,114.0,5.1,115.4"},{code:"KH",name:"Cambodia",continent:"AS",bbox:"10.4,102.3,14.7,107.6"},{code:"CN",name:"China",continent:"AS",bbox:"18.2,73.5,53.6,134.8"},{code:"GE",name:"Georgia",continent:"AS",bbox:"41.0,40.0,43.6,46.7"},{code:"IN",name:"India",continent:"AS",bbox:"6.7,68.1,35.5,97.4"},{code:"ID",name:"Indonesia",continent:"AS",bbox:"-11.0,95.0,6.1,141.0"},{code:"IR",name:"Iran",continent:"AS",bbox:"25.0,44.0,39.8,63.3"},{code:"IQ",name:"Iraq",continent:"AS",bbox:"29.1,38.8,37.4,48.6"},{code:"IL",name:"Israel",continent:"AS",bbox:"29.5,34.2,33.3,35.9"},{code:"JP",name:"Japan",continent:"AS",bbox:"24.0,122.9,45.5,145.8"},{code:"JO",name:"Jordan",continent:"AS",bbox:"29.2,34.9,33.4,39.3"},{code:"KZ",name:"Kazakhstan",continent:"AS",bbox:"40.6,46.5,55.4,87.3"},{code:"KW",name:"Kuwait",continent:"AS",bbox:"28.5,46.5,30.1,48.4"},{code:"KG",name:"Kyrgyzstan",continent:"AS",bbox:"39.2,69.3,43.3,80.3"},{code:"LA",name:"Laos",continent:"AS",bbox:"13.9,100.1,22.5,107.7"},{code:"LB",name:"Lebanon",continent:"AS",bbox:"33.0,35.1,34.7,36.6"},{code:"MY",name:"Malaysia",continent:"AS",bbox:"0.9,99.6,7.4,119.3"},{code:"MV",name:"Maldives",continent:"AS",bbox:"-0.7,72.7,7.1,73.7"},{code:"MN",name:"Mongolia",continent:"AS",bbox:"41.6,87.7,52.1,119.9"},{code:"MM",name:"Myanmar",continent:"AS",bbox:"9.8,92.2,28.5,101.2"},{code:"NP",name:"Nepal",continent:"AS",bbox:"26.3,80.1,30.4,88.2"},{code:"KP",name:"North Korea",continent:"AS",bbox:"37.7,124.2,43.0,130.7"},{code:"OM",name:"Oman",continent:"AS",bbox:"16.6,52.0,26.4,59.8"},{code:"PK",name:"Pakistan",continent:"AS",bbox:"23.7,60.9,37.1,77.8"},{code:"PH",name:"Philippines",continent:"AS",bbox:"4.6,116.9,21.1,126.6"},{code:"QA",name:"Qatar",continent:"AS",bbox:"24.5,50.7,26.2,51.6"},{code:"SA",name:"Saudi Arabia",continent:"AS",bbox:"16.4,34.6,32.2,55.7"},{code:"SG",name:"Singapore",continent:"AS",bbox:"1.2,103.6,1.5,104.1"},{code:"KR",name:"South Korea",continent:"AS",bbox:"33.1,125.9,38.6,129.6"},{code:"LK",name:"Sri Lanka",continent:"AS",bbox:"5.9,79.7,9.8,81.9"},{code:"SY",name:"Syria",continent:"AS",bbox:"32.3,35.7,37.3,42.4"},{code:"TW",name:"Taiwan",continent:"AS",bbox:"21.9,120.0,25.3,122.0"},{code:"TJ",name:"Tajikistan",continent:"AS",bbox:"36.7,67.4,41.0,75.2"},{code:"TH",name:"Thailand",continent:"AS",bbox:"5.6,97.3,20.5,105.6"},{code:"TL",name:"Timor-Leste",continent:"AS",bbox:"-9.5,124.0,-8.1,127.3"},{code:"TM",name:"Turkmenistan",continent:"AS",bbox:"35.1,52.4,42.8,66.7"},{code:"AE",name:"United Arab Emirates",continent:"AS",bbox:"22.6,51.5,26.1,56.4"},{code:"UZ",name:"Uzbekistan",continent:"AS",bbox:"37.2,55.9,45.6,73.1"},{code:"VN",name:"Vietnam",continent:"AS",bbox:"8.2,102.1,23.4,109.5"},{code:"YE",name:"Yemen",continent:"AS",bbox:"12.1,42.5,19.0,54.5"},{code:"DZ",name:"Algeria",continent:"AF",bbox:"18.9,-8.7,37.1,12.0"},{code:"AO",name:"Angola",continent:"AF",bbox:"-18.0,11.6,-4.4,24.1"},{code:"BJ",name:"Benin",continent:"AF",bbox:"6.2,0.8,12.4,3.9"},{code:"BW",name:"Botswana",continent:"AF",bbox:"-26.9,20.0,-17.8,29.4"},{code:"BF",name:"Burkina Faso",continent:"AF",bbox:"9.4,-5.5,15.1,2.4"},{code:"BI",name:"Burundi",continent:"AF",bbox:"-4.5,29.0,-2.3,30.8"},{code:"CV",name:"Cabo Verde",continent:"AF",bbox:"14.8,-25.4,17.2,-22.7"},{code:"CM",name:"Cameroon",continent:"AF",bbox:"1.7,8.5,13.1,16.2"},{code:"CF",name:"Central African Republic",continent:"AF",bbox:"2.2,14.4,11.0,27.5"},{code:"TD",name:"Chad",continent:"AF",bbox:"7.4,13.5,23.4,24.0"},{code:"KM",name:"Comoros",continent:"AF",bbox:"-12.4,43.2,-11.4,44.5"},{code:"CG",name:"Congo",continent:"AF",bbox:"-5.0,11.1,3.7,18.6"},{code:"CD",name:"DR Congo",continent:"AF",bbox:"-13.5,12.2,5.4,31.3"},{code:"DJ",name:"Djibouti",continent:"AF",bbox:"10.9,41.7,12.7,43.4"},{code:"EG",name:"Egypt",continent:"AF",bbox:"22.0,25.0,31.7,36.9"},{code:"GQ",name:"Equatorial Guinea",continent:"AF",bbox:"0.9,9.3,3.8,11.4"},{code:"ER",name:"Eritrea",continent:"AF",bbox:"12.4,36.4,18.0,43.1"},{code:"SZ",name:"Eswatini",continent:"AF",bbox:"-27.3,30.8,-25.7,32.1"},{code:"ET",name:"Ethiopia",continent:"AF",bbox:"3.4,33.0,14.9,48.0"},{code:"GA",name:"Gabon",continent:"AF",bbox:"-4.0,8.7,2.3,14.5"},{code:"GM",name:"Gambia",continent:"AF",bbox:"13.1,-16.8,13.8,-13.8"},{code:"GH",name:"Ghana",continent:"AF",bbox:"4.7,-3.3,11.2,1.2"},{code:"GN",name:"Guinea",continent:"AF",bbox:"7.2,-15.1,12.7,-7.6"},{code:"GW",name:"Guinea-Bissau",continent:"AF",bbox:"10.9,-16.7,12.7,-13.6"},{code:"CI",name:"Ivory Coast",continent:"AF",bbox:"4.4,-8.6,10.7,-2.5"},{code:"KE",name:"Kenya",continent:"AF",bbox:"-4.7,33.9,5.5,41.9"},{code:"LS",name:"Lesotho",continent:"AF",bbox:"-30.7,27.0,-28.6,29.5"},{code:"LR",name:"Liberia",continent:"AF",bbox:"4.3,-11.5,8.6,-7.4"},{code:"LY",name:"Libya",continent:"AF",bbox:"19.5,9.3,33.2,25.2"},{code:"MG",name:"Madagascar",continent:"AF",bbox:"-25.6,43.2,-11.9,50.5"},{code:"MW",name:"Malawi",continent:"AF",bbox:"-17.1,32.7,-9.4,35.9"},{code:"ML",name:"Mali",continent:"AF",bbox:"10.1,-12.3,25.0,4.3"},{code:"MR",name:"Mauritania",continent:"AF",bbox:"14.7,-17.1,27.3,-4.8"},{code:"MU",name:"Mauritius",continent:"AF",bbox:"-20.5,57.3,-19.9,57.8"},{code:"MA",name:"Morocco",continent:"AF",bbox:"27.7,-13.2,35.9,-1.0"},{code:"MZ",name:"Mozambique",continent:"AF",bbox:"-26.9,30.2,-10.5,40.8"},{code:"NA",name:"Namibia",continent:"AF",bbox:"-28.9,11.7,-16.9,25.3"},{code:"NE",name:"Niger",continent:"AF",bbox:"11.7,0.2,23.5,16.0"},{code:"NG",name:"Nigeria",continent:"AF",bbox:"4.3,2.7,13.9,14.7"},{code:"RW",name:"Rwanda",continent:"AF",bbox:"-2.8,28.9,-1.1,30.9"},{code:"SN",name:"Senegal",continent:"AF",bbox:"12.3,-17.5,16.7,-11.4"},{code:"SL",name:"Sierra Leone",continent:"AF",bbox:"6.9,-13.3,10.0,-10.3"},{code:"SO",name:"Somalia",continent:"AF",bbox:"-1.7,40.9,12.0,51.4"},{code:"ZA",name:"South Africa",continent:"AF",bbox:"-34.8,16.5,-22.1,32.9"},{code:"SS",name:"South Sudan",continent:"AF",bbox:"3.5,24.1,12.2,35.9"},{code:"SD",name:"Sudan",continent:"AF",bbox:"8.7,21.8,22.2,38.6"},{code:"TZ",name:"Tanzania",continent:"AF",bbox:"-11.7,29.3,-1.0,40.4"},{code:"TG",name:"Togo",continent:"AF",bbox:"6.1,-0.1,11.1,1.8"},{code:"TN",name:"Tunisia",continent:"AF",bbox:"30.2,7.5,37.5,11.6"},{code:"UG",name:"Uganda",continent:"AF",bbox:"-1.5,29.6,4.2,35.0"},{code:"ZM",name:"Zambia",continent:"AF",bbox:"-18.1,21.9,-8.2,33.7"},{code:"ZW",name:"Zimbabwe",continent:"AF",bbox:"-22.4,25.2,-15.6,33.1"},{code:"CA",name:"Canada",continent:"NA",bbox:"41.7,-141.0,83.1,-52.6"},{code:"US",name:"United States",continent:"NA",bbox:"24.4,-125.0,49.4,-66.9"},{code:"MX",name:"Mexico",continent:"NA",bbox:"14.5,-118.4,32.7,-86.7"},{code:"GT",name:"Guatemala",continent:"NA",bbox:"13.7,-92.2,17.8,-88.2"},{code:"BZ",name:"Belize",continent:"NA",bbox:"15.9,-89.2,18.5,-87.8"},{code:"SV",name:"El Salvador",continent:"NA",bbox:"13.1,-90.1,14.4,-87.7"},{code:"HN",name:"Honduras",continent:"NA",bbox:"12.9,-89.4,16.5,-83.1"},{code:"NI",name:"Nicaragua",continent:"NA",bbox:"10.7,-87.7,15.0,-83.1"},{code:"CR",name:"Costa Rica",continent:"NA",bbox:"8.0,-85.9,11.2,-82.5"},{code:"PA",name:"Panama",continent:"NA",bbox:"7.2,-83.1,9.6,-77.2"},{code:"CU",name:"Cuba",continent:"NA",bbox:"19.8,-85.0,23.3,-74.1"},{code:"DO",name:"Dominican Republic",continent:"NA",bbox:"17.5,-72.0,19.9,-68.3"},{code:"HT",name:"Haiti",continent:"NA",bbox:"18.0,-74.5,20.1,-71.6"},{code:"JM",name:"Jamaica",continent:"NA",bbox:"17.7,-78.4,18.5,-76.2"},{code:"BS",name:"Bahamas",continent:"NA",bbox:"20.9,-79.0,27.3,-72.7"},{code:"TT",name:"Trinidad and Tobago",continent:"NA",bbox:"10.0,-61.9,11.4,-60.5"},{code:"AR",name:"Argentina",continent:"SA",bbox:"-55.1,-73.6,-21.8,-53.6"},{code:"BO",name:"Bolivia",continent:"SA",bbox:"-22.9,-69.6,-9.7,-57.5"},{code:"BR",name:"Brazil",continent:"SA",bbox:"-33.8,-74.0,5.3,-34.8"},{code:"CL",name:"Chile",continent:"SA",bbox:"-55.9,-75.6,-17.5,-66.4"},{code:"CO",name:"Colombia",continent:"SA",bbox:"-4.2,-79.0,12.5,-66.9"},{code:"EC",name:"Ecuador",continent:"SA",bbox:"-5.0,-81.1,1.4,-75.2"},{code:"GY",name:"Guyana",continent:"SA",bbox:"1.2,-61.4,8.6,-56.5"},{code:"PY",name:"Paraguay",continent:"SA",bbox:"-27.6,-62.6,-19.3,-54.3"},{code:"PE",name:"Peru",continent:"SA",bbox:"-18.4,-81.3,0.0,-68.7"},{code:"SR",name:"Suriname",continent:"SA",bbox:"1.8,-58.1,6.0,-54.0"},{code:"UY",name:"Uruguay",continent:"SA",bbox:"-35.0,-58.4,-30.1,-53.1"},{code:"VE",name:"Venezuela",continent:"SA",bbox:"0.6,-73.4,12.2,-59.8"},{code:"AU",name:"Australia",continent:"OC",bbox:"-43.6,113.3,-10.7,153.6"},{code:"NZ",name:"New Zealand",continent:"OC",bbox:"-47.3,166.4,-34.4,178.6"},{code:"PG",name:"Papua New Guinea",continent:"OC",bbox:"-11.7,140.8,-1.3,155.9"},{code:"FJ",name:"Fiji",continent:"OC",bbox:"-19.2,177.0,-16.0,180.0"}],bm=new Map(ia.map(t=>[t.code,t]));function ym(t){const i=String(t||"").split(",").map(s=>Number(s.trim()));return i.length!==4||i.some(s=>Number.isNaN(s))?null:i}function xm(t){const i=bm.get(t);return i?i.bbox:""}function $r(t,i){if(typeof t!="number"||typeof i!="number"||Number.isNaN(t)||Number.isNaN(i))return null;let s=null,l=1/0;for(const u of ia){const f=ym(u.bbox);if(!f)continue;const[h,_,y,C]=f;if(ty||i<_||i>C)continue;const T=Math.abs(y-h)*Math.abs(C-_);Tt.continent==="EU").slice().sort((t,i)=>t.name.localeCompare(i.name)).map(t=>({value:t.bbox,label:t.name}))}function km(){return ia.slice().sort((t,i)=>t.name.localeCompare(i.name)).map(t=>[t.code,t.name])}const Sm=[["EU","European countries"],["AS","Asian countries"],["AF","African countries"],["NA","North American countries"],["SA","South American countries"],["OC","Oceanian countries"]];function Tm(){return Sm.map(([t,i])=>({label:i,options:ia.filter(s=>s.continent===t).slice().sort((s,l)=>s.name.localeCompare(l.name)).map(s=>({value:s.bbox,label:s.name}))}))}const Pm=(t,i)=>{const s=t.__vccOpts||t;for(const[l,u]of i)s[l]=u;return s},Cm={class:"mx-auto max-w-[1280px] p-7"},Lm={class:"mb-5 flex flex-wrap items-end justify-between gap-4"},Am={class:"flex h-10 w-full max-w-[280px] items-center gap-2 rounded border border-line-strong bg-surface-1 px-3"},Mm={class:"grid grid-cols-[210px_1fr] gap-6 max-[760px]:grid-cols-1"},Em={class:"flex flex-col gap-0.5 max-[760px]:flex-row max-[760px]:overflow-x-auto"},Om=["onClick"],zm={class:"whitespace-nowrap"},$m={class:"min-w-0"},Im={key:0,class:"panel p-10 text-center text-sm text-ink-muted"},Nm={key:0,class:"eyebrow mb-2 mt-5 first:mt-0 flex items-center gap-2"},Dm={key:1,class:"panel mb-5 p-5"},Fm={class:"flex items-center gap-1"},Rm={class:"flex items-center gap-2"},Bm={class:"font-mono text-sm text-ink"},Um={class:"inline-flex items-center gap-1 rounded-full bg-amber-soft px-2 py-0.5 text-[11px] font-semibold text-amber-fg"},Vm={key:0,class:"mt-2 text-xs text-ink-muted"},Zm={class:"grid max-w-[420px] gap-2"},Hm={class:"flex items-center gap-3"},jm={key:2,class:"panel mb-5 p-5"},Wm=["value"],Km=["value"],Gm=["value"],qm={class:"font-mono text-sm text-ink"},Ym={key:3},Jm={key:0,class:"mb-5 flex items-center gap-1 overflow-x-auto border-b border-line"},Xm=["onClick"],Qm={class:"panel mb-5 p-5"},eg={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},tg={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},ng={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},ig={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},og={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},sg={key:0},ag={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},rg={class:"font-semibold text-ink-secondary"},lg={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},ug={key:7,class:"my-4 rounded-lg border border-line bg-surface-2 p-4","data-keywords":"credits usage quota remaining daily allowance rate limit"},cg={class:"flex items-center justify-between gap-3"},dg={class:"flex items-center gap-2 text-sm font-semibold text-ink"},fg={key:0,class:"text-[11px] text-ink-muted"},hg={class:"mt-2 flex items-baseline gap-1.5"},pg={class:"font-mono text-2xl font-semibold text-ink"},mg={class:"text-sm text-ink-muted"},gg={class:"mt-2 h-2 w-full overflow-hidden rounded-full bg-line"},vg={class:"mt-2 text-xs text-ink-muted"},_g={class:"mt-2 text-sm text-ink"},bg={class:"font-semibold"},yg={class:"mt-1 text-xs text-ink-muted"},xg={key:1,class:"mt-2 text-xs text-ink-muted"},wg={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},kg={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Sg={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Tg={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Pg={key:1,class:"flex flex-col items-end gap-2"},Cg={key:0,value:"__auto__"},Lg=["label"],Ag=["value"],Mg={key:0,class:"w-64 text-right text-[11px] leading-snug text-ink-muted"},Eg={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Og={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},zg={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},$g={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Ig={key:8,class:"border-b border-line py-3 text-xs text-amber-fg"},Ng={class:"mt-4 flex flex-wrap items-center gap-3"},Dg=["disabled"],Fg={key:1,class:"flex items-center gap-2",title:"Bounding box used for Test connection — smaller areas cost fewer OpenSky credits"},Rg=["label"],Bg=["value"],Ug=["disabled"],Vg={key:3,class:"text-xs text-danger-fg"},Zg={class:"panel mb-5 p-5"},Hg={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},jg={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},Wg={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},Kg={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},Gg={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},qg={key:0},Yg={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},Jg={class:"font-semibold text-ink-secondary"},Xg={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},Qg={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},ev={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},tv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},nv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},iv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},ov={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},sv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},av={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},rv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},lv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},uv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},cv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},dv={key:7,class:"my-4 rounded-lg border border-line bg-surface-2 p-4","data-keywords":"usage quota rate limit calls per minute remaining left api"},fv={class:"flex items-center justify-between gap-3"},hv={class:"flex items-center gap-2 text-sm font-semibold text-ink"},pv={key:0,class:"text-[11px] text-ink-muted"},mv={class:"mt-2 flex items-baseline gap-1.5"},gv={class:"font-mono text-2xl font-semibold text-ink"},vv={class:"text-sm text-ink-muted"},_v={key:0,class:"mt-2 h-2 w-full overflow-hidden rounded-full bg-line"},bv={class:"mt-2 text-xs text-ink-muted"},yv={key:1,class:"mt-2 text-xs text-ink-muted"},xv={class:"mt-4 flex flex-wrap items-center gap-3"},wv=["disabled"],kv=["disabled"],Sv={key:2,class:"text-xs text-danger-fg"},Tv={key:3,class:"text-[11px] text-ink-muted"},Pv={class:"panel mb-5 p-5"},Cv={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},Lv={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},Av={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},Mv={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},Ev={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},Ov={key:0},zv={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},$v={class:"font-semibold text-ink-secondary"},Iv={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},Nv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},Dv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Fv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Rv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Bv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Uv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Vv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Zv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Hv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},jv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Wv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Kv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Gv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},qv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Yv={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},Jv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},Xv={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},Qv={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},e_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},t_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},n_={class:"mt-4 flex flex-wrap items-center gap-3"},i_=["disabled"],o_=["disabled"],s_={key:2,class:"text-xs text-danger-fg"},a_={key:3,class:"text-[11px] text-ink-muted"},r_={class:"panel mb-5 p-5"},l_={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},u_={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},c_={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},d_={key:1,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},f_={key:4,class:"border-b border-line py-3 text-xs text-amber-fg"},h_={key:0},p_={key:5,class:"border-b border-line py-3 text-xs text-ink-muted"},m_={class:"font-semibold text-ink-secondary"},g_={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},v_={key:0,class:"inline-flex items-center gap-2 break-all font-mono text-sm text-ink"},__={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},b_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},y_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},x_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},w_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},k_={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},S_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},T_={key:0,class:"inline-flex items-center gap-2 font-mono text-sm text-ink"},P_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},C_={class:"mt-4 flex flex-wrap items-center gap-3"},L_=["disabled"],A_=["disabled"],M_={key:2,class:"text-xs text-danger-fg"},E_={key:3,class:"text-[11px] text-ink-muted"},O_={key:3,class:"panel mb-5 p-5"},z_={class:"mb-4 flex items-start gap-3 border-b border-line pb-4"},$_={class:"grid h-10 w-10 place-items-center rounded-lg bg-accent-soft text-accent-soft-fg"},I_={key:0,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},N_={key:1,class:"mb-4 rounded-lg border border-line bg-surface-2 px-4 py-3 text-xs text-ink-secondary"},D_={key:2,class:"mb-4 flex flex-col gap-2 border-b border-line pb-4 sm:flex-row sm:items-center sm:justify-between"},F_={key:5,class:"border-b border-line py-3 text-xs text-amber-fg"},R_={key:0},B_={key:6,class:"border-b border-line py-3 text-xs text-ink-muted"},U_={class:"font-semibold text-ink-secondary"},V_={key:7,class:"border-b border-line py-3 text-xs text-ink-muted"},Z_={class:"flex w-full flex-col gap-2"},H_={class:"break-all font-mono text-sm text-ink"},j_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},W_={key:1,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},K_={key:0,class:"text-xs text-ink-muted"},G_={key:1,class:"border-b border-line py-3 text-xs text-ink-muted"},q_={key:0,class:"inline-flex items-center gap-2 text-sm text-ink"},Y_={key:0,class:"inline-flex items-center gap-1 rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold text-ink-secondary"},J_={class:"mt-4 flex flex-wrap items-center gap-3"},X_=["disabled"],Q_=["disabled"],e1={key:2,class:"text-xs text-danger-fg"},t1={key:3,class:"text-[11px] text-ink-muted"},n1={key:4,class:"panel mb-5 p-5"},i1={class:"flex items-center gap-4"},o1=["src"],s1={key:1,class:"grid h-16 w-16 place-items-center rounded-full bg-[var(--navy-800)] text-lg font-bold text-white"},a1={class:"flex gap-2"},r1={class:"btn-ghost cursor-pointer"},l1={class:"mt-1 text-right text-[11px] text-ink-muted"},u1={key:5,class:"panel mb-5 p-5"},c1={class:"flex items-center gap-3"},d1={key:0,class:"mt-4 rounded-lg border border-line bg-surface-2 p-4"},f1={class:"flex flex-wrap items-center gap-4"},h1={class:"min-w-0"},p1={class:"mt-1 select-all font-mono text-sm font-bold text-ink"},m1={class:"mt-3 flex items-center gap-2"},g1={key:0,class:"mt-2 text-xs text-danger-fg"},v1={key:1,class:"mt-4 rounded-lg border border-line bg-surface-2 p-4"},_1={class:"mt-2 grid grid-cols-2 gap-1 font-mono text-xs text-ink-secondary sm:grid-cols-4"},b1={class:"rounded-lg border border-line bg-surface-2 p-3"},y1={class:"flex items-center gap-3"},x1={class:"grid h-9 w-9 place-items-center rounded-full bg-accent-soft text-accent-soft-fg"},w1={class:"min-w-0 flex-1"},k1={class:"text-sm font-semibold text-ink"},S1={class:"font-mono text-[11px] text-ink-muted"},T1={key:6,class:"mb-5"},P1={key:0,class:"panel mb-5 p-5"},C1={class:"grid max-w-[520px] gap-2"},L1={class:"flex flex-wrap gap-2"},A1=["disabled","title"],M1=["value"],E1=["value"],O1={class:"flex items-center gap-2 py-1 text-sm text-ink-secondary"},z1={class:"flex items-center gap-3"},$1=["disabled"],I1={key:0,class:"text-xs text-danger-fg"},N1={key:1,class:"text-xs text-ink-muted"},D1={key:1,class:"panel mb-5 p-5"},F1={class:"grid max-w-[520px] gap-2"},R1={class:"flex flex-wrap gap-2"},B1=["value"],U1=["value"],V1={key:1,class:"text-xs text-ink-muted"},Z1={class:"font-semibold text-ink-secondary"},H1={class:"flex items-center gap-3"},j1=["disabled"],W1={key:0,class:"text-xs text-danger-fg"},K1={class:"panel overflow-hidden p-0"},G1={class:"flex items-center justify-between px-5 py-4"},q1=["disabled"],Y1={key:0,class:"px-5 pb-5 text-sm text-danger-fg"},J1={key:1,class:"px-5 pb-8 text-sm text-ink-muted"},X1={key:2,class:"overflow-x-auto"},Q1={class:"w-full border-collapse text-sm"},eb={class:"text-left"},tb={class:"px-5 py-3"},nb={class:"text-ink"},ib={key:0,class:"ml-1.5 text-[11px] text-ink-muted"},ob={class:"px-5 py-3"},sb={class:"px-5 py-3"},ab={class:"px-5 py-3"},rb={class:"px-5 py-3 text-right"},lb=["onClick"],ub={key:1,class:"inline-flex items-center gap-1.5"},cb=["onClick"],db=["onClick"],fb={key:7,class:"mb-5"},hb={key:0,class:"panel mb-5 p-5"},pb={class:"grid max-w-[520px] gap-2"},mb={class:"flex items-center gap-3"},gb={key:0,class:"text-xs text-danger-fg"},vb={key:1,class:"panel mb-5 p-5"},_b={class:"grid max-w-[520px] gap-2"},bb={class:"flex items-center gap-3"},yb=["disabled"],xb={key:0,class:"text-xs text-danger-fg"},wb={class:"panel overflow-hidden p-0"},kb={key:0,class:"px-5 pb-8 text-sm text-ink-muted"},Sb={key:1,class:"overflow-x-auto"},Tb={class:"w-full border-collapse text-sm"},Pb={class:"text-left"},Cb={class:"px-5 py-3"},Lb={class:"inline-flex items-center gap-2 text-ink"},Ab={class:"px-5 py-3 text-ink-secondary"},Mb={class:"px-5 py-3 text-right"},Eb=["onClick"],Ob={key:1,class:"inline-flex items-center gap-1.5"},zb=["onClick"],$b=["disabled","title","onClick"],Ib={key:8,class:"mb-5"},Nb={class:"panel mb-5 p-5"},Db={class:"btn-ghost cursor-pointer"},Fb={key:0,class:"mt-2 text-xs text-ink-muted"},Rb={class:"rounded-lg border p-5",style:{"border-color":"color-mix(in srgb, var(--danger) 35%, transparent)",background:"var(--danger-soft)"}},Bb={class:"flex items-center gap-2 text-danger-fg"},Ub={class:"mt-4 rounded-lg border border-line bg-surface-1 p-4"},Vb={class:"mt-3 flex items-start gap-2 text-sm text-ink-secondary"},Zb={class:"mt-3"},Hb={class:"eyebrow mb-1 block"},jb={class:"text-ink"},Wb=["placeholder"],Kb={class:"mt-4 flex flex-wrap items-center gap-3"},Gb=["disabled"],qb=["disabled"],Yb={key:2,class:"text-xs text-ink-muted"},Jb={key:0,class:"mt-3 rounded border border-line bg-surface-2 px-3 py-2 text-xs text-ink-secondary"},Xb={key:0,class:"fixed bottom-5 right-5 z-20 flex items-center gap-2 rounded-lg border border-line bg-surface-1 px-4 py-2.5 text-sm text-ink shadow-md"},Lu="pv.opensky.health",Au="pv.filetransfer.health",Mu="pv.webdav.health",Eu="pv.openweather.health",Ou="pv.localstorage.health",Qb={__name:"Settings",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},emits:["logout"],setup(t,{emit:i}){const s=t,l=i,u=ce(()=>s.role==="superadmin"),f=ce(()=>s.role==="admin"||s.role==="superadmin");function h(g){return g==="superadmin"?"Superadmin":g==="admin"?"Admin":"User"}function _(g){return g==="superadmin"||g==="admin"?"shield":"user"}function y(g){return g==="superadmin"||g==="admin"?C.accent:C.neutral}const C={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},T=ce(()=>{const g=[{id:"account",label:"Account",icon:"user",kw:"name username email password verification login credentials role"},{id:"appearance",label:"Appearance",icon:"sliders",kw:"theme light dark system language region font size accessibility date time format motion"},{id:"integrations",label:"Integrations",icon:"radio",kw:"opensky flights adsb aircraft plugin oauth credentials bounding box plan connection ftp sftp ftps file transfer server host upload download local storage folder drive isolated private read only webdav nextcloud owncloud dav url https openweather weather forecast temperature api key units calls per minute usage limit quota"},{id:"profile",label:"Profile",icon:"image",kw:"avatar photo display name bio public"},{id:"security",label:"Privacy & Security",icon:"shield",kw:"two factor authentication 2fa sessions devices logout security privacy"}];return f.value&&g.push({id:"team",label:"User management",icon:"users",kw:"users team members add remove create delete role admin permissions rights organization"}),u.value&&g.push({id:"organizations",label:"Organizations",icon:"grid",kw:"organization org tenant company create rename delete members"}),g.push({id:"advanced",label:"Advanced",icon:"alertTriangle",kw:"export import data delete account danger zone",danger:!0}),g}),M=Y("account"),H=Y("");uc("settingsSearch",H);const j=ce(()=>H.value.trim().length>0),K=ce(()=>H.value.trim().toLowerCase());function F(g){return K.value?(g.label+" "+g.kw).toLowerCase().includes(K.value)||X(g.id):!0}const te={account:["full name","username","email address verification verify","password change current new"],appearance:["theme light dark system","language","region","font size accessibility","reduce motion","date format","time format clock"],integrations:["opensky live flights","enable plugin","oauth client id secret","plan credits","bounding box","test connection","file transfer ftp sftp ftps","server host port username password","private key passphrase","base path directory","local storage folder drive","private isolated folder","read only access mode","webdav nextcloud owncloud dav","server url username password tls","base path directory folder","openweather weather forecast","api key units metric imperial","default latitude longitude language","calls per minute limit usage quota","api call usage today rate limit"],profile:["profile photo avatar","display name","bio about","show email public"],security:["two factor authentication","active sessions devices","sign out"],team:["add user create account","members list role admin remove delete","organization org assign"],organizations:["add organization create","rename organization","delete organization members"],advanced:["export data download","import data upload","delete account permanent danger"]};function X(g){return K.value?(te[g]||[]).some(c=>c.includes(K.value)):!0}const fe=ce(()=>j.value?T.value.filter(F):T.value.filter(g=>g.id===M.value)),Se=ce({get:()=>Oo.value,set:g=>Ha(g)}),de=[{value:"light",label:"Light",icon:"sun"},{value:"dark",label:"Dark",icon:"moon"},{value:"system",label:"System",icon:"monitor"}],Fe=[{value:"sm",label:"Small"},{value:"md",label:"Default"},{value:"lg",label:"Large"}],Oe=[{value:"12",label:"12-hour"},{value:"24",label:"24-hour"}],Te=[["en","English"],["es","Español"],["de","Deutsch"],["fr","Français"],["pl","Polski"],["ja","日本語"]],Ze=km(),he=ce(()=>(Ze.find(([g])=>g===be.region)||[null,be.region])[1]),Q=[["MDY","MM/DD/YYYY"],["DMY","DD/MM/YYYY"],["YMD","YYYY/MM/DD"],["ISO","YYYY-MM-DD"]],B=Y(Date.now());let O=null;const N=ce(()=>Su(B.value)),$=gt({loaded:!1,available:!1,orgEnabled:!0,allowAnonymous:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Ye=Y("user"),we=gt({clientId:"",clientSecret:"",plan:"",bbox:""}),ge=Y(""),ue=Y(!1),ft=Y(!1),pe=Y(null),Ue=Y(null),Ve=ce(()=>pe.value&&pe.value.credits||null),wt=ce(()=>{const g=Ve.value;return!g||!g.daily||g.remaining==null?null:Math.max(0,Math.min(100,Math.round(g.remaining/g.daily*100)))}),st=ce(()=>{const g=wt.value;return g==null?"bg-accent":g<=10?"bg-danger":g<=30?"bg-amber":"bg-success"});function Le(g){return typeof g=="number"?g.toLocaleString():g}function De(){if(!Ue.value)return"";const g=Math.max(0,Math.round((Date.now()-Ue.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const q=Math.round(c/60);return q<24?`${q} h ago`:`${Math.round(q/24)} d ago`}function zt(){try{pe.value&&localStorage.setItem(Lu,JSON.stringify({health:pe.value,ts:Ue.value}))}catch{}}function At(){try{const g=localStorage.getItem(Lu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(pe.value=c.health,Ue.value=c.ts||null)}catch{}}const Ut=[{value:"",label:"Not set"},{value:"anonymous",label:"Anonymous"},{value:"standard",label:"Standard"},{value:"contributor",label:"Contributor"}],Pt=[{value:"user",label:"My settings",icon:"user"},{value:"org",label:"Organization",icon:"users"}],kt=[{label:"World",options:[{value:"-90,-180,90,180",label:"World"}]},{label:"Continents",options:[{value:"34,-25,72,45",label:"Europe"},{value:"-35,-18,38,52",label:"Africa"},{value:"5,25,82,180",label:"Asia"},{value:"7,-168,72,-52",label:"North America"},{value:"-56,-82,13,-34",label:"South America"},{value:"-48,110,-10,180",label:"Oceania"}]},{label:"European countries",options:wm()},{label:"Other countries",options:[{value:"24,-125,49.5,-66.5",label:"United States"},{value:"41.7,-141,83.1,-52.6",label:"Canada"},{value:"-43.6,113.3,-10.7,153.6",label:"Australia"},{value:"24,122.9,45.5,145.8",label:"Japan"}]}],x=kt.flatMap(g=>g.options);function b(g){const c=String(g||"").split(",").map(k=>k.trim());if(c.length!==4)return"";const q=c.map(Number);return q.some(k=>Number.isNaN(k))?"":q.join(",")}function S(g){const c=b(g),q=c&&x.find(k=>b(k.value)===c);return q?q.label:""}const W=Y(!1),V=ce({get(){if(!ve.value&&be.autoBbox)return"__auto__";if(W.value)return"__custom__";const g=b(we.bbox),c=g&&x.find(q=>b(q.value)===g);return c?c.value:"__custom__"},set(g){if(g==="__auto__"){ve.value||(be.autoBbox=!0),W.value=!1;return}if(ve.value||(be.autoBbox=!1),g==="__custom__"){W.value=!0;return}W.value=!1,we.bbox=g}}),G=ce(()=>V.value==="__custom__"),re=ce(()=>V.value==="__auto__"),ae=ce(()=>$.isSuperadmin),oe=ce(()=>$.isSuperadmin?"user":Ye.value),ee=ce(()=>$.scopes[oe.value]||{editableLayer:"user",fields:{}}),ve=ce(()=>oe.value==="org");function se(g){return ee.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function ke(g){return ae.value||se(g).locked}function Pe(g){const c=se(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function Re(){we.clientId=se("clientId").own||"",we.clientSecret=se("clientSecret").own||"",we.plan=se("plan").own||"",we.bbox=se("bbox").own||"",W.value=!1}function Ke(g){$.available=!!g.available,$.orgEnabled=g.orgEnabled!==!1,$.allowAnonymous=!!g.allowAnonymous,$.enabled=!!g.enabled,$.canEditOrg=!!g.canEditOrg,$.isSuperadmin=!!g.isSuperadmin,$.scopes=g.scopes||{},Ye.value==="org"&&!$.canEditOrg&&(Ye.value="user"),Re(),$.loaded=!0}Bt(Ye,()=>{ge.value="",Re()});async function Ge(){At();const{ok:g,body:c}=await hp();g&&Ke(c)}async function pt(g){const c=ve.value;c?$.orgEnabled=g:$.enabled=g;const{ok:q,body:k}=await bu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});q?(Ke(k),We(c?g?"OpenSky enabled for your organization.":"OpenSky disabled for your organization.":g?"OpenSky enabled.":"OpenSky disabled.")):(c?$.orgEnabled=!g:$.enabled=!g,We(k.error||"Could not update."))}async function ht(){ge.value="",ue.value=!0;const g={};for(const Be of["clientId","clientSecret","plan","bbox"])ke(Be)||(g[Be]=we[Be]);const c={scope:oe.value,config:g};ve.value||(c.enabled=$.enabled);const{ok:q,body:k}=await bu(c);if(ue.value=!1,!q){ge.value=k.error||"Could not save settings.";return}Ke(k),We(ve.value?"Organization OpenSky settings saved.":"OpenSky settings saved.")}const Vt=[{label:"World",options:[{value:"-90,-180,90,180",label:"World"}]},{label:"Continents",options:[{value:"34,-25,72,45",label:"Europe"},{value:"-35,-18,38,52",label:"Africa"},{value:"5,25,82,180",label:"Asia"},{value:"7,-168,72,-52",label:"North America"},{value:"-56,-82,13,-34",label:"South America"},{value:"-48,110,-10,180",label:"Oceania"}]},...Tm()],Jt=Vt.flatMap(g=>g.options),Zt=Y(""),pn=Y(!1),Ct=ce({get(){if(pn.value)return"__custom__";if(!Zt.value)return"__default__";const g=b(Zt.value),c=g&&Jt.find(q=>b(q.value)===g);return c?c.value:"__custom__"},set(g){if(g==="__default__"){pn.value=!1,Zt.value="";return}if(g==="__custom__"){pn.value=!0;return}pn.value=!1,Zt.value=g}}),$t=ce(()=>Ct.value==="__custom__");async function kn(){ft.value=!0,pe.value=null;const{ok:g,body:c}=await pp((Zt.value||"").trim()||void 0);ft.value=!1,pe.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},Ue.value=Date.now(),zt()}function zi(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const at=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Sn=Y("user"),$i=["protocol","host","port","username","password","privateKey","keyPassphrase","hostKeyFingerprint","insecureSkipVerify","basePath"],rt=gt(Object.fromEntries($i.map(g=>[g,""]))),hi=Y(""),pi=Y(!1),Ii=Y(!1),Gt=Y(null),jn=Y(null),U=[{value:"sftp",label:"SFTP"},{value:"ftps",label:"FTPS"},{value:"ftp",label:"FTP"}],E=[{value:"false",label:"Verify certificate"},{value:"true",label:"Skip verification"}],Me=ce(()=>at.isSuperadmin),tt=ce(()=>at.isSuperadmin?"user":Sn.value),It=ce(()=>at.scopes[tt.value]||{editableLayer:"user",fields:{}}),St=ce(()=>tt.value==="org"),Et=ce(()=>(_t("protocol")?Z("protocol").effective:rt.protocol)||"sftp");function Z(g){return It.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function _t(g){return Me.value||Z(g).locked}function bt(g){const c=Z(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function oa(g){return(U.find(c=>c.value===g)||{}).label||g||"—"}function cs(){for(const g of $i)rt[g]=Z(g).own||"";rt.protocol||(rt.protocol="sftp"),rt.insecureSkipVerify||(rt.insecureSkipVerify="false")}function no(g){at.available=!!g.available,at.orgEnabled=g.orgEnabled!==!1,at.enabled=!!g.enabled,at.canEditOrg=!!g.canEditOrg,at.isSuperadmin=!!g.isSuperadmin,at.scopes=g.scopes||{},Sn.value==="org"&&!at.canEditOrg&&(Sn.value="user"),cs(),at.loaded=!0}Bt(Sn,()=>{hi.value="",cs()});function sa(){if(!jn.value)return"";const g=Math.max(0,Math.round((Date.now()-jn.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const q=Math.round(c/60);return q<24?`${q} h ago`:`${Math.round(q/24)} d ago`}function Ni(){try{Gt.value&&localStorage.setItem(Au,JSON.stringify({health:Gt.value,ts:jn.value}))}catch{}}function aa(){try{const g=localStorage.getItem(Au);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Gt.value=c.health,jn.value=c.ts||null)}catch{}}async function ir(){aa();const{ok:g,body:c}=await gp();g&&no(c)}async function ra(g){const c=St.value;c?at.orgEnabled=g:at.enabled=g;const{ok:q,body:k}=await yu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});q?(no(k),We(c?g?"File transfer enabled for your organization.":"File transfer disabled for your organization.":g?"File transfer enabled.":"File transfer disabled.")):(c?at.orgEnabled=!g:at.enabled=!g,We(k.error||"Could not update."))}async function or(){hi.value="",pi.value=!0;const g={};for(const Be of $i)_t(Be)||(g[Be]=rt[Be]);const c={scope:tt.value,config:g};St.value||(c.enabled=at.enabled);const{ok:q,body:k}=await yu(c);if(pi.value=!1,!q){hi.value=k.error||"Could not save settings.";return}no(k),We(St.value?"Organization file-transfer settings saved.":"File-transfer settings saved.")}async function sr(){Ii.value=!0,Gt.value=null;const{ok:g,body:c}=await vp();Ii.value=!1,Gt.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},jn.value=Date.now(),Ni()}function la(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const lt=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),Wn=Y("user"),ds=["baseURL","username","password","insecureSkipVerify","basePath"],Xt=gt(Object.fromEntries(ds.map(g=>[g,""]))),io=Y(""),zo=Y(!1),$o=Y(!1),Tn=Y(null),$n=Y(null),ua=[{value:"false",label:"Verify certificate"},{value:"true",label:"Skip verification"}],Io=ce(()=>lt.isSuperadmin),mi=ce(()=>lt.isSuperadmin?"user":Wn.value),it=ce(()=>lt.scopes[mi.value]||{editableLayer:"user",fields:{}}),ot=ce(()=>mi.value==="org");function Pn(g){return it.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function Cn(g){return Io.value||Pn(g).locked}function qt(g){const c=Pn(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function No(){for(const g of ds)Xt[g]=Pn(g).own||"";Xt.insecureSkipVerify||(Xt.insecureSkipVerify="false")}function He(g){lt.available=!!g.available,lt.orgEnabled=g.orgEnabled!==!1,lt.enabled=!!g.enabled,lt.canEditOrg=!!g.canEditOrg,lt.isSuperadmin=!!g.isSuperadmin,lt.scopes=g.scopes||{},Wn.value==="org"&&!lt.canEditOrg&&(Wn.value="user"),No(),lt.loaded=!0}Bt(Wn,()=>{io.value="",No()});function Lt(){if(!$n.value)return"";const g=Math.max(0,Math.round((Date.now()-$n.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const q=Math.round(c/60);return q<24?`${q} h ago`:`${Math.round(q/24)} d ago`}function fs(){try{Tn.value&&localStorage.setItem(Mu,JSON.stringify({health:Tn.value,ts:$n.value}))}catch{}}function Do(){try{const g=localStorage.getItem(Mu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Tn.value=c.health,$n.value=c.ts||null)}catch{}}async function mn(){Do();const{ok:g,body:c}=await yp();g&&He(c)}async function ca(g){const c=ot.value;c?lt.orgEnabled=g:lt.enabled=g;const{ok:q,body:k}=await xu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});q?(He(k),We(c?g?"WebDAV enabled for your organization.":"WebDAV disabled for your organization.":g?"WebDAV enabled.":"WebDAV disabled.")):(c?lt.orgEnabled=!g:lt.enabled=!g,We(k.error||"Could not update."))}async function Fo(){io.value="",zo.value=!0;const g={};for(const Be of ds)Cn(Be)||(g[Be]=Xt[Be]);const c={scope:mi.value,config:g};ot.value||(c.enabled=lt.enabled);const{ok:q,body:k}=await xu(c);if(zo.value=!1,!q){io.value=k.error||"Could not save settings.";return}He(k),We(ot.value?"Organization WebDAV settings saved.":"WebDAV settings saved.")}async function gi(){$o.value=!0,Tn.value=null;const{ok:g,body:c}=await xp();$o.value=!1,Tn.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},$n.value=Date.now(),fs()}function Mt(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const Xe=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,scopes:{}}),In=Y("user"),vi=["apiKey","units","lat","lon","lang","callsPerMinute"],Ht=gt(Object.fromEntries(vi.map(g=>[g,""]))),Kn=Y(""),Di=Y(!1),Fi=Y(!1),Qt=Y(null),Gn=Y(null),Ro=[{value:"",label:"Not set"},{value:"metric",label:"Metric (°C)"},{value:"imperial",label:"Imperial (°F)"},{value:"standard",label:"Standard (K)"}],Ri=ce(()=>Xe.isSuperadmin),Bo=ce(()=>Xe.isSuperadmin?"user":In.value),hs=ce(()=>Xe.scopes[Bo.value]||{editableLayer:"user",fields:{}}),Ln=ce(()=>Bo.value==="org");function ze(g){return hs.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function jt(g){return Ri.value||ze(g).locked}function Je(g){const c=ze(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function ps(){for(const g of vi)Ht[g]=ze(g).own||""}function oo(g){Xe.available=!!g.available,Xe.orgEnabled=g.orgEnabled!==!1,Xe.enabled=!!g.enabled,Xe.canEditOrg=!!g.canEditOrg,Xe.isSuperadmin=!!g.isSuperadmin,Xe.scopes=g.scopes||{},In.value==="org"&&!Xe.canEditOrg&&(In.value="user"),ps(),Xe.loaded=!0}Bt(In,()=>{Kn.value="",ps()});function Uo(){if(!Gn.value)return"";const g=Math.max(0,Math.round((Date.now()-Gn.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const q=Math.round(c/60);return q<24?`${q} h ago`:`${Math.round(q/24)} d ago`}function ms(){try{Qt.value&&localStorage.setItem(Eu,JSON.stringify({health:Qt.value,ts:Gn.value}))}catch{}}function _i(){try{const g=localStorage.getItem(Eu);if(!g)return;const c=JSON.parse(g);c&&c.health&&(Qt.value=c.health,Gn.value=c.ts||null)}catch{}}async function gs(){_i();const{ok:g,body:c}=await wp();g&&oo(c)}async function Bi(g){const c=Ln.value;c?Xe.orgEnabled=g:Xe.enabled=g;const{ok:q,body:k}=await wu(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});q?(oo(k),We(c?g?"OpenWeather enabled for your organization.":"OpenWeather disabled for your organization.":g?"OpenWeather enabled.":"OpenWeather disabled.")):(c?Xe.orgEnabled=!g:Xe.enabled=!g,We(k.error||"Could not update."))}async function Ft(){Kn.value="",Di.value=!0;const g={};for(const Be of vi)jt(Be)||(g[Be]=Ht[Be]);const c={scope:Bo.value,config:g};Ln.value||(c.enabled=Xe.enabled);const{ok:q,body:k}=await wu(c);if(Di.value=!1,!q){Kn.value=k.error||"Could not save settings.";return}oo(k),We(Ln.value?"Organization OpenWeather settings saved.":"OpenWeather settings saved.")}async function bi(){Fi.value=!0,Qt.value=null;const{ok:g,body:c}=await kp();Fi.value=!1,Qt.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."},Gn.value=Date.now(),ms()}function da(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const Ui=ce(()=>Qt.value&&Qt.value.usage||null),vs=ce(()=>{const g=Ui.value;return!g||!g.minuteLimit?null:Math.max(0,Math.min(100,Math.round(g.minuteUsed/g.minuteLimit*100)))}),fa=ce(()=>{const g=vs.value;return g==null?"bg-accent":g>=90?"bg-danger":g>=70?"bg-amber":"bg-success"}),Ae=gt({loaded:!1,available:!1,orgEnabled:!0,enabled:!1,canEditOrg:!1,isSuperadmin:!1,isOrgUser:!1,mounts:[],privateFolder:!1,privateEnabled:!1,allowPrivate:!0,rootConfigured:!1,scopes:{}}),Vi=Y("user"),so=Y(""),qe=Y(""),Vo=Y(!1),en=Y(!1),ln=Y(null),yi=Y(null),ao=Y({}),Zo=[{value:"",label:"Inherit"},{value:"false",label:"Read-write"},{value:"true",label:"Read-only"}],_s=ce(()=>Ae.isSuperadmin),Ho=ce(()=>Ae.isSuperadmin?"user":Vi.value),ar=ce(()=>Ae.scopes[Ho.value]||{editableLayer:"user",fields:{}}),gn=ce(()=>Ho.value==="org");function Zi(g){return ar.value.fields[g]||{effective:"",own:"",source:"unset",locked:!1}}function ha(g){return _s.value||Zi(g).locked}function An(g){const c=Zi(g).source;return c==="global"?"Set by administrator":c==="org"?"Set by your organization":""}function rr(g){return(Zo.find(c=>c.value===g)||{}).label||"Inherit"}function bs(){so.value=Zi("readOnly").own||""}function vn(g){Ae.available=!!g.available,Ae.orgEnabled=g.orgEnabled!==!1,Ae.enabled=!!g.enabled,Ae.canEditOrg=!!g.canEditOrg,Ae.isSuperadmin=!!g.isSuperadmin,Ae.isOrgUser=!!g.isOrgUser,Ae.mounts=Array.isArray(g.mounts)?g.mounts:[],Ae.privateFolder=!!g.privateFolder,Ae.privateEnabled=!!g.privateEnabled,Ae.allowPrivate=g.allowPrivate!==!1,Ae.rootConfigured=!!g.rootConfigured,Ae.scopes=g.scopes||{},Vi.value==="org"&&!Ae.canEditOrg&&(Vi.value="user"),bs(),Ae.loaded=!0}Bt(Vi,()=>{qe.value="",bs()});function pa(){if(!yi.value)return"";const g=Math.max(0,Math.round((Date.now()-yi.value)/1e3));if(g<60)return"just now";const c=Math.round(g/60);if(c<60)return`${c} min ago`;const q=Math.round(c/60);return q<24?`${q} h ago`:`${Math.round(q/24)} d ago`}function ma(){try{ln.value&&localStorage.setItem(Ou,JSON.stringify({health:ln.value,ts:yi.value}))}catch{}}function ys(){try{const g=localStorage.getItem(Ou);if(!g)return;const c=JSON.parse(g);c&&c.health&&(ln.value=c.health,yi.value=c.ts||null)}catch{}}async function lr(){ys();const{ok:g,body:c}=await _p();g&&vn(c)}async function xs(g){const c=gn.value;c?Ae.orgEnabled=g:Ae.enabled=g;const{ok:q,body:k}=await Ma(c?{scope:"org",enabled:g}:{scope:"user",enabled:g});q?(vn(k),We(c?g?"Local storage enabled for your organization.":"Local storage disabled for your organization.":g?"Local storage enabled.":"Local storage disabled.")):(c?Ae.orgEnabled=!g:Ae.enabled=!g,We(k.error||"Could not update."))}async function ga(g){Ae.privateFolder=g;const{ok:c,body:q}=await Ma({scope:"user",privateFolder:g});c?(vn(q),We(g?"Private folder enabled.":"Private folder disabled.")):(Ae.privateFolder=!g,We(q.error||"Could not update."))}async function ur(g){Ae.allowPrivate=g;const{ok:c,body:q}=await Ma({scope:"org",allowPrivate:g});c?(vn(q),We(g?"Members may now create private folders.":"Private folders disabled for your organization.")):(Ae.allowPrivate=!g,We(q.error||"Could not update."))}async function cr(){qe.value="",Vo.value=!0;const g={};ha("readOnly")||(g.readOnly=so.value);const c={scope:Ho.value,config:g};gn.value||(c.enabled=Ae.enabled);const{ok:q,body:k}=await Ma(c);if(Vo.value=!1,!q){qe.value=k.error||"Could not save settings.";return}vn(k),We(gn.value?"Organization local-storage settings saved.":"Local-storage settings saved.")}async function ws(){en.value=!0,ln.value=null,ao.value={};const{ok:g,body:c}=await bp();en.value=!1,ln.value=g&&c.health?c.health:{status:"down",detail:c.error||"Probe failed."};const q={};if(Array.isArray(c.mounts))for(const k of c.mounts)q[k.id]={status:k.status,detail:k.detail};ao.value=q,yi.value=Date.now(),ma()}function va(g){return g==="ok"?C.success:g==="degraded"?C.warning:C.danger}const _a=[{id:"apis-external",label:"APIs — External",icon:"globe"},{id:"drives-external",label:"Drives — External",icon:"server"},{id:"drives-local",label:"Drives — Local",icon:"monitor"}],jo=Y("apis-external");function Hi(g){return j.value||jo.value===g}const Nn=Y("");let ks=null;function We(g){Nn.value=g,clearTimeout(ks),ks=setTimeout(()=>Nn.value="",2200)}const yt=gt({current:"",next:"",confirm:""}),xi=Y(""),Ss=Y(!1);function dr(){if(Ss.value=!1,!yt.current)return xi.value="Enter your current password.";if(yt.next.length<8)return xi.value="New password must be at least 8 characters.";if(yt.next!==yt.confirm)return xi.value="New passwords do not match.";xi.value="Validated. Connecting to the account service is pending — no password endpoint yet.",yt.current=yt.next=yt.confirm=""}const ro=Y("");function Ts(){ro.value="Verification link would be sent once the account service is wired up."}function fr(g){const c=g.target.files&&g.target.files[0];if(!c)return;if(c.size>1.5*1024*1024){We("Image too large (max ~1.5 MB).");return}const q=new FileReader;q.onload=()=>{be.avatar=String(q.result),We("Photo updated.")},q.readAsDataURL(c)}function hr(){be.avatar="",We("Photo removed.")}const ba=ce(()=>{var q,k,Be;const c=(be.displayName||be.name||s.email||"PV").split("@")[0].split(/[.\-_ ]+/).filter(Boolean);return((((q=c[0])==null?void 0:q[0])||"P")+(((k=c[1])==null?void 0:k[0])||((Be=c[0])==null?void 0:Be[1])||"V")).toUpperCase()}),lo=Y(!1),_n=Y(""),qn=Y(""),uo=Y(""),bn=Y([]);function Ps(g){const c="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";let q="";for(let k=0;kPs(4).toLowerCase()+"-"+Ps(4).toLowerCase()),uo.value=""}function co(){be.twoFactor=!1,bn.value=[],lo.value=!1}const Mn=navigator.userAgent;function Wo(){return/Edg\//.test(Mn)?"Edge":/OPR\//.test(Mn)?"Opera":/Chrome\//.test(Mn)?"Chrome":/Firefox\//.test(Mn)?"Firefox":/Safari\//.test(Mn)?"Safari":"Browser"}function mr(){return/Windows/.test(Mn)?"Windows":/Mac OS X/.test(Mn)?"macOS":/Android/.test(Mn)?"Android":/iPhone|iPad/.test(Mn)?"iOS":/Linux/.test(Mn)?"Linux":"Unknown OS"}const ti=Date.now(),wi=Y([]),fo=Y(!1),Wi=Y(""),Rt=gt({email:"",password:"",role:"user",organization:""}),tn=Y(""),Ko=Y(!1),Dn=Y(""),ya=ce(()=>{const g=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];return u.value&&g.push({value:"superadmin",label:"Superadmin"}),g}),yn=Y([]);async function ni(){if(!f.value)return;const g=await rp();g.ok&&(yn.value=g.organizations.slice().sort((c,q)=>c.name.localeCompare(q.name)))}const Cs=ce(()=>{const g=yn.value.map(c=>({value:c.id,label:c.name}));return u.value&&g.unshift({value:"",label:"No organization"}),g});async function ii(){if(!f.value)return;fo.value=!0,Wi.value="";const g=await ip();if(fo.value=!1,!g.ok){Wi.value=g.status===403?"Manager role required.":"Could not load users.";return}wi.value=g.users.slice().sort((c,q)=>c.email.localeCompare(q.email))}function ki(g){try{const c=g.data||{},q=Object.keys(c)[0];return q&&c[q]&&c[q].message||g.message||g.error||"Invalid input."}catch{return g.error||"Could not create user."}}async function Ls(){tn.value="";const g=Rt.email.trim().toLowerCase();if(!g.includes("@"))return tn.value="Enter a valid email.";if(Rt.password.length<8)return tn.value="Password must be at least 8 characters.";Ko.value=!0;const c=u.value?Rt.organization:s.organization,{ok:q,body:k}=await op(g,Rt.password,Rt.role,c);if(Ko.value=!1,!q)return tn.value=ki(k);Rt.email="",Rt.password="",Rt.role="user",Rt.organization="",We("User created."),ii()}async function Go(g){const{ok:c,body:q}=await ap(g.id);if(Dn.value="",!c)return We(q.error||"Could not remove user.");We("User removed."),ii()}const Qe=gt({id:"",email:"",role:"user",verified:!1,password:"",organization:""}),En=Y(""),Ki=Y(!1),qo=ce(()=>!!Qe.id&&Qe.email===s.email);function gr(g){Dn.value="",Qe.id=g.id,Qe.email=g.email,Qe.role=g.role||"user",Qe.verified=!!g.verified,Qe.password="",Qe.organization=g.organization||"",En.value=""}function ho(){Qe.id="",En.value=""}async function vr(){En.value="";const g=Qe.email.trim().toLowerCase();if(!g.includes("@"))return En.value="Enter a valid email.";if(Qe.password&&Qe.password.length<8)return En.value="New password must be at least 8 characters (or leave blank).";const c={email:g,role:Qe.role,verified:Qe.verified};u.value&&(c.organization=Qe.organization),Qe.password&&(c.password=Qe.password),Ki.value=!0;const{ok:q,body:k}=await sp(Qe.id,c);if(Ki.value=!1,!q)return En.value=ki(k);We("User updated."),ho(),ii()}const po=gt({name:""}),mo=Y(""),go=Y(!1),vo=Y(""),Nt=gt({id:"",name:""}),Fn=Y(""),As=ce(()=>{const g={};for(const c of wi.value)c.organization&&(g[c.organization]=(g[c.organization]||0)+1);return g});async function _o(){mo.value="";const g=po.name.trim();if(!g)return mo.value="Enter an organization name.";go.value=!0;const{ok:c,body:q}=await lp(g);if(go.value=!1,!c)return mo.value=ki(q);po.name="",We("Organization created."),ni()}function _r(g){vo.value="",Nt.id=g.id,Nt.name=g.name,Fn.value=""}function Ms(){Nt.id="",Fn.value=""}async function xa(){Fn.value="";const g=Nt.name.trim();if(!g)return Fn.value="Enter an organization name.";const{ok:c,body:q}=await up(Nt.id,g);if(!c)return Fn.value=ki(q);We("Organization renamed."),Ms(),ni(),ii()}async function bo(g){const{ok:c,body:q}=await cp(g.id);if(vo.value="",!c)return We(q.error||"Could not delete organization.");We("Organization deleted."),ni()}function br(){const g={_app:"PilotVault",_kind:"settings-export",exportedAt:new Date().toISOString(),email:s.email,prefs:{...be},themeMode:Oo.value},c=new Blob([JSON.stringify(g,null,2)],{type:"application/json"}),q=URL.createObjectURL(c),k=document.createElement("a");k.href=q,k.download=`pilotvault-settings-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(k),k.click(),k.remove(),URL.revokeObjectURL(q),We("Settings exported.")}const Yn=Y("");function wa(g){const c=g.target.files&&g.target.files[0];if(!c)return;const q=new FileReader;q.onload=()=>{try{const k=JSON.parse(String(q.result)),Be=k.prefs||k;if(!ed(Be))throw new Error("bad shape");k.themeMode&&Ha(k.themeMode),ml(be.fontSize),gl(be.reduceMotion),Yn.value="Settings imported and applied."}catch{Yn.value="That file is not a valid PilotVault settings export."}},q.readAsText(c),g.target.value=""}const mt=gt({understand:!1,typed:"",cooldown:0,armed:!1,msg:""});let yo=null;const On=ce(()=>s.email||"DELETE MY ACCOUNT"),Yo=ce(()=>mt.understand&&mt.typed===On.value);function ka(){Yo.value&&(mt.armed=!0,mt.cooldown=5,clearInterval(yo),yo=setInterval(()=>{mt.cooldown--,mt.cooldown<=0&&clearInterval(yo)},1e3))}Bt(Yo,g=>{!g&&mt.armed&&(mt.armed=!1,mt.cooldown=0,clearInterval(yo))});function xo(){if(!(!mt.armed||mt.cooldown>0)){try{localStorage.removeItem("pv_prefs")}catch{}mt.msg="Account deletion requires the account service. Local data was cleared and you were signed out.",setTimeout(()=>l("logout"),900)}}return fi(()=>{O=setInterval(()=>B.value=Date.now(),1e3),ni(),ii(),Ge(),ir(),mn(),gs(),lr()}),us(()=>{clearInterval(O),clearInterval(yo),clearTimeout(ks)}),(g,c)=>(p(),m("div",Cm,[a("div",Lm,[c[72]||(c[72]=a("div",null,[a("div",{class:"eyebrow"},"Preferences"),a("h2",{class:"mt-0.5 text-[22px] font-bold tracking-tightest text-ink"},"Settings")],-1)),a("div",Am,[A(J,{name:"search",size:16,class:"text-ink-muted"}),ie(a("input",{"onUpdate:modelValue":c[0]||(c[0]=q=>H.value=q),placeholder:"Search settings…",class:"w-full border-none bg-transparent text-sm text-ink outline-none placeholder:text-ink-muted"},null,512),[[me,H.value]]),H.value?(p(),m("button",{key:0,class:"text-ink-muted hover:text-ink","aria-label":"Clear search",onClick:c[1]||(c[1]=q=>H.value="")},[A(J,{name:"x",size:15})])):I("",!0)])]),a("div",Mm,[ie(a("nav",Em,[(p(!0),m(le,null,Ie(T.value,q=>(p(),m("button",{key:q.id,class:Ce(["flex items-center gap-2.5 rounded px-3 py-2.5 text-left text-sm transition",[M.value===q.id?q.danger?"bg-danger-soft font-semibold text-danger-fg":"bg-accent-soft font-semibold text-accent-soft-fg":q.danger?"font-medium text-danger-fg hover:bg-danger-soft":"font-medium text-ink-secondary hover:bg-surface-2"]]),onClick:k=>M.value=q.id},[A(J,{name:q.icon,size:17},null,8,["name"]),a("span",zm,w(q.label),1)],10,Om))),128))],512),[[kh,!j.value]]),a("div",$m,[j.value&&!fe.value.length?(p(),m("div",Im," No settings match “"+w(H.value)+"”. ",1)):I("",!0),(p(!0),m(le,null,Ie(fe.value,q=>(p(),m(le,{key:q.id},[j.value?(p(),m("div",Nm,[A(J,{name:q.icon,size:14},null,8,["name"]),z(" "+w(q.label),1)])):I("",!0),q.id==="account"?(p(),m("div",Dm,[A(xe,{title:"Full name",desc:"Shown to your team on flights and audit logs.",keywords:"full name account"},{default:ye(()=>[ie(a("input",{"onUpdate:modelValue":c[2]||(c[2]=k=>Ee(be).name=k),class:"field w-56",placeholder:"Jane Operator",onBlur:c[3]||(c[3]=k=>We("Saved."))},null,544),[[me,Ee(be).name]])]),_:1}),A(xe,{title:"Username",desc:"Your unique handle within PilotVault.",keywords:"username handle"},{default:ye(()=>[a("div",Fm,[c[73]||(c[73]=a("span",{class:"text-sm text-ink-muted"},"@",-1)),ie(a("input",{"onUpdate:modelValue":c[4]||(c[4]=k=>Ee(be).username=k),class:"field w-48",placeholder:"jane",onBlur:c[5]||(c[5]=k=>We("Saved."))},null,544),[[me,Ee(be).username]])])]),_:1}),A(xe,{title:"Email address",desc:"Used for sign-in and notifications.",keywords:"email verification verify"},{default:ye(()=>[a("div",Rm,[a("span",Bm,w(t.email||"—"),1),a("span",Um,[A(J,{name:"mail",size:12}),c[74]||(c[74]=z(" Unverified ",-1))])])]),_:1}),A(xe,{title:"Role",desc:"Your access level in PilotVault.",keywords:"role admin user superadmin access rights permissions"},{default:ye(()=>[a("span",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",y(t.role)])},[A(J,{name:_(t.role),size:12},null,8,["name"]),z(w(h(t.role)),1)],2)]),_:1}),A(xe,{title:"Organization",desc:"The organization your account belongs to.",keywords:"organization org tenant company"},{default:ye(()=>[a("span",{class:Ce(["text-sm",t.organizationName?"text-ink":"text-ink-muted"])},w(t.organizationName||(u.value?"All organizations":"None")),3)]),_:1}),A(xe,{block:"",title:"Verify email",desc:"Confirm ownership to enable password resets and alerts.",keywords:"verify email resend"},{default:ye(()=>[a("button",{class:"btn-ghost",onClick:Ts},"Send verification link"),ro.value?(p(),m("p",Vm,w(ro.value),1)):I("",!0)]),_:1}),A(xe,{block:"",title:"Change password",desc:"Use at least 8 characters.",keywords:"password change current new"},{default:ye(()=>[a("div",Zm,[ie(a("input",{"onUpdate:modelValue":c[6]||(c[6]=k=>yt.current=k),type:"password",class:"field",placeholder:"Current password"},null,512),[[me,yt.current]]),ie(a("input",{"onUpdate:modelValue":c[7]||(c[7]=k=>yt.next=k),type:"password",class:"field",placeholder:"New password"},null,512),[[me,yt.next]]),ie(a("input",{"onUpdate:modelValue":c[8]||(c[8]=k=>yt.confirm=k),type:"password",class:"field",placeholder:"Confirm new password"},null,512),[[me,yt.confirm]]),a("div",Hm,[a("button",{class:"btn-accent",onClick:dr},"Update password"),xi.value?(p(),m("span",{key:0,class:Ce(["text-xs",Ss.value?"text-success-fg":"text-ink-muted"])},w(xi.value),3)):I("",!0)])])]),_:1})])):q.id==="appearance"?(p(),m("div",jm,[A(xe,{title:"Theme",desc:"Light, dark, or follow your system.",keywords:"theme light dark system appearance"},{default:ye(()=>[A(wn,{modelValue:Se.value,"onUpdate:modelValue":c[9]||(c[9]=k=>Se.value=k),options:de},null,8,["modelValue"])]),_:1}),A(xe,{title:"Font size",desc:"Scales the entire interface for readability.",keywords:"font size accessibility text"},{default:ye(()=>[A(wn,{modelValue:Ee(be).fontSize,"onUpdate:modelValue":c[10]||(c[10]=k=>Ee(be).fontSize=k),options:Fe},null,8,["modelValue"])]),_:1}),A(xe,{title:"Reduce motion",desc:"Minimise animations and transitions.",keywords:"reduce motion accessibility animation"},{default:ye(()=>[A(nn,{modelValue:Ee(be).reduceMotion,"onUpdate:modelValue":c[11]||(c[11]=k=>Ee(be).reduceMotion=k)},null,8,["modelValue"])]),_:1}),A(xe,{title:"Language",desc:"Interface language.",keywords:"language locale"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[12]||(c[12]=k=>Ee(be).language=k),class:"field w-48"},[(p(),m(le,null,Ie(Te,([k,Be])=>a("option",{key:k,value:k},w(Be),9,Wm)),64))],512),[[Ot,Ee(be).language]])]),_:1}),A(xe,{title:"Region",desc:"Affects number, unit and date defaults.",keywords:"region country locale"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[13]||(c[13]=k=>Ee(be).region=k),class:"field w-48"},[(p(!0),m(le,null,Ie(Ee(Ze),([k,Be])=>(p(),m("option",{key:k,value:k},w(Be),9,Km))),128))],512),[[Ot,Ee(be).region]])]),_:1}),A(xe,{title:"Date format",desc:"How calendar dates are displayed.",keywords:"date format"},{default:ye(()=>[ie(a("select",{"onUpdate:modelValue":c[14]||(c[14]=k=>Ee(be).dateFormat=k),class:"field w-48"},[(p(),m(le,null,Ie(Q,([k,Be])=>a("option",{key:k,value:k},w(Be),9,Gm)),64))],512),[[Ot,Ee(be).dateFormat]])]),_:1}),A(xe,{title:"Time format",desc:"12- or 24-hour clock.",keywords:"time format clock 12 24 hour"},{default:ye(()=>[A(wn,{modelValue:Ee(be).timeFormat,"onUpdate:modelValue":c[15]||(c[15]=k=>Ee(be).timeFormat=k),options:Oe},null,8,["modelValue"])]),_:1}),A(xe,{title:"Preview",desc:"How timestamps appear across the app.",keywords:"preview date time"},{default:ye(()=>[a("span",qm,w(N.value),1)]),_:1}),c[75]||(c[75]=a("p",{class:"mt-3 text-xs text-ink-muted"}," Language & region are stored now; full localisation ships with the account service. ",-1))])):q.id==="integrations"?(p(),m("div",Ym,[j.value?I("",!0):(p(),m("div",Jm,[(p(),m(le,null,Ie(_a,k=>a("button",{key:k.id,type:"button",class:Ce(["-mb-px inline-flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm font-semibold transition",jo.value===k.id?"border-accent text-ink":"border-transparent text-ink-secondary hover:text-ink"]),onClick:Be=>jo.value=k.id},[A(J,{name:k.icon,size:16},null,8,["name"]),z(w(k.label),1)],10,Xm)),64))])),Hi("apis-external")?(p(),m(le,{key:1},[a("div",Qm,[a("div",eg,[a("div",tg,[A(J,{name:"radio",size:20})]),c[76]||(c[76]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"OpenSky Network"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Live ADS-B aircraft data. Configure your own OAuth2 credentials, plan and default bounding box. ")],-1))]),$.loaded&&!$.available?(p(),m("div",ng,[A(J,{name:"lock",size:14,class:"mr-1 inline"}),c[77]||(c[77]=z(" OpenSky is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),$.canEditOrg?(p(),m("div",ig,[c[78]||(c[78]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Ye.value,"onUpdate:modelValue":c[16]||(c[16]=k=>Ye.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),ve.value?(p(),nt(xe,{key:2,title:"Enable OpenSky (organization-wide)",desc:"Turn OpenSky on or off for everyone in your organization.",keywords:"enable disable plugin opensky organization"},{default:ye(()=>[A(nn,{"model-value":$.orgEnabled,disabled:!$.available,"onUpdate:modelValue":pt},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable OpenSky",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin opensky"},{default:ye(()=>[A(nn,{"model-value":$.enabled,disabled:!$.available||!$.orgEnabled,"onUpdate:modelValue":pt},null,8,["model-value","disabled"])]),_:1})),!ve.value&&$.available&&!$.orgEnabled?(p(),m("div",og,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[80]||(c[80]=z("OpenSky is turned off for your organization",-1)),$.canEditOrg?(p(),m("span",sg,[...c[79]||(c[79]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[81]||(c[81]=z(". ",-1))])):I("",!0),ve.value?(p(),m("div",ag,[A(J,{name:"users",size:13,class:"mr-1 inline"}),c[82]||(c[82]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",rg,w(t.organizationName||"your organization"),1),c[83]||(c[83]=z(". Leave a field blank to let each user choose their own; a value set here overrides the user's. ",-1))])):ae.value?(p(),m("div",lg," As a superadmin you manage the global OpenSky configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),$.available&&!ve.value?(p(),m("div",ug,[a("div",cg,[a("div",dg,[A(J,{name:"signal",size:15}),c[84]||(c[84]=z("Credit usage ",-1))]),Ue.value?(p(),m("span",fg,"Checked "+w(De()),1)):I("",!0)]),Ve.value?(p(),m(le,{key:0},[Ve.value.remaining!=null?(p(),m(le,{key:0},[a("div",hg,[a("span",pg,w(Le(Ve.value.remaining)),1),a("span",mg,"/ "+w(Le(Ve.value.daily))+" credits left today",1)]),a("div",gg,[a("div",{class:Ce(["h-full rounded-full transition-all",st.value]),style:Eo({width:wt.value+"%"})},null,6)]),a("div",vg," Used "+w(Le(Ve.value.daily-Ve.value.remaining))+" today · "+w(Ve.value.probeCost)+" credit"+w(Ve.value.probeCost===1?"":"s")+" per query · "+w(Ve.value.mode),1)],64)):(p(),m(le,{key:1},[a("div",_g,[c[85]||(c[85]=z("Daily allowance: ",-1)),a("span",bg,w(Le(Ve.value.daily)),1),c[86]||(c[86]=z(" credits",-1))]),a("div",yg,w(Ve.value.probeCost)+" credit"+w(Ve.value.probeCost===1?"":"s")+" per query · "+w(Ve.value.mode)+". OpenSky only reports live remaining credits for authenticated requests — add OAuth2 credentials below to track usage. ",1)],64))],64)):(p(),m("div",xg,[...c[87]||(c[87]=[z(" Run ",-1),a("span",{class:"font-semibold text-ink-secondary"},"Test connection",-1),z(" below to fetch your live OpenSky credit balance. ",-1)])]))])):I("",!0),A(xe,{title:"OpenSky plan",desc:"Your account tier — sets the daily credit allowance.",keywords:"plan tier credits"},{default:ye(()=>[ke("plan")?(p(),m("span",wg,[z(w((Ut.find(k=>k.value===se("plan").effective)||{}).label||se("plan").effective||"—")+" ",1),Pe("plan")?(p(),m("span",kg,[A(J,{name:"lock",size:10}),z(w(Pe("plan")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:we.plan,"onUpdate:modelValue":c[17]||(c[17]=k=>we.plan=k),options:Ut},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Default bounding box",desc:"Automatic follows your location; or pick a region, or enter lamin,lomin,lamax,lomax by hand.",keywords:"bounding box bbox area region country continent world europe custom coordinates automatic location drone"},{default:ye(()=>[ke("bbox")?(p(),m("span",Sg,[z(w(S(se("bbox").effective)||se("bbox").effective||"—")+" ",1),Pe("bbox")?(p(),m("span",Tg,[A(J,{name:"lock",size:10}),z(w(Pe("bbox")),1)])):I("",!0)])):(p(),m("div",Pg,[ie(a("select",{"onUpdate:modelValue":c[18]||(c[18]=k=>V.value=k),class:"field w-64"},[ve.value?I("",!0):(p(),m("option",Cg,"Automatic (by location)")),(p(),m(le,null,Ie(kt,k=>a("optgroup",{key:k.label,label:k.label},[(p(!0),m(le,null,Ie(k.options,Be=>(p(),m("option",{key:Be.value,value:Be.value},w(Be.label),9,Ag))),128))],8,Lg)),64)),c[88]||(c[88]=a("option",{value:"__custom__"},"Custom…",-1))],512),[[Ot,V.value]]),re.value?(p(),m("p",Mg," Live map follows drone location → your device location → your Region ("+w(he.value)+"). ",1)):I("",!0),G.value?ie((p(),m("input",{key:1,"onUpdate:modelValue":c[19]||(c[19]=k=>we.bbox=k),class:"field w-64 font-mono",placeholder:"50.5,3.2,53.7,7.3"},null,512)),[[me,we.bbox]]):I("",!0)]))]),_:1}),A(xe,{title:"OAuth2 client ID",desc:"Optional — leave blank for anonymous access (lower limits).",keywords:"oauth client id credentials"},{default:ye(()=>[ke("clientId")?(p(),m("span",Eg,[z(w(se("clientId").effective||"—")+" ",1),Pe("clientId")?(p(),m("span",Og,[A(J,{name:"lock",size:10}),z(w(Pe("clientId")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[20]||(c[20]=k=>we.clientId=k),class:"field w-64",placeholder:"your-api-client"},null,512)),[[me,we.clientId]])]),_:1}),A(xe,{title:"OAuth2 client secret",desc:"Paired with the client ID for authenticated access.",keywords:"oauth client secret credentials password"},{default:ye(()=>[ke("clientSecret")?(p(),m("span",zg,[z(w(se("clientSecret").effective||"—")+" ",1),Pe("clientSecret")?(p(),m("span",$g,[A(J,{name:"lock",size:10}),z(w(Pe("clientSecret")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[21]||(c[21]=k=>we.clientSecret=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,we.clientSecret]])]),_:1}),$.available&&!$.allowAnonymous?(p(),m("div",Ig," Anonymous access is disabled by the administrator — OpenSky needs OAuth2 credentials from some layer to work. ")):I("",!0),a("div",Ng,[ae.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:ue.value||!$.available,onClick:ht},w(ue.value?"Saving…":ve.value?"Save organization settings":"Save settings"),9,Dg)),ve.value?I("",!0):(p(),m("div",Fg,[c[91]||(c[91]=a("label",{class:"text-xs text-ink-muted"},"Test area",-1)),ie(a("select",{"onUpdate:modelValue":c[22]||(c[22]=k=>Ct.value=k),class:"field w-44"},[c[89]||(c[89]=a("option",{value:"__default__"},"Default bounding box",-1)),(p(),m(le,null,Ie(Vt,k=>a("optgroup",{key:k.label,label:k.label},[(p(!0),m(le,null,Ie(k.options,Be=>(p(),m("option",{key:Be.value,value:Be.value},w(Be.label),9,Bg))),128))],8,Rg)),64)),c[90]||(c[90]=a("option",{value:"__custom__"},"Custom…",-1))],512),[[Ot,Ct.value]]),$t.value?ie((p(),m("input",{key:0,"onUpdate:modelValue":c[23]||(c[23]=k=>Zt.value=k),class:"field w-44 font-mono",placeholder:"lamin,lomin,lamax,lomax"},null,512)),[[me,Zt.value]]):I("",!0)])),ve.value?I("",!0):(p(),m("button",{key:2,class:"btn-ghost",disabled:ft.value||!$.available,onClick:kn},w(ft.value?"Testing…":"Test connection"),9,Ug)),ge.value?(p(),m("span",Vg,w(ge.value),1)):I("",!0),pe.value&&!ve.value?(p(),m("span",{key:4,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",zi(pe.value.status)])},[c[92]||(c[92]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(pe.value.detail||pe.value.status),1)],2)):I("",!0)])]),a("div",Zg,[a("div",Hg,[a("div",jg,[A(J,{name:"sun",size:20})]),c[93]||(c[93]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"OpenWeather"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Current conditions and forecast from the OpenWeather API. Configure the API key and default location your account uses. ")],-1))]),Xe.loaded&&!Xe.available?(p(),m("div",Wg,[A(J,{name:"lock",size:14,class:"mr-1 inline"}),c[94]||(c[94]=z(" OpenWeather is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),Xe.canEditOrg?(p(),m("div",Kg,[c[95]||(c[95]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:In.value,"onUpdate:modelValue":c[24]||(c[24]=k=>In.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),Ln.value?(p(),nt(xe,{key:2,title:"Enable OpenWeather (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin openweather weather organization"},{default:ye(()=>[A(nn,{"model-value":Xe.orgEnabled,disabled:!Xe.available,"onUpdate:modelValue":Bi},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable OpenWeather",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin openweather weather"},{default:ye(()=>[A(nn,{"model-value":Xe.enabled,disabled:!Xe.available||!Xe.orgEnabled,"onUpdate:modelValue":Bi},null,8,["model-value","disabled"])]),_:1})),!Ln.value&&Xe.available&&!Xe.orgEnabled?(p(),m("div",Gg,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[97]||(c[97]=z("OpenWeather is turned off for your organization",-1)),Xe.canEditOrg?(p(),m("span",qg,[...c[96]||(c[96]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[98]||(c[98]=z(". ",-1))])):I("",!0),Ln.value?(p(),m("div",Yg,[A(J,{name:"users",size:13,class:"mr-1 inline"}),c[99]||(c[99]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",Jg,w(t.organizationName||"your organization"),1),c[100]||(c[100]=z(". Leave the API key blank to let each user configure their own; a key set here overrides the user's. ",-1))])):Ri.value?(p(),m("div",Xg," As a superadmin you manage the global OpenWeather configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{title:"API key",desc:"Your OpenWeather API key (the appid parameter). Required — OpenWeather has no anonymous tier.",keywords:"api key appid secret credentials token openweather"},{default:ye(()=>[jt("apiKey")?(p(),m("span",Qg,[z(w(ze("apiKey").effective||"—")+" ",1),Je("apiKey")?(p(),m("span",ev,[A(J,{name:"lock",size:10}),z(w(Je("apiKey")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[25]||(c[25]=k=>Ht.apiKey=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,Ht.apiKey]])]),_:1}),A(xe,{title:"Units",desc:"Measurement system for temperatures and wind speed.",keywords:"units metric imperial standard celsius fahrenheit kelvin"},{default:ye(()=>[jt("units")?(p(),m("span",tv,[z(w((Ro.find(k=>k.value===ze("units").effective)||{}).label||ze("units").effective||"—")+" ",1),Je("units")?(p(),m("span",nv,[A(J,{name:"lock",size:10}),z(w(Je("units")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:Ht.units,"onUpdate:modelValue":c[26]||(c[26]=k=>Ht.units=k),options:Ro},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Default latitude",desc:"Latitude used by the health probe and calls with no location (−90…90).",keywords:"latitude location coordinates default"},{default:ye(()=>[jt("lat")?(p(),m("span",iv,[z(w(ze("lat").effective||"—")+" ",1),Je("lat")?(p(),m("span",ov,[A(J,{name:"lock",size:10}),z(w(Je("lat")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[27]||(c[27]=k=>Ht.lat=k),inputmode:"decimal",class:"field w-40 font-mono",placeholder:"52.2297"},null,512)),[[me,Ht.lat]])]),_:1}),A(xe,{title:"Default longitude",desc:"Longitude used by the health probe and calls with no location (−180…180).",keywords:"longitude location coordinates default"},{default:ye(()=>[jt("lon")?(p(),m("span",sv,[z(w(ze("lon").effective||"—")+" ",1),Je("lon")?(p(),m("span",av,[A(J,{name:"lock",size:10}),z(w(Je("lon")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[28]||(c[28]=k=>Ht.lon=k),inputmode:"decimal",class:"field w-40 font-mono",placeholder:"21.0122"},null,512)),[[me,Ht.lon]])]),_:1}),A(xe,{title:"Language",desc:"Optional ISO code for human-readable weather descriptions, e.g. en, pl, de.",keywords:"language locale description"},{default:ye(()=>[jt("lang")?(p(),m("span",rv,[z(w(ze("lang").effective||"—")+" ",1),Je("lang")?(p(),m("span",lv,[A(J,{name:"lock",size:10}),z(w(Je("lang")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[29]||(c[29]=k=>Ht.lang=k),class:"field w-24 font-mono",placeholder:"en"},null,512)),[[me,Ht.lang]])]),_:1}),A(xe,{title:"Calls per minute limit",desc:"Your plan's per-minute limit (free tier is 60). Only used to gauge app usage below. Leave blank to inherit; the app falls back to 60.",keywords:"calls per minute limit rate quota plan usage"},{default:ye(()=>[jt("callsPerMinute")?(p(),m("span",uv,[z(w(ze("callsPerMinute").effective||"60")+" ",1),Je("callsPerMinute")?(p(),m("span",cv,[A(J,{name:"lock",size:10}),z(w(Je("callsPerMinute")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[30]||(c[30]=k=>Ht.callsPerMinute=k),inputmode:"numeric",class:"field w-24 font-mono",placeholder:"60"},null,512)),[[me,Ht.callsPerMinute]])]),_:1}),Xe.available&&!Ln.value?(p(),m("div",dv,[a("div",fv,[a("div",hv,[A(J,{name:"signal",size:15}),c[101]||(c[101]=z("API call usage ",-1))]),Gn.value?(p(),m("span",pv,"Checked "+w(Uo()),1)):I("",!0)]),Ui.value?(p(),m(le,{key:0},[a("div",mv,[a("span",gv,w(Ui.value.minuteUsed),1),a("span",vv,"/ "+w(Ui.value.minuteLimit||"—")+" calls this minute",1)]),vs.value!=null?(p(),m("div",_v,[a("div",{class:Ce(["h-full rounded-full transition-all",fa.value]),style:Eo({width:vs.value+"%"})},null,6)])):I("",!0),a("div",bv,w(Ui.value.dayUsed)+" calls today · counts only requests PilotVault makes with this key, since server start. OpenWeather does not report remaining quota — check your account dashboard for the authoritative total. ",1)],64)):(p(),m("div",yv,[...c[102]||(c[102]=[z(" Run ",-1),a("span",{class:"font-semibold text-ink-secondary"},"Test connection",-1),z(" below to record and show call usage. ",-1)])]))])):I("",!0),a("div",xv,[Ri.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:Di.value||!Xe.available,onClick:Ft},w(Di.value?"Saving…":Ln.value?"Save organization settings":"Save settings"),9,wv)),Ln.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:Fi.value||!Xe.available,onClick:bi},w(Fi.value?"Testing…":"Test connection"),9,kv)),Kn.value?(p(),m("span",Sv,w(Kn.value),1)):I("",!0),Gn.value&&!Ln.value?(p(),m("span",Tv,"Checked "+w(Uo()),1)):I("",!0),Qt.value&&!Ln.value?(p(),m("span",{key:4,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",da(Qt.value.status)])},[c[103]||(c[103]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Qt.value.detail||Qt.value.status),1)],2)):I("",!0)])])],64)):I("",!0),Hi("drives-external")?(p(),m(le,{key:2},[a("div",Pv,[a("div",Cv,[a("div",Lv,[A(J,{name:"server",size:20})]),c[104]||(c[104]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"File Transfer (FTP / SFTP)"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Connect to an FTP, FTPS or SFTP server. Configure the connection your account uses for file transfers. ")],-1))]),at.loaded&&!at.available?(p(),m("div",Av,[A(J,{name:"lock",size:14,class:"mr-1 inline"}),c[105]||(c[105]=z(" File transfer is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),at.canEditOrg?(p(),m("div",Mv,[c[106]||(c[106]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Sn.value,"onUpdate:modelValue":c[31]||(c[31]=k=>Sn.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),St.value?(p(),nt(xe,{key:2,title:"Enable file transfer (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin ftp sftp organization"},{default:ye(()=>[A(nn,{"model-value":at.orgEnabled,disabled:!at.available,"onUpdate:modelValue":ra},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable file transfer",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin ftp sftp"},{default:ye(()=>[A(nn,{"model-value":at.enabled,disabled:!at.available||!at.orgEnabled,"onUpdate:modelValue":ra},null,8,["model-value","disabled"])]),_:1})),!St.value&&at.available&&!at.orgEnabled?(p(),m("div",Ev,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[108]||(c[108]=z("File transfer is turned off for your organization",-1)),at.canEditOrg?(p(),m("span",Ov,[...c[107]||(c[107]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[109]||(c[109]=z(". ",-1))])):I("",!0),St.value?(p(),m("div",zv,[A(J,{name:"users",size:13,class:"mr-1 inline"}),c[110]||(c[110]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",$v,w(t.organizationName||"your organization"),1),c[111]||(c[111]=z(". Leave the connection blank to let each user configure their own; a connection set here overrides the user's. ",-1))])):Me.value?(p(),m("div",Iv," As a superadmin you manage the global file-transfer configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{title:"Protocol",desc:"SFTP (over SSH), FTPS (FTP over TLS), or plain FTP.",keywords:"protocol sftp ftps ftp"},{default:ye(()=>[_t("protocol")?(p(),m("span",Nv,[z(w(oa(Z("protocol").effective))+" ",1),bt("protocol")?(p(),m("span",Dv,[A(J,{name:"lock",size:10}),z(w(bt("protocol")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:rt.protocol,"onUpdate:modelValue":c[32]||(c[32]=k=>rt.protocol=k),options:U},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Host",desc:"Server hostname or IP address.",keywords:"host server address"},{default:ye(()=>[_t("host")?(p(),m("span",Fv,[z(w(Z("host").effective||"—")+" ",1),bt("host")?(p(),m("span",Rv,[A(J,{name:"lock",size:10}),z(w(bt("host")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[33]||(c[33]=k=>rt.host=k),class:"field w-64",placeholder:"files.example.com"},null,512)),[[me,rt.host]])]),_:1}),A(xe,{title:"Port",desc:"Leave blank for the protocol default (22 for SFTP, 21 for FTP/FTPS).",keywords:"port"},{default:ye(()=>[_t("port")?(p(),m("span",Bv,[z(w(Z("port").effective||"default")+" ",1),bt("port")?(p(),m("span",Uv,[A(J,{name:"lock",size:10}),z(w(bt("port")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[34]||(c[34]=k=>rt.port=k),inputmode:"numeric",class:"field w-24 font-mono",placeholder:"22"},null,512)),[[me,rt.port]])]),_:1}),A(xe,{title:"Username",desc:"Account used to authenticate.",keywords:"username login account"},{default:ye(()=>[_t("username")?(p(),m("span",Vv,[z(w(Z("username").effective||"—")+" ",1),bt("username")?(p(),m("span",Zv,[A(J,{name:"lock",size:10}),z(w(bt("username")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[35]||(c[35]=k=>rt.username=k),class:"field w-64",placeholder:"user"},null,512)),[[me,rt.username]])]),_:1}),A(xe,{title:"Password",desc:"Password auth for FTP/FTPS, or SFTP password login. Leave blank to use a key.",keywords:"password secret credentials"},{default:ye(()=>[_t("password")?(p(),m("span",Hv,[z(w(Z("password").effective||"—")+" ",1),bt("password")?(p(),m("span",jv,[A(J,{name:"lock",size:10}),z(w(bt("password")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[36]||(c[36]=k=>rt.password=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,rt.password]])]),_:1}),Et.value==="sftp"?(p(),nt(xe,{key:7,block:"",title:"SSH private key",desc:"PEM key for SFTP key auth — used instead of, or alongside, a password.",keywords:"private key ssh pem identity"},{default:ye(()=>[_t("privateKey")?(p(),m("span",Wv,[z(w(Z("privateKey").effective||"—")+" ",1),bt("privateKey")?(p(),m("span",Kv,[A(J,{name:"lock",size:10}),z(w(bt("privateKey")),1)])):I("",!0)])):ie((p(),m("textarea",{key:1,"onUpdate:modelValue":c[37]||(c[37]=k=>rt.privateKey=k),rows:"3",class:"field w-full font-mono text-xs",placeholder:"-----BEGIN OPENSSH PRIVATE KEY-----"},null,512)),[[me,rt.privateKey]])]),_:1})):I("",!0),Et.value==="sftp"?(p(),nt(xe,{key:8,title:"Private key passphrase",desc:"Passphrase protecting the SSH private key, if any.",keywords:"passphrase key secret"},{default:ye(()=>[_t("keyPassphrase")?(p(),m("span",Gv,[z(w(Z("keyPassphrase").effective||"—")+" ",1),bt("keyPassphrase")?(p(),m("span",qv,[A(J,{name:"lock",size:10}),z(w(bt("keyPassphrase")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[38]||(c[38]=k=>rt.keyPassphrase=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,rt.keyPassphrase]])]),_:1})):I("",!0),Et.value==="sftp"?(p(),nt(xe,{key:9,title:"Host key fingerprint",desc:"Optional SHA256:… fingerprint to pin the server's host key. Blank accepts any key.",keywords:"host key fingerprint verify trust"},{default:ye(()=>[_t("hostKeyFingerprint")?(p(),m("span",Yv,[z(w(Z("hostKeyFingerprint").effective||"—")+" ",1),bt("hostKeyFingerprint")?(p(),m("span",Jv,[A(J,{name:"lock",size:10}),z(w(bt("hostKeyFingerprint")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[39]||(c[39]=k=>rt.hostKeyFingerprint=k),class:"field w-full font-mono text-xs",placeholder:"SHA256:…"},null,512)),[[me,rt.hostKeyFingerprint]])]),_:1})):I("",!0),Et.value==="ftps"?(p(),nt(xe,{key:10,title:"TLS verification",desc:"Skip only for self-signed test servers.",keywords:"tls certificate verify insecure ftps"},{default:ye(()=>[_t("insecureSkipVerify")?(p(),m("span",Xv,[z(w(Z("insecureSkipVerify").effective==="true"?"Skip verification":"Verify certificate")+" ",1),bt("insecureSkipVerify")?(p(),m("span",Qv,[A(J,{name:"lock",size:10}),z(w(bt("insecureSkipVerify")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:rt.insecureSkipVerify,"onUpdate:modelValue":c[40]||(c[40]=k=>rt.insecureSkipVerify=k),options:E},null,8,["modelValue"]))]),_:1})):I("",!0),A(xe,{title:"Base path",desc:"Working directory and health-check target, e.g. /uploads.",keywords:"base path directory folder root"},{default:ye(()=>[_t("basePath")?(p(),m("span",e_,[z(w(Z("basePath").effective||"—")+" ",1),bt("basePath")?(p(),m("span",t_,[A(J,{name:"lock",size:10}),z(w(bt("basePath")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[41]||(c[41]=k=>rt.basePath=k),class:"field w-64 font-mono",placeholder:"/uploads"},null,512)),[[me,rt.basePath]])]),_:1}),a("div",n_,[Me.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:pi.value||!at.available,onClick:or},w(pi.value?"Saving…":St.value?"Save organization settings":"Save settings"),9,i_)),St.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:Ii.value||!at.available,onClick:sr},w(Ii.value?"Testing…":"Test connection"),9,o_)),hi.value?(p(),m("span",s_,w(hi.value),1)):I("",!0),jn.value&&!St.value?(p(),m("span",a_,"Checked "+w(sa()),1)):I("",!0),Gt.value&&!St.value?(p(),m("span",{key:4,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",la(Gt.value.status)])},[c[112]||(c[112]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Gt.value.detail||Gt.value.status),1)],2)):I("",!0)])]),a("div",r_,[a("div",l_,[a("div",u_,[A(J,{name:"cloud",size:20})]),c[113]||(c[113]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"WebDAV"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," Connect to a WebDAV server (Nextcloud, ownCloud, IIS, …). Configure the connection your account uses. ")],-1))]),lt.loaded&&!lt.available?(p(),m("div",c_,[A(J,{name:"lock",size:14,class:"mr-1 inline"}),c[114]||(c[114]=z(" WebDAV is currently disabled by your administrator. Contact them to enable it. ",-1))])):I("",!0),lt.canEditOrg?(p(),m("div",d_,[c[115]||(c[115]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Wn.value,"onUpdate:modelValue":c[42]||(c[42]=k=>Wn.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),ot.value?(p(),nt(xe,{key:2,title:"Enable WebDAV (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin webdav organization"},{default:ye(()=>[A(nn,{"model-value":lt.orgEnabled,disabled:!lt.available,"onUpdate:modelValue":ca},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:3,title:"Enable WebDAV",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin webdav"},{default:ye(()=>[A(nn,{"model-value":lt.enabled,disabled:!lt.available||!lt.orgEnabled,"onUpdate:modelValue":ca},null,8,["model-value","disabled"])]),_:1})),!ot.value&<.available&&!lt.orgEnabled?(p(),m("div",f_,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[117]||(c[117]=z("WebDAV is turned off for your organization",-1)),lt.canEditOrg?(p(),m("span",h_,[...c[116]||(c[116]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[118]||(c[118]=z(". ",-1))])):I("",!0),ot.value?(p(),m("div",p_,[A(J,{name:"users",size:13,class:"mr-1 inline"}),c[119]||(c[119]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",m_,w(t.organizationName||"your organization"),1),c[120]||(c[120]=z(". Leave the connection blank to let each user configure their own; a connection set here overrides the user's. ",-1))])):Io.value?(p(),m("div",g_," As a superadmin you manage the global WebDAV configuration in the API Server panel. The effective configuration is shown below. ")):I("",!0),A(xe,{block:"",title:"Server URL",desc:"WebDAV endpoint including scheme, e.g. https://cloud.example.com/remote.php/dav/files/alice/.",keywords:"url server address endpoint webdav host"},{default:ye(()=>[Cn("baseURL")?(p(),m("span",v_,[z(w(Pn("baseURL").effective||"—")+" ",1),qt("baseURL")?(p(),m("span",__,[A(J,{name:"lock",size:10}),z(w(qt("baseURL")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[43]||(c[43]=k=>Xt.baseURL=k),class:"field w-full font-mono text-xs",placeholder:"https://cloud.example.com/remote.php/dav/files/alice/"},null,512)),[[me,Xt.baseURL]])]),_:1}),A(xe,{title:"Username",desc:"Account used to authenticate (leave blank for a public share).",keywords:"username login account"},{default:ye(()=>[Cn("username")?(p(),m("span",b_,[z(w(Pn("username").effective||"—")+" ",1),qt("username")?(p(),m("span",y_,[A(J,{name:"lock",size:10}),z(w(qt("username")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[44]||(c[44]=k=>Xt.username=k),class:"field w-64",placeholder:"user"},null,512)),[[me,Xt.username]])]),_:1}),A(xe,{title:"Password",desc:"Password or app-specific token for HTTP Basic auth.",keywords:"password secret credentials token"},{default:ye(()=>[Cn("password")?(p(),m("span",x_,[z(w(Pn("password").effective||"—")+" ",1),qt("password")?(p(),m("span",w_,[A(J,{name:"lock",size:10}),z(w(qt("password")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[45]||(c[45]=k=>Xt.password=k),type:"password",class:"field w-64",placeholder:"••••••••"},null,512)),[[me,Xt.password]])]),_:1}),A(xe,{title:"TLS verification",desc:"Only affects HTTPS. Skip only for self-signed test servers.",keywords:"tls certificate verify insecure https"},{default:ye(()=>[Cn("insecureSkipVerify")?(p(),m("span",k_,[z(w(Pn("insecureSkipVerify").effective==="true"?"Skip verification":"Verify certificate")+" ",1),qt("insecureSkipVerify")?(p(),m("span",S_,[A(J,{name:"lock",size:10}),z(w(qt("insecureSkipVerify")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:Xt.insecureSkipVerify,"onUpdate:modelValue":c[46]||(c[46]=k=>Xt.insecureSkipVerify=k),options:ua},null,8,["modelValue"]))]),_:1}),A(xe,{title:"Base path",desc:"Working directory under the server URL and health-check target, e.g. /Documents.",keywords:"base path directory folder root"},{default:ye(()=>[Cn("basePath")?(p(),m("span",T_,[z(w(Pn("basePath").effective||"—")+" ",1),qt("basePath")?(p(),m("span",P_,[A(J,{name:"lock",size:10}),z(w(qt("basePath")),1)])):I("",!0)])):ie((p(),m("input",{key:1,"onUpdate:modelValue":c[47]||(c[47]=k=>Xt.basePath=k),class:"field w-64 font-mono",placeholder:"/Documents"},null,512)),[[me,Xt.basePath]])]),_:1}),a("div",C_,[Io.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:zo.value||!lt.available,onClick:Fo},w(zo.value?"Saving…":ot.value?"Save organization settings":"Save settings"),9,L_)),ot.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:$o.value||!lt.available,onClick:gi},w($o.value?"Testing…":"Test connection"),9,A_)),io.value?(p(),m("span",M_,w(io.value),1)):I("",!0),$n.value&&!ot.value?(p(),m("span",E_,"Checked "+w(Lt()),1)):I("",!0),Tn.value&&!ot.value?(p(),m("span",{key:4,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",Mt(Tn.value.status)])},[c[121]||(c[121]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Tn.value.detail||Tn.value.status),1)],2)):I("",!0)])])],64)):I("",!0),Hi("drives-local")?(p(),m("div",O_,[a("div",z_,[a("div",$_,[A(J,{name:"monitor",size:20})]),c[122]||(c[122]=a("div",{class:"min-w-0"},[a("div",{class:"text-sm font-semibold text-ink"},"Local Storage"),a("div",{class:"mt-0.5 text-xs text-ink-muted"}," A private folder on the server for your files. Each user has their own; members of an organization share one. ")],-1))]),Ae.loaded&&!Ae.available?(p(),m("div",I_,[A(J,{name:"lock",size:14,class:"mr-1 inline"}),c[123]||(c[123]=z(" Local storage is currently disabled by your administrator. Contact them to enable it. ",-1))])):Ae.loaded&&!Ae.rootConfigured?(p(),m("div",N_,[A(J,{name:"alertTriangle",size:14,class:"mr-1 inline"}),c[124]||(c[124]=z(" No storage root has been configured by your administrator yet. ",-1))])):I("",!0),Ae.canEditOrg?(p(),m("div",D_,[c[125]||(c[125]=a("div",{class:"text-xs text-ink-muted"},"Manage your own settings, or organization-wide settings that apply to every user.",-1)),A(wn,{modelValue:Vi.value,"onUpdate:modelValue":c[48]||(c[48]=k=>Vi.value=k),options:Pt},null,8,["modelValue"])])):I("",!0),gn.value?(p(),nt(xe,{key:3,title:"Enable local storage (organization-wide)",desc:"Turn it on or off for everyone in your organization.",keywords:"enable disable plugin local storage folder organization"},{default:ye(()=>[A(nn,{"model-value":Ae.orgEnabled,disabled:!Ae.available,"onUpdate:modelValue":xs},null,8,["model-value","disabled"])]),_:1})):(p(),nt(xe,{key:4,title:"Enable local storage",desc:"Turn the plugin on for your account in the Web App.",keywords:"enable disable plugin local storage folder"},{default:ye(()=>[A(nn,{"model-value":Ae.enabled,disabled:!Ae.available||!Ae.orgEnabled,"onUpdate:modelValue":xs},null,8,["model-value","disabled"])]),_:1})),!gn.value&&Ae.available&&!Ae.orgEnabled?(p(),m("div",F_,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[127]||(c[127]=z("Local storage is turned off for your organization",-1)),Ae.canEditOrg?(p(),m("span",R_,[...c[126]||(c[126]=[z(" — switch to ",-1),a("span",{class:"font-semibold"},"Organization",-1),z(" to turn it back on",-1)])])):I("",!0),c[128]||(c[128]=z(". ",-1))])):I("",!0),gn.value?(p(),m("div",B_,[A(J,{name:"users",size:13,class:"mr-1 inline"}),c[129]||(c[129]=z("These are organization-wide settings — they apply to everyone in ",-1)),a("span",U_,w(t.organizationName||"your organization"),1),c[130]||(c[130]=z(", who all share the organization folder. Members can additionally enable a private folder inside it. ",-1))])):_s.value?(p(),m("div",V_," As a superadmin you manage the global storage root in the API Server panel. The effective configuration is shown below. ")):I("",!0),gn.value?(p(),nt(xe,{key:8,title:"Private folders",desc:"Let members create a private folder inside the organization folder, reachable only by them.",keywords:"private folder members allow policy organization"},{default:ye(()=>[A(nn,{"model-value":Ae.allowPrivate,disabled:!Ae.available,"onUpdate:modelValue":ur},null,8,["model-value","disabled"])]),_:1})):I("",!0),gn.value?I("",!0):(p(),m(le,{key:9},[A(xe,{block:"",title:"Your folders",desc:"Assigned automatically and isolated — no one else can reach your private folder.",keywords:"folder directory path storage location isolated private shared"},{default:ye(()=>[a("div",Z_,[(p(!0),m(le,null,Ie(Ae.mounts,k=>(p(),m("div",{key:k.id,class:"flex flex-wrap items-center gap-2"},[a("span",H_,w(k.path),1),k.kind==="shared"?(p(),m("span",j_,[A(J,{name:"users",size:10}),c[131]||(c[131]=z("Shared with your organization",-1))])):(p(),m("span",W_,[A(J,{name:"lock",size:10}),c[132]||(c[132]=z("Private to you",-1))])),ao.value[k.id]?(p(),m("span",{key:2,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-semibold",va(ao.value[k.id].status)])},[c[133]||(c[133]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(ao.value[k.id].status),1)],2)):I("",!0)]))),128)),Ae.mounts.length?I("",!0):(p(),m("div",K_,w(Ae.rootConfigured?"No folder assigned yet.":"Waiting for the administrator to configure a storage root."),1))])]),_:1}),Ae.isOrgUser&&Ae.allowPrivate?(p(),nt(xe,{key:0,title:"My private folder",desc:"Add a private folder inside the organization folder, reachable only by you — you keep the shared folder too.",keywords:"private folder personal isolated organization inside"},{default:ye(()=>[A(nn,{"model-value":Ae.privateFolder,disabled:!Ae.available||!Ae.orgEnabled,"onUpdate:modelValue":ga},null,8,["model-value","disabled"])]),_:1})):Ae.isOrgUser&&!Ae.allowPrivate?(p(),m("div",G_,[A(J,{name:"lock",size:13,class:"mr-1 inline"}),c[134]||(c[134]=z("Private folders are turned off by your organization. ",-1))])):I("",!0)],64)),A(xe,{title:"Access mode",desc:"Read-only prevents uploads, deletes and folder creation.",keywords:"read only write access mode permission"},{default:ye(()=>[ha("readOnly")?(p(),m("span",q_,[z(w(rr(Zi("readOnly").effective))+" ",1),An("readOnly")?(p(),m("span",Y_,[A(J,{name:"lock",size:10}),z(w(An("readOnly")),1)])):I("",!0)])):(p(),nt(wn,{key:1,modelValue:so.value,"onUpdate:modelValue":c[49]||(c[49]=k=>so.value=k),options:Zo},null,8,["modelValue"]))]),_:1}),a("div",J_,[_s.value?I("",!0):(p(),m("button",{key:0,class:"btn-accent",disabled:Vo.value||!Ae.available,onClick:cr},w(Vo.value?"Saving…":gn.value?"Save organization settings":"Save settings"),9,X_)),gn.value?I("",!0):(p(),m("button",{key:1,class:"btn-ghost",disabled:en.value||!Ae.available,onClick:ws},w(en.value?"Testing…":"Test folder"),9,Q_)),qe.value?(p(),m("span",e1,w(qe.value),1)):I("",!0),yi.value&&!gn.value?(p(),m("span",t1,"Checked "+w(pa()),1)):I("",!0),ln.value&&!gn.value?(p(),m("span",{key:4,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",va(ln.value.status)])},[c[135]||(c[135]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(ln.value.detail||ln.value.status),1)],2)):I("",!0)])])):I("",!0)])):q.id==="profile"?(p(),m("div",n1,[A(xe,{block:"",title:"Profile photo",desc:"PNG or JPG, up to ~1.5 MB. Stored on this device.",keywords:"avatar photo picture"},{default:ye(()=>[a("div",i1,[Ee(be).avatar?(p(),m("img",{key:0,src:Ee(be).avatar,alt:"Avatar",class:"h-16 w-16 rounded-full object-cover"},null,8,o1)):(p(),m("div",s1,w(ba.value),1)),a("div",a1,[a("label",r1,[A(J,{name:"upload",size:15,class:"mr-1.5 inline"}),c[136]||(c[136]=z("Upload ",-1)),a("input",{type:"file",accept:"image/*",class:"hidden",onChange:fr},null,32)]),Ee(be).avatar?(p(),m("button",{key:0,class:"btn-ghost",onClick:hr},"Remove")):I("",!0)])])]),_:1}),A(xe,{title:"Display name",desc:"The name shown on your public profile.",keywords:"display name profile"},{default:ye(()=>[ie(a("input",{"onUpdate:modelValue":c[50]||(c[50]=k=>Ee(be).displayName=k),class:"field w-56",placeholder:"Jane O.",onBlur:c[51]||(c[51]=k=>We("Saved."))},null,544),[[me,Ee(be).displayName]])]),_:1}),A(xe,{block:"",title:"Bio",desc:"A short description others can see.",keywords:"bio about description"},{default:ye(()=>[ie(a("textarea",{"onUpdate:modelValue":c[52]||(c[52]=k=>Ee(be).bio=k),rows:"3",maxlength:"240",class:"field w-full resize-none",placeholder:"Flight director, North yard operations…",onBlur:c[53]||(c[53]=k=>We("Saved."))},null,544),[[me,Ee(be).bio]]),a("div",l1,w((Ee(be).bio||"").length)+"/240",1)]),_:1}),A(xe,{title:"Show email on profile",desc:"Let teammates see your email address.",keywords:"show email public visibility"},{default:ye(()=>[A(nn,{modelValue:Ee(be).showEmail,"onUpdate:modelValue":c[54]||(c[54]=k=>Ee(be).showEmail=k)},null,8,["modelValue"])]),_:1})])):q.id==="security"?(p(),m("div",u1,[A(xe,{block:"",title:"Two-factor authentication",desc:"Require a one-time code at sign-in.",keywords:"two factor 2fa authentication security"},{default:ye(()=>[a("div",c1,[a("span",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",Ee(be).twoFactor?"bg-success-soft text-success-fg":"bg-surface-2 text-ink-secondary"])},[c[137]||(c[137]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Ee(be).twoFactor?"Enabled":"Disabled"),1)],2),!Ee(be).twoFactor&&!lo.value?(p(),m("button",{key:0,class:"btn-accent",onClick:ji},"Enable 2FA")):Ee(be).twoFactor?(p(),m("button",{key:1,class:"btn-ghost",onClick:co},"Disable")):I("",!0)]),lo.value?(p(),m("div",d1,[a("div",f1,[c[139]||(c[139]=a("div",{class:"grid h-28 w-28 place-items-center rounded bg-white p-2"},[a("svg",{viewBox:"0 0 100 100",class:"h-full w-full"},[a("rect",{width:"100",height:"100",fill:"#fff"}),a("g",{fill:"#0F1E3D"},[a("rect",{x:"6",y:"6",width:"24",height:"24"}),a("rect",{x:"70",y:"6",width:"24",height:"24"}),a("rect",{x:"6",y:"70",width:"24",height:"24"}),a("rect",{x:"12",y:"12",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"76",y:"12",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"12",y:"76",width:"12",height:"12",fill:"#fff"}),a("rect",{x:"40",y:"10",width:"8",height:"8"}),a("rect",{x:"52",y:"20",width:"8",height:"8"}),a("rect",{x:"40",y:"40",width:"8",height:"8"}),a("rect",{x:"60",y:"44",width:"8",height:"8"}),a("rect",{x:"44",y:"60",width:"8",height:"8"}),a("rect",{x:"70",y:"60",width:"8",height:"8"}),a("rect",{x:"80",y:"72",width:"8",height:"8"}),a("rect",{x:"60",y:"80",width:"8",height:"8"})])])],-1)),a("div",h1,[c[138]||(c[138]=a("div",{class:"text-xs text-ink-secondary"},"Scan with an authenticator app, or enter this secret:",-1)),a("div",p1,w(_n.value),1),a("div",m1,[ie(a("input",{"onUpdate:modelValue":c[55]||(c[55]=k=>qn.value=k),inputmode:"numeric",maxlength:"6",class:"field w-28 font-mono tracking-[0.3em]",placeholder:"000000"},null,512),[[me,qn.value]]),a("button",{class:"btn-accent",onClick:pr},"Verify & enable")]),uo.value?(p(),m("p",g1,w(uo.value),1)):I("",!0)])])])):I("",!0),Ee(be).twoFactor&&bn.value.length?(p(),m("div",v1,[c[140]||(c[140]=a("div",{class:"text-xs font-semibold text-ink"},"Recovery codes",-1)),c[141]||(c[141]=a("div",{class:"mt-0.5 text-xs text-ink-muted"},"Store these somewhere safe — each works once.",-1)),a("div",_1,[(p(!0),m(le,null,Ie(bn.value,k=>(p(),m("span",{key:k,class:"select-all"},w(k),1))),128))])])):I("",!0),c[142]||(c[142]=a("p",{class:"mt-2 text-xs text-ink-muted"},"Prototype — codes are generated locally until the account service verifies them.",-1))]),_:1}),A(xe,{block:"",title:"Active sessions",desc:"Devices currently signed in to your account.",keywords:"sessions devices logout sign out remote"},{default:ye(()=>[a("div",b1,[a("div",y1,[a("div",x1,[A(J,{name:"monitor",size:18})]),a("div",w1,[a("div",k1,[z(w(Wo())+" on "+w(mr())+" ",1),c[143]||(c[143]=a("span",{class:"ml-1 rounded-full bg-success-soft px-2 py-0.5 text-[10px] font-semibold text-success-fg"},"This device",-1))]),a("div",S1,"Signed in "+w(Ee(Su)(Ee(ti))),1)]),a("button",{class:"btn-ghost",onClick:c[56]||(c[56]=k=>l("logout"))},"Log out")])]),c[144]||(c[144]=a("button",{class:"btn-ghost mt-2 opacity-60",disabled:"",title:"Requires the account service"}," Log out all other devices ",-1)),c[145]||(c[145]=a("p",{class:"mt-2 text-xs text-ink-muted"}," Only this session is visible from the browser; enumerating and revoking remote sessions needs the account service. ",-1))]),_:1})])):q.id==="team"?(p(),m("div",T1,[Qe.id?(p(),m("div",P1,[A(xe,{block:"",title:`Edit user — ${Qe.email}`,desc:"Update details, change role, reset password, or set verified.",keywords:"edit user update role password verified organization"},{default:ye(()=>[a("div",C1,[a("div",L1,[ie(a("input",{"onUpdate:modelValue":c[57]||(c[57]=k=>Qe.email=k),type:"email",class:"field flex-1",placeholder:"name@pilotvault.local"},null,512),[[me,Qe.email]]),ie(a("select",{"onUpdate:modelValue":c[58]||(c[58]=k=>Qe.role=k),class:"field w-32",disabled:qo.value,title:qo.value?"You cannot change your own role":""},[(p(!0),m(le,null,Ie(ya.value,k=>(p(),m("option",{key:k.value,value:k.value},w(k.label),9,M1))),128))],8,A1),[[Ot,Qe.role]])]),u.value?ie((p(),m("select",{key:0,"onUpdate:modelValue":c[59]||(c[59]=k=>Qe.organization=k),class:"field",title:"Organization"},[(p(!0),m(le,null,Ie(Cs.value,k=>(p(),m("option",{key:k.value,value:k.value},w(k.label),9,E1))),128))],512)),[[Ot,Qe.organization]]):I("",!0),ie(a("input",{"onUpdate:modelValue":c[60]||(c[60]=k=>Qe.password=k),type:"password",class:"field",placeholder:"New password (leave blank to keep current)"},null,512),[[me,Qe.password]]),a("label",O1,[A(nn,{modelValue:Qe.verified,"onUpdate:modelValue":c[61]||(c[61]=k=>Qe.verified=k)},null,8,["modelValue"]),c[146]||(c[146]=z(" Email verified ",-1))]),a("div",z1,[a("button",{class:"btn-accent",disabled:Ki.value,onClick:vr},w(Ki.value?"Saving…":"Save changes"),9,$1),a("button",{class:"btn-ghost",onClick:ho},"Cancel"),En.value?(p(),m("span",I1,w(En.value),1)):I("",!0),qo.value?(p(),m("span",N1,"Editing your own account — role locked.")):I("",!0)])])]),_:1},8,["title"])])):(p(),m("div",D1,[A(xe,{block:"",title:"Add user",desc:"Create a new account. Admins add users within their organization; superadmins can target any.",keywords:"add user create account role admin organization"},{default:ye(()=>[a("div",F1,[a("div",R1,[ie(a("input",{"onUpdate:modelValue":c[62]||(c[62]=k=>Rt.email=k),type:"email",class:"field flex-1",placeholder:"name@pilotvault.local"},null,512),[[me,Rt.email]]),ie(a("select",{"onUpdate:modelValue":c[63]||(c[63]=k=>Rt.role=k),class:"field w-32"},[(p(!0),m(le,null,Ie(ya.value,k=>(p(),m("option",{key:k.value,value:k.value},w(k.label),9,B1))),128))],512),[[Ot,Rt.role]])]),u.value?ie((p(),m("select",{key:0,"onUpdate:modelValue":c[64]||(c[64]=k=>Rt.organization=k),class:"field",title:"Organization"},[(p(!0),m(le,null,Ie(Cs.value,k=>(p(),m("option",{key:k.value,value:k.value},w(k.label),9,U1))),128))],512)),[[Ot,Rt.organization]]):(p(),m("div",V1,[c[147]||(c[147]=z(" New users join your organization: ",-1)),a("span",Z1,w(t.organizationName||"—"),1)])),ie(a("input",{"onUpdate:modelValue":c[65]||(c[65]=k=>Rt.password=k),type:"password",class:"field",placeholder:"Temporary password (min 8 chars)"},null,512),[[me,Rt.password]]),a("div",H1,[a("button",{class:"btn-accent",disabled:Ko.value,onClick:Ls},w(Ko.value?"Creating…":"Create user"),9,j1),tn.value?(p(),m("span",W1,w(tn.value),1)):I("",!0)])])]),_:1})])),a("div",K1,[a("div",G1,[c[148]||(c[148]=a("div",null,[a("div",{class:"eyebrow"},"Team"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"All users")],-1)),a("button",{class:"btn-ghost",disabled:fo.value,onClick:ii},w(fo.value?"Loading…":"Refresh"),9,q1)]),Wi.value?(p(),m("div",Y1,w(Wi.value),1)):!wi.value.length&&!fo.value?(p(),m("div",J1,"No users yet.")):(p(),m("div",X1,[a("table",Q1,[a("thead",null,[a("tr",eb,[(p(),m(le,null,Ie(["User","Role","Organization","Status",""],k=>a("th",{key:k,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w(k),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(wi.value,k=>(p(),m("tr",{key:k.id,class:Ce(["border-b border-line last:border-0",Qe.id===k.id?"bg-accent-soft":""])},[a("td",tb,[a("span",nb,w(k.email),1),k.email===t.email?(p(),m("span",ib,"(you)")):I("",!0)]),a("td",ob,[a("span",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",y(k.role||"user")])},[A(J,{name:_(k.role||"user"),size:12},null,8,["name"]),z(w(h(k.role||"user")),1)],2)]),a("td",sb,[a("span",{class:Ce(["text-sm",k.organizationName?"text-ink-secondary":"text-ink-muted"])},w(k.organizationName||"—"),3)]),a("td",ab,[a("span",{class:Ce(["text-xs",k.verified?"text-success-fg":"text-ink-muted"])},w(k.verified?"Verified":"Unverified"),3)]),a("td",rb,[Dn.value===k.id?(p(),m(le,{key:0},[c[149]||(c[149]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Remove?",-1)),a("button",{class:"btn-ghost mr-1",onClick:c[66]||(c[66]=Be=>Dn.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:Be=>Go(k)}," Remove ",8,lb)],64)):(p(),m("div",ub,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>gr(k)},[A(J,{name:"settings",size:14}),c[150]||(c[150]=z(" Edit ",-1))],8,cb),k.email!==t.email?(p(),m("button",{key:0,class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>Dn.value=k.id},[A(J,{name:"trash",size:14}),c[151]||(c[151]=z(" Remove ",-1))],8,db)):I("",!0)]))])],2))),128))])])]))])])):q.id==="organizations"?(p(),m("div",fb,[Nt.id?(p(),m("div",hb,[A(xe,{block:"",title:"Rename organization",desc:"Update the organization's display name.",keywords:"rename organization edit"},{default:ye(()=>[a("div",pb,[ie(a("input",{"onUpdate:modelValue":c[67]||(c[67]=k=>Nt.name=k),class:"field",placeholder:"Organization name",onKeyup:pu(xa,["enter"])},null,544),[[me,Nt.name]]),a("div",mb,[a("button",{class:"btn-accent",onClick:xa},"Save changes"),a("button",{class:"btn-ghost",onClick:Ms},"Cancel"),Fn.value?(p(),m("span",gb,w(Fn.value),1)):I("",!0)])])]),_:1})])):(p(),m("div",vb,[A(xe,{block:"",title:"Add organization",desc:"Create a new organization. Assign admins and users to it from User management.",keywords:"add organization create tenant company"},{default:ye(()=>[a("div",_b,[ie(a("input",{"onUpdate:modelValue":c[68]||(c[68]=k=>po.name=k),class:"field",placeholder:"e.g. Northwind Aerial",onKeyup:pu(_o,["enter"])},null,544),[[me,po.name]]),a("div",bb,[a("button",{class:"btn-accent",disabled:go.value,onClick:_o},w(go.value?"Creating…":"Create organization"),9,yb),mo.value?(p(),m("span",xb,w(mo.value),1)):I("",!0)])])]),_:1})])),a("div",wb,[a("div",{class:"flex items-center justify-between px-5 py-4"},[c[152]||(c[152]=a("div",null,[a("div",{class:"eyebrow"},"Tenancy"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"All organizations")],-1)),a("button",{class:"btn-ghost",onClick:ni},"Refresh")]),yn.value.length?(p(),m("div",Sb,[a("table",Tb,[a("thead",null,[a("tr",Pb,[(p(),m(le,null,Ie(["Organization","Members",""],k=>a("th",{key:k,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w(k),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(yn.value,k=>(p(),m("tr",{key:k.id,class:Ce(["border-b border-line last:border-0",Nt.id===k.id?"bg-accent-soft":""])},[a("td",Cb,[a("span",Lb,[A(J,{name:"grid",size:14,class:"text-ink-muted"}),z(w(k.name),1)])]),a("td",Ab,w(As.value[k.id]||0),1),a("td",Mb,[vo.value===k.id?(p(),m(le,{key:0},[c[153]||(c[153]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:c[69]||(c[69]=Be=>vo.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:Be=>bo(k)}," Delete ",8,Eb)],64)):(p(),m("div",Ob,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5",onClick:Be=>_r(k)},[A(J,{name:"settings",size:14}),c[154]||(c[154]=z(" Rename ",-1))],8,zb),a("button",{class:"btn-ghost inline-flex items-center gap-1.5",disabled:(As.value[k.id]||0)>0,title:(As.value[k.id]||0)>0?"Reassign or remove members first":"",onClick:Be=>vo.value=k.id},[A(J,{name:"trash",size:14}),c[155]||(c[155]=z(" Delete ",-1))],8,$b)]))])],2))),128))])])])):(p(),m("div",kb,"No organizations yet."))])])):q.id==="advanced"?(p(),m("div",Ib,[a("div",Nb,[A(xe,{title:"Export data",desc:"Download your settings and profile as JSON.",keywords:"export data download backup"},{default:ye(()=>[a("button",{class:"btn-ghost",onClick:br},[A(J,{name:"download",size:15,class:"mr-1.5 inline"}),c[156]||(c[156]=z("Export",-1))])]),_:1}),A(xe,{block:"",title:"Import data",desc:"Restore settings from a previous export.",keywords:"import data upload restore"},{default:ye(()=>[a("label",Db,[A(J,{name:"upload",size:15,class:"mr-1.5 inline"}),c[157]||(c[157]=z("Choose file… ",-1)),a("input",{type:"file",accept:"application/json,.json",class:"hidden",onChange:wa},null,32)]),Yn.value?(p(),m("p",Fb,w(Yn.value),1)):I("",!0)]),_:1})]),a("div",Rb,[a("div",Bb,[A(J,{name:"alertTriangle",size:18}),c[158]||(c[158]=a("h3",{class:"text-sm font-bold uppercase tracking-caps"},"Danger zone",-1))]),c[163]||(c[163]=a("p",{class:"mt-1 text-xs text-ink-secondary"},"Deleting your account is permanent and cannot be undone.",-1)),a("div",Ub,[c[162]||(c[162]=a("div",{class:"text-sm font-semibold text-ink"},"Delete account",-1)),a("label",Vb,[ie(a("input",{"onUpdate:modelValue":c[70]||(c[70]=k=>mt.understand=k),type:"checkbox",class:"mt-0.5 h-4 w-4 accent-[var(--danger)]"},null,512),[[Va,mt.understand]]),c[159]||(c[159]=z(" I understand this permanently deletes my account and all associated data. ",-1))]),a("div",Zb,[a("label",Hb,[c[160]||(c[160]=z("Type ",-1)),a("span",jb,w(On.value),1),c[161]||(c[161]=z(" to confirm",-1))]),ie(a("input",{"onUpdate:modelValue":c[71]||(c[71]=k=>mt.typed=k),class:"field w-full max-w-[360px] font-mono",placeholder:On.value},null,8,Wb),[[me,mt.typed]])]),a("div",Kb,[mt.armed?(p(),m("button",{key:1,class:"rounded bg-danger px-4 py-2.5 text-sm font-semibold text-white transition enabled:hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-50",disabled:mt.cooldown>0,onClick:xo},w(mt.cooldown>0?`Confirm in ${mt.cooldown}s…`:"Permanently delete account"),9,qb)):(p(),m("button",{key:0,class:"rounded bg-danger px-4 py-2.5 text-sm font-semibold text-white transition enabled:hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-40",disabled:!Yo.value,onClick:ka}," Delete account… ",8,Gb)),mt.armed&&mt.cooldown>0?(p(),m("span",Yb,"Cooling-off period — read once more.")):I("",!0)]),mt.msg?(p(),m("p",Jb,w(mt.msg),1)):I("",!0)])])])):I("",!0)],64))),128))])]),A(vh,{name:"fade"},{default:ye(()=>[Nn.value?(p(),m("div",Xb,[A(J,{name:"check",size:16,class:"text-success-fg"}),z(w(Nn.value),1)])):I("",!0)]),_:1})]))}},ey=Pm(Qb,[["__scopeId","data-v-7522b856"]]),ty={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},ny={class:"flex flex-wrap items-center gap-3"},iy={class:"ml-auto flex items-center gap-2"},oy=["href"],sy={class:"grid grid-cols-3 gap-4 max-[900px]:grid-cols-1"},ay={class:"eyebrow"},ry={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},ly={key:1,class:"panel p-5"},uy={class:"mb-4 flex items-center justify-between"},cy={class:"eyebrow"},dy={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},fy={class:"block"},hy={class:"block"},py={class:"block"},my={class:"block"},gy={key:0,value:""},vy=["value"],_y={class:"block"},by={class:"block"},yy={class:"block"},xy={class:"block"},wy={class:"block"},ky=["value"],Sy={class:"block"},Ty=["value"],Py={class:"block"},Cy=["value"],Ly={class:"block"},Ay={class:"mt-3 block"},My={key:0,class:"mt-3 grid grid-cols-2 gap-3 max-[760px]:grid-cols-1"},Ey={class:"block"},Oy={class:"block"},zy={class:"block"},$y={class:"block"},Iy={class:"col-span-2 block max-[760px]:col-span-1"},Ny={class:"mt-4 flex items-center gap-3"},Dy=["disabled"],Fy={key:0,class:"text-sm text-danger-fg"},Ry={class:"panel overflow-hidden p-0"},By={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},Uy={key:1,class:"grid place-items-center px-5 py-16 text-center"},Vy={key:2,class:"overflow-x-auto"},Zy={class:"w-full border-collapse text-sm"},Hy={class:"text-left"},jy={class:"whitespace-nowrap px-5 py-3 font-mono text-ink"},Wy={key:0,class:"text-ink-muted"},Ky={class:"px-5 py-3 text-ink-secondary"},Gy=["title"],qy={class:"px-5 py-3 font-mono text-ink-secondary"},Yy={class:"px-5 py-3 text-ink-secondary"},Jy={class:"px-5 py-3"},Xy=["onClick"],Qy={class:"whitespace-nowrap px-5 py-3 text-right"},ex=["onClick"],tx=["onClick"],nx=["onClick"],ix={key:0,class:"border-b border-line bg-surface-2"},ox={colspan:"7",class:"px-5 py-3"},sx={class:"flex flex-wrap gap-x-8 gap-y-1.5 text-xs"},ax={class:"text-ink-secondary"},rx={class:"text-ink"},lx={class:"text-ink-secondary"},ux={class:"text-ink"},cx={class:"text-ink-secondary"},dx={class:"font-mono text-ink"},fx={key:0,class:"text-ink-secondary"},hx={class:"text-ink"},px={key:0,class:"mt-2 space-y-1"},mx={key:1,class:"mt-2 text-xs text-success-fg"},gx={__name:"Logbook",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},setup(t){const i=t,s={success:"bg-success-soft text-success-fg",danger:"bg-danger-soft text-danger-fg",neutral:"bg-surface-2 text-ink-secondary"},l=Y([]),u=Y([]),f=Y(!1),h=Y("");async function _(){f.value=!0,h.value="";const[O,N]=await Promise.all([pl(),Ap()]);(!O.ok||!N.ok)&&(h.value=O.status===503||N.status===503?"Logbook storage is not configured on the API Server (service account missing).":"Could not load the logbook."),l.value=O.drones,u.value=N.flights,f.value=!1}fi(_);function y(O){const N=O.compliance||{};return N.exempt?{tone:"neutral",label:"Exempt"}:(N.redFlags||[]).length?{tone:"danger",label:`${N.redFlags.length} issue${N.redFlags.length>1?"s":""}`}:{tone:"success",label:"Compliant"}}const C=Y("");function T(O){C.value=C.value===O?"":O}const M=[{value:"open",label:"Open"},{value:"specific",label:"Specific"},{value:"certified",label:"Certified"}],H=[{value:"commercial",label:"Commercial"},{value:"research",label:"Research"},{value:"public",label:"Public-benefit"},{value:"hobby",label:"Private hobby"},{value:"club_area",label:"Model-club area"}],j=[{value:"",label:"Auto (from drone)"},{value:"manual",label:"Manual"},{value:"automatic",label:"Automatic (FDR)"}];function K(){var O;return{operationDate:new Date().toISOString().slice(0,10),startTime:"",endTime:"",drone:((O=l.value[0])==null?void 0:O.id)||"",areaRoute:"",maxAltitudeAgl:"",pilotName:i.email,certificateRef:"",category:"open",purpose:"commercial",loggingPath:"",rawFdrLogUrl:"",authorisationRef:"",weather:"",airspaceRef:"",observer:"",incidents:"",notes:""}}const F=Y(!1),te=Y(""),X=gt(K()),fe=Y(""),Se=Y(!1),de=Y(!1);function Fe(){Object.assign(X,K()),te.value="",fe.value="",de.value=!1,F.value=!0}function Oe(O){Object.assign(X,{operationDate:(O.operationDate||"").slice(0,10),startTime:O.startTime||"",endTime:O.endTime||"",drone:O.drone||"",areaRoute:O.areaRoute||"",maxAltitudeAgl:O.maxAltitudeAgl||"",pilotName:O.pilotName||"",certificateRef:O.certificateRef||"",category:O.category||"open",purpose:O.purpose||"commercial",loggingPath:O.loggingPath||"",rawFdrLogUrl:O.rawFdrLogUrl||"",authorisationRef:O.authorisationRef||"",weather:O.weather||"",airspaceRef:O.airspaceRef||"",observer:O.observer||"",incidents:O.incidents||"",notes:O.notes||""}),te.value=O.id,fe.value="",de.value=!!(O.weather||O.airspaceRef||O.observer||O.incidents||O.notes),F.value=!0}function Te(){F.value=!1,te.value=""}async function Ze(){var $;if(fe.value="",!X.drone){fe.value="Select a drone first (add one in the Drones section).";return}Se.value=!0;const O={...X,maxAltitudeAgl:Number(X.maxAltitudeAgl)||0},N=te.value?await Ep(te.value,O):await Mp(O);if(Se.value=!1,!N.ok){fe.value=(($=N.body)==null?void 0:$.error)||"Could not save the flight.";return}F.value=!1,await _()}const he=Y("");async function Q(O){const N=await Op(O.id);he.value="",N.ok&&await _()}const B=ce(()=>{const O=u.value.length,N=u.value.filter(Ye=>{var we;return(((we=Ye.compliance)==null?void 0:we.redFlags)||[]).length}).length,$=u.value.filter(Ye=>{var we;return(we=Ye.compliance)==null?void 0:we.required}).length;return{total:O,flagged:N,required:$}});return(O,N)=>(p(),m("div",ty,[a("div",ny,[N[22]||(N[22]=a("div",null,[a("div",{class:"eyebrow"},"Logbook"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Flights (BEK 1649 §5)")],-1)),a("div",iy,[a("a",{href:Ee(zp)(),class:"btn-ghost inline-flex items-center gap-2",title:"Download a compliance CSV (Trafikstyrelsen / police disclosure)"},[A(J,{name:"download",size:15}),N[20]||(N[20]=z(" Export CSV ",-1))],8,oy),a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:Fe},[A(J,{name:"plus",size:15}),N[21]||(N[21]=z(" Log flight ",-1))])])]),a("div",sy,[(p(!0),m(le,null,Ie([{label:"Flights logged",value:B.value.total,tone:"neutral"},{label:"Require logbook",value:B.value.required,tone:"neutral"},{label:"Compliance flags",value:B.value.flagged,tone:B.value.flagged?"danger":"success"}],$=>(p(),m("div",{key:$.label,class:"panel p-5"},[a("div",ay,w($.label),1),a("div",{class:Ce(["mt-2 text-[30px] font-bold leading-none tracking-tightest",$.tone==="danger"?"text-danger-fg":$.tone==="success"?"text-success-fg":"text-ink"])},w($.value),3)]))),128))]),h.value?(p(),m("div",ry,w(h.value),1)):I("",!0),F.value?(p(),m("div",ly,[a("div",uy,[a("div",null,[a("div",cy,w(te.value?"Edit entry":"New entry"),1),N[23]||(N[23]=a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Logbook flight (BEK 1649 §5)",-1))]),a("button",{class:"btn-icon",onClick:Te},[A(J,{name:"x",size:16})])]),a("div",dy,[a("label",fy,[N[24]||(N[24]=a("span",{class:"eyebrow mb-1 block"},"Date",-1)),ie(a("input",{"onUpdate:modelValue":N[0]||(N[0]=$=>X.operationDate=$),type:"date",class:"field"},null,512),[[me,X.operationDate]])]),a("label",hy,[N[25]||(N[25]=a("span",{class:"eyebrow mb-1 block"},"Start",-1)),ie(a("input",{"onUpdate:modelValue":N[1]||(N[1]=$=>X.startTime=$),type:"time",class:"field"},null,512),[[me,X.startTime]])]),a("label",py,[N[26]||(N[26]=a("span",{class:"eyebrow mb-1 block"},"End",-1)),ie(a("input",{"onUpdate:modelValue":N[2]||(N[2]=$=>X.endTime=$),type:"time",class:"field"},null,512),[[me,X.endTime]])]),a("label",my,[N[27]||(N[27]=a("span",{class:"eyebrow mb-1 block"},"Drone",-1)),ie(a("select",{"onUpdate:modelValue":N[3]||(N[3]=$=>X.drone=$),class:"field"},[l.value.length?I("",!0):(p(),m("option",gy,"— add a drone first —")),(p(!0),m(le,null,Ie(l.value,$=>(p(),m("option",{key:$.id,value:$.id},w($.displayName),9,vy))),128))],512),[[Ot,X.drone]])]),a("label",_y,[N[28]||(N[28]=a("span",{class:"eyebrow mb-1 block"},"Max altitude (m AGL)",-1)),ie(a("input",{"onUpdate:modelValue":N[4]||(N[4]=$=>X.maxAltitudeAgl=$),type:"number",min:"0",class:"field",placeholder:"120"},null,512),[[me,X.maxAltitudeAgl]])]),a("label",by,[N[29]||(N[29]=a("span",{class:"eyebrow mb-1 block"},"Area / route",-1)),ie(a("input",{"onUpdate:modelValue":N[5]||(N[5]=$=>X.areaRoute=$),class:"field",placeholder:"Field N of Roskilde, grid survey"},null,512),[[me,X.areaRoute]])]),a("label",yy,[N[30]||(N[30]=a("span",{class:"eyebrow mb-1 block"},"Remote pilot name",-1)),ie(a("input",{"onUpdate:modelValue":N[6]||(N[6]=$=>X.pilotName=$),class:"field",placeholder:"Full name"},null,512),[[me,X.pilotName]])]),a("label",xy,[N[31]||(N[31]=a("span",{class:"eyebrow mb-1 block"},"Certificate ref",-1)),ie(a("input",{"onUpdate:modelValue":N[7]||(N[7]=$=>X.certificateRef=$),class:"field",placeholder:"A2 / STS cert no."},null,512),[[me,X.certificateRef]])]),a("label",wy,[N[32]||(N[32]=a("span",{class:"eyebrow mb-1 block"},"Logging path",-1)),ie(a("select",{"onUpdate:modelValue":N[8]||(N[8]=$=>X.loggingPath=$),class:"field"},[(p(),m(le,null,Ie(j,$=>a("option",{key:$.value,value:$.value},w($.label),9,ky)),64))],512),[[Ot,X.loggingPath]])]),a("label",Sy,[N[33]||(N[33]=a("span",{class:"eyebrow mb-1 block"},"Category",-1)),ie(a("select",{"onUpdate:modelValue":N[9]||(N[9]=$=>X.category=$),class:"field"},[(p(),m(le,null,Ie(M,$=>a("option",{key:$.value,value:$.value},w($.label),9,Ty)),64))],512),[[Ot,X.category]])]),a("label",Py,[N[34]||(N[34]=a("span",{class:"eyebrow mb-1 block"},"Purpose",-1)),ie(a("select",{"onUpdate:modelValue":N[10]||(N[10]=$=>X.purpose=$),class:"field"},[(p(),m(le,null,Ie(H,$=>a("option",{key:$.value,value:$.value},w($.label),9,Cy)),64))],512),[[Ot,X.purpose]])]),a("label",Ly,[N[35]||(N[35]=a("span",{class:"eyebrow mb-1 block"},"Authorisation ref",-1)),ie(a("input",{"onUpdate:modelValue":N[11]||(N[11]=$=>X.authorisationRef=$),class:"field",placeholder:"Specific-category ref"},null,512),[[me,X.authorisationRef]])])]),a("label",Ay,[N[36]||(N[36]=a("span",{class:"eyebrow mb-1 block"},"FDR log URL (automatic path)",-1)),ie(a("input",{"onUpdate:modelValue":N[12]||(N[12]=$=>X.rawFdrLogUrl=$),class:"field",placeholder:"Link to the stored flight-data-recorder export"},null,512),[[me,X.rawFdrLogUrl]])]),a("button",{class:"mt-4 flex items-center gap-1.5 text-sm font-semibold text-accent",onClick:N[13]||(N[13]=$=>de.value=!de.value)},[A(J,{name:de.value?"x":"plus",size:14},null,8,["name"]),N[37]||(N[37]=z(" Operational details (weather, airspace, incidents) ",-1))]),de.value?(p(),m("div",My,[a("label",Ey,[N[38]||(N[38]=a("span",{class:"eyebrow mb-1 block"},"Weather / wind",-1)),ie(a("input",{"onUpdate:modelValue":N[14]||(N[14]=$=>X.weather=$),class:"field",placeholder:"6 m/s NW, CAVOK"},null,512),[[me,X.weather]])]),a("label",Oy,[N[39]||(N[39]=a("span",{class:"eyebrow mb-1 block"},"Airspace / NOTAM ref",-1)),ie(a("input",{"onUpdate:modelValue":N[15]||(N[15]=$=>X.airspaceRef=$),class:"field"},null,512),[[me,X.airspaceRef]])]),a("label",zy,[N[40]||(N[40]=a("span",{class:"eyebrow mb-1 block"},"Observer",-1)),ie(a("input",{"onUpdate:modelValue":N[16]||(N[16]=$=>X.observer=$),class:"field"},null,512),[[me,X.observer]])]),a("label",$y,[N[41]||(N[41]=a("span",{class:"eyebrow mb-1 block"},"Incidents / anomalies",-1)),ie(a("input",{"onUpdate:modelValue":N[17]||(N[17]=$=>X.incidents=$),class:"field",placeholder:"RTH trigger, GPS dropout…"},null,512),[[me,X.incidents]])]),a("label",Iy,[N[42]||(N[42]=a("span",{class:"eyebrow mb-1 block"},"Notes",-1)),ie(a("textarea",{"onUpdate:modelValue":N[18]||(N[18]=$=>X.notes=$),rows:"2",class:"field"},null,512),[[me,X.notes]])])])):I("",!0),a("div",Ny,[a("button",{class:"btn-accent",disabled:Se.value,onClick:Ze},w(Se.value?"Saving…":te.value?"Save changes":"Log flight"),9,Dy),a("button",{class:"btn-ghost",onClick:Te},"Cancel"),fe.value?(p(),m("span",Fy,w(fe.value),1)):I("",!0)])])):I("",!0),a("div",Ry,[f.value?(p(),m("div",By,"Loading…")):u.value.length?(p(),m("div",Vy,[a("table",Zy,[a("thead",null,[a("tr",Hy,[(p(),m(le,null,Ie(["Date","Drone","Area / route","Alt","Pilot","Compliance",""],$=>a("th",{key:$,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w($),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(u.value,$=>{var Ye,we,ge,ue;return p(),m(le,{key:$.id},[a("tr",{class:Ce(["border-b border-line last:border-0",te.value===$.id?"bg-accent-soft":""])},[a("td",jy,[z(w(($.operationDate||"").slice(0,10))+" ",1),$.startTime?(p(),m("span",Wy,w($.startTime),1)):I("",!0)]),a("td",Ky,w($.droneName||"—"),1),a("td",{class:"max-w-[220px] truncate px-5 py-3 text-ink-secondary",title:$.areaRoute},w($.areaRoute||"—"),9,Gy),a("td",qy,w($.maxAltitudeAgl?$.maxAltitudeAgl+" m":"—"),1),a("td",Yy,w($.pilotName||"—"),1),a("td",Jy,[a("button",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",s[y($).tone]]),onClick:ft=>T($.id)},[y($).tone==="danger"?(p(),nt(J,{key:0,name:"alertTriangle",size:12})):y($).tone==="success"?(p(),nt(J,{key:1,name:"check",size:12})):I("",!0),z(" "+w(y($).label),1)],10,Xy)]),a("td",Qy,[he.value===$.id?(p(),m(le,{key:0},[N[45]||(N[45]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:N[19]||(N[19]=ft=>he.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:ft=>Q($)},"Delete",8,ex)],64)):(p(),m(le,{key:1},[a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:ft=>Oe($)},[A(J,{name:"sliders",size:13}),N[46]||(N[46]=z(" Edit",-1))],8,tx),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:ft=>he.value=$.id},[A(J,{name:"trash",size:13})],8,nx)],64))])],2),C.value===$.id?(p(),m("tr",ix,[a("td",ox,[a("div",sx,[a("span",ax,[N[47]||(N[47]=z("Logging path: ",-1)),a("b",rx,w(((Ye=$.compliance)==null?void 0:Ye.loggingPath)||"—"),1)]),a("span",lx,[N[48]||(N[48]=z("Category: ",-1)),a("b",ux,w($.category||"—"),1)]),a("span",cx,[N[49]||(N[49]=z("Retain until: ",-1)),a("b",dx,w(($.retentionUntil||"").slice(0,10)||"—"),1)]),(we=$.compliance)!=null&&we.exempt?(p(),m("span",fx,[N[50]||(N[50]=z("Exempt: ",-1)),a("b",hx,w($.compliance.exemptReason),1)])):I("",!0)]),(((ge=$.compliance)==null?void 0:ge.redFlags)||[]).length?(p(),m("ul",px,[(p(!0),m(le,null,Ie($.compliance.redFlags,(ft,pe)=>(p(),m("li",{key:pe,class:"flex items-start gap-2 text-xs text-danger-fg"},[A(J,{name:"alertTriangle",size:13,class:"mt-px shrink-0"}),z(" "+w(ft),1)]))),128))])):(ue=$.compliance)!=null&&ue.exempt?I("",!0):(p(),m("div",mx,"No compliance gaps detected."))])])):I("",!0)],64)}),128))])])])):(p(),m("div",Uy,[A(J,{name:"book",size:26,class:"text-ink-muted"}),N[43]||(N[43]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No flights logged yet",-1)),N[44]||(N[44]=a("div",{class:"mt-1 text-xs text-ink-muted"},"Log your first operation to start the 5-year retention record.",-1))]))])]))}},vx={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},_x={class:"flex flex-wrap items-center gap-3"},bx={class:"ml-auto flex items-center gap-2"},yx={class:"grid grid-cols-4 gap-4 max-[900px]:grid-cols-2"},xx={class:"eyebrow"},wx={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},kx={key:1,class:"panel p-5"},Sx={class:"mb-4 flex items-center justify-between"},Tx={class:"eyebrow"},Px={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},Cx={class:"block"},Lx={class:"block"},Ax={class:"block"},Mx={class:"block"},Ex={class:"block"},Ox={class:"block"},zx={class:"block"},$x={class:"block"},Ix={class:"block"},Nx={class:"block"},Dx=["value"],Fx={class:"mt-3 flex flex-wrap gap-6"},Rx={class:"flex items-center gap-2 text-sm text-ink-secondary"},Bx={class:"flex items-center gap-2 text-sm text-ink-secondary"},Ux={class:"mt-4 flex items-center gap-3"},Vx=["disabled"],Zx={key:0,class:"text-sm text-danger-fg"},Hx={class:"panel overflow-hidden p-0"},jx={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},Wx={key:1,class:"grid place-items-center px-5 py-16 text-center"},Kx={key:2,class:"overflow-x-auto"},Gx={class:"w-full border-collapse text-sm"},qx={class:"text-left"},Yx={class:"px-5 py-3"},Jx={class:"flex items-center gap-2"},Xx={class:"font-semibold text-ink"},Qx={key:0,class:"text-xs text-ink-muted"},e0={key:1,class:"text-xs text-ink-muted"},t0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},n0={key:0,class:"text-[11px] text-ink-muted",title:"Flight controller SN — reported by the aircraft, not its registered serial"},i0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},o0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},s0={class:"px-5 py-3 font-mono text-xs text-ink-secondary"},a0={class:"px-5 py-3"},r0={key:1,class:"text-ink-muted"},l0={class:"whitespace-nowrap px-5 py-3 text-right"},u0=["onClick"],c0=["onClick"],d0=["onClick"],f0={__name:"Drones",props:{connectedFcSerials:{type:Array,default:()=>[]}},emits:["deleted"],setup(t,{expose:i,emit:s}){const l=t,u=s,f={success:"bg-success-soft text-success-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},h=Y([]),_=Y(!1),y=Y("");async function C(){_.value=!0,y.value="";const Q=await pl();Q.ok||(y.value=Q.status===503?"Drone storage is not configured on the API Server (service account missing).":"Could not load your drones."),h.value=Q.drones,_.value=!1}fi(C),i({reload:C});const T=ce(()=>new Set(l.connectedFcSerials.filter(Boolean)));function M(Q){return!!Q.flightControllerSerial&&T.value.has(Q.flightControllerSerial)}const H=["","C0","C1","C2","C3","C4","C5","C6"];function j(){return{name:"",model:"",serial:"",flightControllerSerial:"",firmware:"",controllerFirmware:"",registration:"",operatorNumber:"",mtomGrams:"",isToy:!1,autologsFlights:!1,cClass:""}}const K=Y(!1),F=Y(""),te=gt(j()),X=Y(""),fe=Y(!1);function Se(){Object.assign(te,j()),F.value="",X.value="",K.value=!0}function de(Q){Object.assign(te,{name:Q.name||"",model:Q.model||"",serial:Q.serial||"",flightControllerSerial:Q.flightControllerSerial||"",firmware:Q.firmware||"",controllerFirmware:Q.controllerFirmware||"",registration:Q.registration||"",operatorNumber:Q.operatorNumber||"",mtomGrams:Q.mtomGrams||"",isToy:!!Q.isToy,autologsFlights:!!Q.autologsFlights,cClass:Q.cClass||""}),F.value=Q.id,X.value="",K.value=!0}function Fe(){K.value=!1,F.value=""}async function Oe(){var O;if(X.value="",!te.name.trim()&&!te.model.trim()&&!te.serial.trim()&&!te.flightControllerSerial.trim()){X.value="Give the drone a custom name, model or serial.";return}fe.value=!0;const Q={...te,mtomGrams:Number(te.mtomGrams)||0},B=F.value?await Cp(F.value,Q):await Tp(Q);if(fe.value=!1,!B.ok){X.value=((O=B.body)==null?void 0:O.error)||"Could not save the drone.";return}K.value=!1,await C()}const Te=Y("");async function Ze(Q){var O;const B=await Lp(Q.id);Te.value="",B.ok?(u("deleted",Q.flightControllerSerial),await C()):X.value=((O=B.body)==null?void 0:O.error)||"Could not delete the drone."}const he=ce(()=>({fleet:h.value.length,connected:h.value.filter(M).length,unnamed:h.value.filter(Q=>!(Q.name||"").trim()).length,unregistered:h.value.filter(Q=>!(Q.registration||"").trim()).length}));return(Q,B)=>(p(),m("div",vx,[a("div",_x,[B[14]||(B[14]=a("div",null,[a("div",{class:"eyebrow"},"Fleet"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Drones you fly")],-1)),a("div",bx,[a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:Se},[A(J,{name:"plus",size:15}),B[13]||(B[13]=z(" Add drone ",-1))])])]),a("div",yx,[(p(!0),m(le,null,Ie([{label:"Drones in fleet",value:he.value.fleet,tone:"neutral"},{label:"Connected now",value:he.value.connected,tone:he.value.connected?"success":"neutral"},{label:"Awaiting a name",value:he.value.unnamed,tone:"neutral"},{label:"No registration",value:he.value.unregistered,tone:"neutral"}],O=>(p(),m("div",{key:O.label,class:"panel p-5"},[a("div",xx,w(O.label),1),a("div",{class:Ce(["mt-2 text-[30px] font-bold leading-none tracking-tightest",O.tone==="success"?"text-success-fg":"text-ink"])},w(O.value),3)]))),128))]),y.value?(p(),m("div",wx,w(y.value),1)):I("",!0),K.value?(p(),m("div",kx,[a("div",Sx,[a("div",null,[a("div",Tx,w(F.value?"Edit drone":"New drone"),1),B[15]||(B[15]=a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Aircraft registry",-1))]),a("button",{class:"btn-icon",onClick:Fe},[A(J,{name:"x",size:16})])]),a("div",Px,[a("label",Cx,[B[16]||(B[16]=a("span",{class:"eyebrow mb-1 block"},"Custom name",-1)),ie(a("input",{"onUpdate:modelValue":B[0]||(B[0]=O=>te.name=O),class:"field",placeholder:"Mavic-01"},null,512),[[me,te.name]])]),a("label",Lx,[B[17]||(B[17]=a("span",{class:"eyebrow mb-1 block"},"Model",-1)),ie(a("input",{"onUpdate:modelValue":B[1]||(B[1]=O=>te.model=O),class:"field",placeholder:"DJI Mavic 3 Enterprise"},null,512),[[me,te.model]])]),a("label",Ax,[B[18]||(B[18]=a("span",{class:"eyebrow mb-1 block"},"Serial number",-1)),ie(a("input",{"onUpdate:modelValue":B[2]||(B[2]=O=>te.serial=O),class:"field",placeholder:"08QDE3H012032E"},null,512),[[me,te.serial]]),B[19]||(B[19]=a("span",{class:"mt-1 block text-xs text-ink-muted"},"From the sticker on the airframe.",-1))]),a("label",Mx,[B[20]||(B[20]=a("span",{class:"eyebrow mb-1 block"},"Flight controller SN",-1)),ie(a("input",{"onUpdate:modelValue":B[3]||(B[3]=O=>te.flightControllerSerial=O),class:"field",placeholder:"08RDE1J00103H1"},null,512),[[me,te.flightControllerSerial]]),B[21]||(B[21]=a("span",{class:"mt-1 block text-xs text-ink-muted"},"Auto-filled on connect.",-1))]),a("label",Ex,[B[22]||(B[22]=a("span",{class:"eyebrow mb-1 block"},"Drone firmware",-1)),ie(a("input",{"onUpdate:modelValue":B[4]||(B[4]=O=>te.firmware=O),class:"field",placeholder:"03.02.35.05"},null,512),[[me,te.firmware]])]),a("label",Ox,[B[23]||(B[23]=a("span",{class:"eyebrow mb-1 block"},"Controller firmware",-1)),ie(a("input",{"onUpdate:modelValue":B[5]||(B[5]=O=>te.controllerFirmware=O),class:"field",placeholder:"01.03.0800"},null,512),[[me,te.controllerFirmware]])]),a("label",zx,[B[24]||(B[24]=a("span",{class:"eyebrow mb-1 block"},"Registration (FAA/CAA)",-1)),ie(a("input",{"onUpdate:modelValue":B[6]||(B[6]=O=>te.registration=O),class:"field",placeholder:"FA3X7K9PLM"},null,512),[[me,te.registration]])]),a("label",$x,[B[25]||(B[25]=a("span",{class:"eyebrow mb-1 block"},"Operator no. (EU)",-1)),ie(a("input",{"onUpdate:modelValue":B[7]||(B[7]=O=>te.operatorNumber=O),class:"field",placeholder:"DNK…"},null,512),[[me,te.operatorNumber]])]),a("label",Ix,[B[26]||(B[26]=a("span",{class:"eyebrow mb-1 block"},"MTOM (grams)",-1)),ie(a("input",{"onUpdate:modelValue":B[8]||(B[8]=O=>te.mtomGrams=O),type:"number",min:"0",class:"field",placeholder:"920"},null,512),[[me,te.mtomGrams]])]),a("label",Nx,[B[27]||(B[27]=a("span",{class:"eyebrow mb-1 block"},"C-class",-1)),ie(a("select",{"onUpdate:modelValue":B[9]||(B[9]=O=>te.cClass=O),class:"field"},[(p(),m(le,null,Ie(H,O=>a("option",{key:O,value:O},w(O||"— none —"),9,Dx)),64))],512),[[Ot,te.cClass]])])]),B[30]||(B[30]=a("p",{class:"mt-3 text-xs text-ink-muted"}," Model, flight controller SN and both firmware versions fill themselves in when the drone connects — anything you type here is kept as-is. The serial number is the one you register the drone under, and only you can supply it: the SDK cannot read it off the aircraft. ",-1)),a("div",Fx,[a("label",Rx,[ie(a("input",{"onUpdate:modelValue":B[10]||(B[10]=O=>te.autologsFlights=O),type:"checkbox",class:"h-4 w-4 accent-[var(--accent)]"},null,512),[[Va,te.autologsFlights]]),B[28]||(B[28]=z(" Auto-logs flights (onboard FDR) ",-1))]),a("label",Bx,[ie(a("input",{"onUpdate:modelValue":B[11]||(B[11]=O=>te.isToy=O),type:"checkbox",class:"h-4 w-4 accent-[var(--accent)]"},null,512),[[Va,te.isToy]]),B[29]||(B[29]=z(" Toy drone (logbook-exempt) ",-1))])]),a("div",Ux,[a("button",{class:"btn-accent",disabled:fe.value,onClick:Oe},w(fe.value?"Saving…":F.value?"Save changes":"Add drone"),9,Vx),a("button",{class:"btn-ghost",onClick:Fe},"Cancel"),X.value?(p(),m("span",Zx,w(X.value),1)):I("",!0)])])):I("",!0),a("div",Hx,[_.value?(p(),m("div",jx,"Loading…")):h.value.length?(p(),m("div",Kx,[a("table",Gx,[a("thead",null,[a("tr",qx,[(p(),m(le,null,Ie(["Drone","Serial","Firmware","Ctrl FW","Registration","Class",""],O=>a("th",{key:O,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w(O),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(h.value,O=>(p(),m("tr",{key:O.id,class:Ce(["border-b border-line last:border-0",F.value===O.id?"bg-accent-soft":""])},[a("td",Yx,[a("div",Jx,[a("span",Xx,w(O.displayName),1),M(O)?(p(),m("span",{key:0,class:Ce(["inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold",f.success])},[A(J,{name:"signal",size:11}),B[33]||(B[33]=z(" connected ",-1))],2)):I("",!0)]),O.name&&O.model?(p(),m("div",Qx,w(O.model),1)):O.name?I("",!0):(p(),m("div",e0,"no custom name yet"))]),a("td",t0,[z(w(O.serial||"—")+" ",1),O.flightControllerSerial?(p(),m("div",n0," FC "+w(O.flightControllerSerial),1)):I("",!0)]),a("td",i0,w(O.firmware||"—"),1),a("td",o0,w(O.controllerFirmware||"—"),1),a("td",s0,w(O.registration||"—"),1),a("td",a0,[O.cClass?(p(),m("span",{key:0,class:Ce(["inline-flex rounded-full px-2 py-0.5 text-[11px] font-semibold",f.accent])},w(O.cClass),3)):(p(),m("span",r0,"—")),O.isToy?(p(),m("span",{key:2,class:Ce(["ml-1 inline-flex rounded-full px-2 py-0.5 text-[11px] font-semibold",f.neutral])},"toy",2)):I("",!0)]),a("td",l0,[Te.value===O.id?(p(),m(le,{key:0},[B[34]||(B[34]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:B[12]||(B[12]=N=>Te.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:N=>Ze(O)},"Delete",8,u0)],64)):(p(),m(le,{key:1},[a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:N=>de(O)},[A(J,{name:"sliders",size:13}),B[35]||(B[35]=z(" Edit",-1))],8,c0),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:N=>Te.value=O.id},[A(J,{name:"trash",size:13})],8,d0)],64))])],2))),128))])])])):(p(),m("div",Wx,[A(J,{name:"drone",size:26,class:"text-ink-muted"}),B[31]||(B[31]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No drones yet",-1)),B[32]||(B[32]=a("div",{class:"mt-1 text-xs text-ink-muted"}," Connect a drone in the Fly App and it lands here by itself — or add one by hand. ",-1))]))])]))}},h0={class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},p0={class:"flex flex-wrap items-center gap-3"},m0={class:"inline-flex flex-wrap rounded-lg border border-line bg-surface-1 p-0.5"},g0=["onClick"],v0={class:"ml-auto"},_0={class:"grid grid-cols-4 gap-4 max-[900px]:grid-cols-2"},b0={class:"eyebrow"},y0={key:0,class:"panel border-danger/40 p-4 text-sm text-danger-fg"},x0={key:1,class:"panel p-5"},w0={class:"mb-4 flex items-center justify-between"},k0={class:"eyebrow"},S0={class:"mt-0.5 text-base font-semibold text-ink"},T0={class:"grid grid-cols-3 gap-3 max-[760px]:grid-cols-1"},P0={class:"col-span-2 block max-[760px]:col-span-1"},C0={class:"block"},L0=["value"],A0={class:"block"},M0=["value"],E0={class:"block"},O0=["value"],z0={class:"block"},$0={class:"block"},I0={class:"block"},N0={class:"block"},D0=["value"],F0={class:"block"},R0={class:"block"},B0={class:"block"},U0=["value"],V0={class:"mt-3 block"},Z0={key:0,class:"mt-3"},H0={class:"eyebrow mb-1 block"},j0={key:1,class:"mt-3 text-xs text-ink-muted"},W0={class:"mt-4 flex items-center gap-3"},K0=["disabled"],G0={key:0,class:"text-sm text-danger-fg"},q0={class:"panel overflow-hidden p-0"},Y0={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},J0={key:1,class:"grid place-items-center px-5 py-16 text-center"},X0={class:"mt-3 text-sm font-medium text-ink-secondary"},Q0={class:"mt-1 text-xs text-ink-muted"},ew={key:2,class:"overflow-x-auto"},tw={class:"w-full border-collapse text-sm"},nw={class:"text-left"},iw={class:"px-5 py-3"},ow={class:"font-semibold text-ink"},sw={key:0,class:"font-mono text-[11px] text-ink-muted"},aw={class:"px-5 py-3 text-ink-secondary"},rw={class:"px-5 py-3 text-ink-secondary"},lw={class:"px-5 py-3"},uw=["onClick"],cw={key:0,class:"mt-0.5 font-mono text-[10.5px] text-ink-muted"},dw={class:"px-5 py-3 font-mono text-ink-secondary"},fw={class:"whitespace-nowrap px-5 py-3 text-right"},hw=["onClick"],pw=["onClick"],mw=["href"],gw=["onClick"],vw=["onClick"],_w=["onClick"],bw={key:0,class:"border-b border-line bg-surface-2"},yw={colspan:"6",class:"px-5 py-3"},xw={class:"flex flex-wrap gap-x-8 gap-y-1.5 text-xs"},ww={class:"text-ink-secondary"},kw={class:"text-ink"},Sw={class:"text-ink-secondary"},Tw={class:"text-ink"},Pw={key:0,class:"text-ink-secondary"},Cw={class:"text-ink"},Lw={key:1,class:"text-ink-secondary"},Aw={class:"font-mono text-ink"},Mw={key:2,class:"text-ink-secondary"},Ew={class:"font-mono text-ink"},Ow={class:"text-ink-secondary"},zw={class:"text-ink"},$w={key:0,class:"mt-2 space-y-1"},Iw={key:1,class:"mt-2 text-xs text-success-fg"},Nw={key:2,class:"mt-2 text-xs text-ink-secondary"},Dw={class:"flex max-h-[90vh] w-full max-w-[920px] flex-col overflow-hidden rounded-lg border border-line bg-surface-1 shadow-2xl"},Fw={class:"flex items-center gap-3 border-b border-line px-5 py-3"},Rw={class:"min-w-0"},Bw={class:"truncate text-sm font-semibold text-ink"},Uw={class:"truncate font-mono text-[11px] text-ink-muted"},Vw={class:"ml-auto flex items-center gap-2"},Zw=["href"],Hw=["href"],jw={class:"flex-1 overflow-auto bg-surface-2"},Ww=["src","alt"],Kw=["src","title"],Gw={key:2,class:"grid place-items-center px-6 py-16 text-center"},qw={class:"mt-1 text-xs text-ink-muted"},Yw=["href"],Jw={__name:"Documents",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},setup(t){const i={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},s=[{value:"certificate",label:"Pilot certificate"},{value:"medical",label:"Medical / training"},{value:"insurance",label:"Insurance / liability"},{value:"background_check",label:"Background check / waiver"},{value:"registration",label:"Aircraft registration"},{value:"maintenance",label:"Maintenance log"},{value:"conformity",label:"Conformity / compliance"},{value:"firmware",label:"Firmware / software"},{value:"incident",label:"Incident / repair report"},{value:"flight_log",label:"Flight log"},{value:"checklist",label:"Pre-flight checklist"},{value:"airspace_auth",label:"Airspace authorisation"},{value:"mission_plan",label:"Mission plan / flight path"},{value:"risk_assessment",label:"Risk assessment / survey"},{value:"contract",label:"Contract / SOW"},{value:"client_insurance",label:"Client insurance cert"},{value:"delivery_report",label:"Delivery / media handoff"},{value:"other",label:"Other"}],l=Object.fromEntries(s.map(x=>[x.value,x.label])),u=[{value:"pilot",label:"Pilot"},{value:"aircraft",label:"Aircraft"},{value:"organization",label:"Organization"},{value:"client",label:"Client"},{value:"other",label:"Other"}],f=[{value:"active",label:"Active"},{value:"pending_review",label:"Pending review"},{value:"archived",label:"Archived"}],h=[{value:"pilot",label:"Pilot"},{value:"ops",label:"Ops manager"},{value:"admin",label:"Admin"},{value:"client",label:"Client-facing"}],_=Y([]),y=Y([]),C=Y(!1),T=Y("");async function M(){C.value=!0,T.value="";const[x,b]=await Promise.all([$p(),pl()]);x.ok||(T.value=x.status===503?"Document storage is not configured on the API Server (service account missing).":"Could not load documents."),_.value=x.documents,y.value=b.drones||[],C.value=!1}fi(M);const H=Y("all"),j=[["all","All"],["expiring","Expiring soon"],["expired","Expired"],["pending","Pending review"],["archived","Archived"]],K=ce(()=>{const x=_.value;switch(H.value){case"expiring":return x.filter(b=>{var S;return((S=b.expiry)==null?void 0:S.state)==="expiring_soon"&&b.status!=="archived"});case"expired":return x.filter(b=>{var S;return((S=b.expiry)==null?void 0:S.state)==="expired"&&b.status!=="archived"});case"pending":return x.filter(b=>b.status==="pending_review");case"archived":return x.filter(b=>b.status==="archived");default:return x.filter(b=>b.status!=="archived")}});function F(x){if(x.status==="archived")return{tone:"neutral",label:"Superseded",icon:""};const b=x.expiry||{};return b.state==="expired"?{tone:"danger",label:"Expired",icon:"alertTriangle"}:b.state==="expiring_soon"?{tone:"warning",label:`Expires in ${b.daysUntilExpiry}d`,icon:"clock"}:b.state==="valid"?{tone:"success",label:"Valid",icon:"check"}:{tone:"neutral",label:"No expiry",icon:""}}const te=Y("");function X(x){te.value=te.value===x?"":x}function fe(x){return x.ownerDrone?x.ownerDroneName||"Aircraft":x.ownerRef?x.ownerRef:x.ownerType==="pilot"?"Pilot":x.ownerType?x.ownerType.charAt(0).toUpperCase()+x.ownerType.slice(1):"—"}const Se=["png","jpg","jpeg","gif","webp","svg","bmp","avif"],de=["pdf","txt","csv","log","json","md","html","htm","xml"];function Fe(x){const b=(x||"").split(".").pop().toLowerCase();return Se.includes(b)?"image":de.includes(b)?"frame":"none"}const Oe=Y(null),Te=ce(()=>Oe.value?Fe(Oe.value.fileName):"none"),Ze=ce(()=>Oe.value?Fp(Oe.value.id):"");function he(x){Oe.value=x}function Q(){Oe.value=null}function B(x){x.key==="Escape"&&Oe.value&&Q()}fi(()=>window.addEventListener("keydown",B)),us(()=>window.removeEventListener("keydown",B));function O(){return{title:"",docType:"certificate",ownerType:"pilot",ownerDrone:"",ownerRef:"",reference:"",jurisdiction:"",issueDate:"",expiryDate:"",status:"active",accessTier:"ops",notes:""}}const N=Y(!1),$=Y(""),Ye=Y(""),we=Y(""),ge=gt(O()),ue=Y(null),ft=Y(null),pe=Y(""),Ue=Y(!1);function Ve(){ue.value=null,ft.value&&(ft.value.value="")}function wt(){Object.assign(ge,O()),$.value="",Ye.value="",we.value="",Ve(),pe.value="",N.value=!0}function st(x){Object.assign(ge,{title:x.title||"",docType:x.docType||"certificate",ownerType:x.ownerType||"pilot",ownerDrone:x.ownerDrone||"",ownerRef:x.ownerRef||"",reference:x.reference||"",jurisdiction:x.jurisdiction||"",issueDate:x.issueDate||"",expiryDate:x.expiryDate||"",status:x.status||"active",accessTier:x.accessTier||"ops",notes:x.notes||""}),$.value=x.id,Ye.value="",we.value="",Ve(),pe.value="",N.value=!0}function Le(x){st(x),$.value="",Ye.value=x.id,we.value=x.title,ge.status="active"}function De(){N.value=!1,$.value="",Ye.value=""}function zt(x){var b;ue.value=((b=x.target.files)==null?void 0:b[0])||null}async function At(){var b;if(pe.value="",!ge.title.trim()){pe.value="Give the document a title.";return}Ue.value=!0;let x;if($.value)x=await Np($.value,{...ge});else{const S={...ge};Ye.value&&(S.replaces=Ye.value),x=await Ip(S,ue.value)}if(Ue.value=!1,!x.ok){pe.value=((b=x.body)==null?void 0:b.error)||"Could not save the document.";return}N.value=!1,$.value="",Ye.value="",await M()}const Ut=Y("");async function Pt(x){var S;const b=await Dp(x.id);Ut.value="",b.ok?await M():pe.value=((S=b.body)==null?void 0:S.error)||"Could not delete the document."}const kt=ce(()=>{const x=_.value.filter(b=>b.status!=="archived");return{total:x.length,expiring:x.filter(b=>{var S;return((S=b.expiry)==null?void 0:S.state)==="expiring_soon"}).length,expired:x.filter(b=>{var S;return((S=b.expiry)==null?void 0:S.state)==="expired"}).length,pending:_.value.filter(b=>b.status==="pending_review").length}});return(x,b)=>(p(),m("div",h0,[a("div",p0,[a("div",m0,[(p(),m(le,null,Ie(j,S=>a("button",{key:S[0],class:Ce(["rounded-md px-3.5 py-1.5 text-sm font-semibold transition",H.value===S[0]?"bg-accent-soft text-accent-soft-fg":"text-ink-secondary hover:text-ink"]),onClick:W=>H.value=S[0]},w(S[1]),11,g0)),64))]),a("div",v0,[a("button",{class:"btn-accent inline-flex items-center gap-2",onClick:wt},[A(J,{name:"upload",size:15}),b[13]||(b[13]=z(" Add document ",-1))])])]),a("div",_0,[(p(!0),m(le,null,Ie([{label:"Documents on file",value:kt.value.total,tone:"neutral"},{label:"Expiring soon",value:kt.value.expiring,tone:kt.value.expiring?"warning":"neutral"},{label:"Expired",value:kt.value.expired,tone:kt.value.expired?"danger":"success"},{label:"Pending review",value:kt.value.pending,tone:kt.value.pending?"accent":"neutral"}],S=>(p(),m("div",{key:S.label,class:"panel p-5"},[a("div",b0,w(S.label),1),a("div",{class:Ce(["mt-2 text-[30px] font-bold leading-none tracking-tightest",S.tone==="danger"?"text-danger-fg":S.tone==="warning"?"text-amber-fg":S.tone==="success"?"text-success-fg":S.tone==="accent"?"text-accent-soft-fg":"text-ink"])},w(S.value),3)]))),128))]),T.value?(p(),m("div",y0,w(T.value),1)):I("",!0),N.value?(p(),m("div",x0,[a("div",w0,[a("div",null,[a("div",k0,w($.value?"Edit document":Ye.value?"New version":"New document"),1),a("div",S0,w(Ye.value?`Supersedes “${we.value}”`:"Compliance & operational document"),1)]),a("button",{class:"btn-icon",onClick:De},[A(J,{name:"x",size:16})])]),a("div",T0,[a("label",P0,[b[14]||(b[14]=a("span",{class:"eyebrow mb-1 block"},"Title",-1)),ie(a("input",{"onUpdate:modelValue":b[0]||(b[0]=S=>ge.title=S),class:"field",placeholder:"A2 Remote Pilot Certificate — J. Dariusz"},null,512),[[me,ge.title]])]),a("label",C0,[b[15]||(b[15]=a("span",{class:"eyebrow mb-1 block"},"Type",-1)),ie(a("select",{"onUpdate:modelValue":b[1]||(b[1]=S=>ge.docType=S),class:"field"},[(p(),m(le,null,Ie(s,S=>a("option",{key:S.value,value:S.value},w(S.label),9,L0)),64))],512),[[Ot,ge.docType]])]),a("label",A0,[b[16]||(b[16]=a("span",{class:"eyebrow mb-1 block"},"Owner type",-1)),ie(a("select",{"onUpdate:modelValue":b[2]||(b[2]=S=>ge.ownerType=S),class:"field"},[(p(),m(le,null,Ie(u,S=>a("option",{key:S.value,value:S.value},w(S.label),9,M0)),64))],512),[[Ot,ge.ownerType]])]),a("label",E0,[b[18]||(b[18]=a("span",{class:"eyebrow mb-1 block"},"Aircraft (if any)",-1)),ie(a("select",{"onUpdate:modelValue":b[3]||(b[3]=S=>ge.ownerDrone=S),class:"field"},[b[17]||(b[17]=a("option",{value:""},"— none —",-1)),(p(!0),m(le,null,Ie(y.value,S=>(p(),m("option",{key:S.id,value:S.id},w(S.name)+w(S.model?` · ${S.model}`:""),9,O0))),128))],512),[[Ot,ge.ownerDrone]])]),a("label",z0,[b[19]||(b[19]=a("span",{class:"eyebrow mb-1 block"},"Owner reference",-1)),ie(a("input",{"onUpdate:modelValue":b[4]||(b[4]=S=>ge.ownerRef=S),class:"field",placeholder:"Client name / serial / site"},null,512),[[me,ge.ownerRef]])]),a("label",$0,[b[20]||(b[20]=a("span",{class:"eyebrow mb-1 block"},"Reference / number",-1)),ie(a("input",{"onUpdate:modelValue":b[5]||(b[5]=S=>ge.reference=S),class:"field",placeholder:"Cert / registration / policy no."},null,512),[[me,ge.reference]])]),a("label",I0,[b[21]||(b[21]=a("span",{class:"eyebrow mb-1 block"},"Jurisdiction",-1)),ie(a("input",{"onUpdate:modelValue":b[6]||(b[6]=S=>ge.jurisdiction=S),class:"field",placeholder:"DK / EASA / FAA"},null,512),[[me,ge.jurisdiction]])]),a("label",N0,[b[22]||(b[22]=a("span",{class:"eyebrow mb-1 block"},"Access tier",-1)),ie(a("select",{"onUpdate:modelValue":b[7]||(b[7]=S=>ge.accessTier=S),class:"field"},[(p(),m(le,null,Ie(h,S=>a("option",{key:S.value,value:S.value},w(S.label),9,D0)),64))],512),[[Ot,ge.accessTier]])]),a("label",F0,[b[23]||(b[23]=a("span",{class:"eyebrow mb-1 block"},"Issue date",-1)),ie(a("input",{"onUpdate:modelValue":b[8]||(b[8]=S=>ge.issueDate=S),type:"date",class:"field"},null,512),[[me,ge.issueDate]])]),a("label",R0,[b[24]||(b[24]=a("span",{class:"eyebrow mb-1 block"},"Expiry date",-1)),ie(a("input",{"onUpdate:modelValue":b[9]||(b[9]=S=>ge.expiryDate=S),type:"date",class:"field"},null,512),[[me,ge.expiryDate]])]),a("label",B0,[b[25]||(b[25]=a("span",{class:"eyebrow mb-1 block"},"Status",-1)),ie(a("select",{"onUpdate:modelValue":b[10]||(b[10]=S=>ge.status=S),class:"field"},[(p(),m(le,null,Ie(f,S=>a("option",{key:S.value,value:S.value},w(S.label),9,U0)),64))],512),[[Ot,ge.status]])])]),a("label",V0,[b[26]||(b[26]=a("span",{class:"eyebrow mb-1 block"},"Notes",-1)),ie(a("textarea",{"onUpdate:modelValue":b[11]||(b[11]=S=>ge.notes=S),rows:"2",class:"field",placeholder:"Conditions, renewal contacts, anything worth recording"},null,512),[[me,ge.notes]])]),$.value?(p(),m("div",j0,[...b[28]||(b[28]=[z(" Editing updates metadata only. To replace the file, close this and use ",-1),a("b",{class:"text-ink-secondary"},"New version",-1),z(" on the document — the old version is kept for audit. ",-1)])])):(p(),m("div",Z0,[a("span",H0,"File "+w(Ye.value?"(new version)":"(optional)"),1),a("input",{ref_key:"fileInput",ref:ft,type:"file",class:"field",onChange:zt},null,544),b[27]||(b[27]=a("p",{class:"mt-1 text-xs text-ink-muted"}," Stored in PocketBase for now (object storage later). Max 50 MB. ",-1))])),a("div",W0,[a("button",{class:"btn-accent",disabled:Ue.value,onClick:At},w(Ue.value?"Saving…":$.value?"Save changes":Ye.value?"Upload new version":"Add document"),9,K0),a("button",{class:"btn-ghost",onClick:De},"Cancel"),pe.value?(p(),m("span",G0,w(pe.value),1)):I("",!0)])])):I("",!0),a("div",q0,[C.value?(p(),m("div",Y0,"Loading…")):K.value.length?(p(),m("div",ew,[a("table",tw,[a("thead",null,[a("tr",nw,[(p(),m(le,null,Ie(["Title","Type","Owner","Expiry","Ver",""],S=>a("th",{key:S,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w(S),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(K.value,S=>{var W,V;return p(),m(le,{key:S.id},[a("tr",{class:Ce(["border-b border-line last:border-0",$.value===S.id?"bg-accent-soft":""])},[a("td",iw,[a("div",ow,w(S.title),1),S.reference?(p(),m("div",sw,w(S.reference),1)):I("",!0)]),a("td",aw,w(Ee(l)[S.docType]||S.docType||"—"),1),a("td",rw,w(fe(S)),1),a("td",lw,[a("button",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",i[F(S).tone]]),onClick:G=>X(S.id)},[F(S).icon?(p(),nt(J,{key:0,name:F(S).icon,size:12},null,8,["name"])):I("",!0),z(" "+w(F(S).label),1)],10,uw),S.expiryDate?(p(),m("div",cw,w(S.expiryDate),1)):I("",!0)]),a("td",dw,"v"+w(S.version||1),1),a("td",fw,[Ut.value===S.id?(p(),m(le,{key:0},[b[29]||(b[29]=a("span",{class:"mr-2 text-xs text-ink-muted"},"Delete?",-1)),a("button",{class:"btn-ghost mr-1",onClick:b[12]||(b[12]=G=>Ut.value="")},"Cancel"),a("button",{class:"rounded bg-danger px-3 py-1.5 text-sm font-semibold text-white transition hover:brightness-110",onClick:G=>Pt(S)},"Delete",8,hw)],64)):(p(),m(le,{key:1},[S.hasFile?(p(),m("button",{key:0,class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Preview",onClick:G=>he(S)},[A(J,{name:"eye",size:13})],8,pw)):I("",!0),S.hasFile?(p(),m("a",{key:1,href:Ee(zr)(S.id),class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Download file"},[A(J,{name:"download",size:13})],8,mw)):I("",!0),a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",title:"Upload new version",onClick:G=>Le(S)},[A(J,{name:"upload",size:13})],8,gw),a("button",{class:"btn-ghost mr-1 inline-flex items-center gap-1",onClick:G=>st(S)},[A(J,{name:"sliders",size:13}),b[30]||(b[30]=z(" Edit",-1))],8,vw),a("button",{class:"btn-ghost inline-flex items-center gap-1",onClick:G=>Ut.value=S.id},[A(J,{name:"trash",size:13})],8,_w)],64))])],2),te.value===S.id?(p(),m("tr",bw,[a("td",yw,[a("div",xw,[a("span",ww,[b[31]||(b[31]=z("Status: ",-1)),a("b",kw,w(S.status||"—"),1)]),a("span",Sw,[b[32]||(b[32]=z("Access: ",-1)),a("b",Tw,w(S.accessTier||"—"),1)]),S.jurisdiction?(p(),m("span",Pw,[b[33]||(b[33]=z("Jurisdiction: ",-1)),a("b",Cw,w(S.jurisdiction),1)])):I("",!0),S.issueDate?(p(),m("span",Lw,[b[34]||(b[34]=z("Issued: ",-1)),a("b",Aw,w(S.issueDate),1)])):I("",!0),S.expiryDate?(p(),m("span",Mw,[b[35]||(b[35]=z("Expires: ",-1)),a("b",Ew,w(S.expiryDate),1)])):I("",!0),a("span",Ow,[b[36]||(b[36]=z("File: ",-1)),a("b",zw,w(S.hasFile?S.fileName:"none"),1)])]),(((W=S.expiry)==null?void 0:W.flags)||[]).length?(p(),m("ul",$w,[(p(!0),m(le,null,Ie(S.expiry.flags,(G,re)=>(p(),m("li",{key:re,class:Ce(["flex items-start gap-2 text-xs",S.expiry.state==="expired"?"text-danger-fg":S.expiry.state==="expiring_soon"?"text-amber-fg":"text-ink-secondary"])},[A(J,{name:"alertTriangle",size:13,class:"mt-px shrink-0"}),z(" "+w(G),1)],2))),128))])):((V=S.expiry)==null?void 0:V.state)==="valid"?(p(),m("div",Iw,"In force — no action needed.")):I("",!0),S.notes?(p(),m("div",Nw,[b[37]||(b[37]=a("span",{class:"text-ink-muted"},"Notes:",-1)),z(" "+w(S.notes),1)])):I("",!0)])])):I("",!0)],64)}),128))])])])):(p(),m("div",J0,[A(J,{name:"fileText",size:26,class:"text-ink-muted"}),a("div",X0,w(H.value==="all"?"No documents on file yet":"Nothing in this view"),1),a("div",Q0,w(H.value==="all"?"Add certificates, registrations, insurance and authorisations to track their expiry.":"Try a different filter."),1)]))]),(p(),nt(cf,{to:"body"},[Oe.value?(p(),m("div",{key:0,class:"fixed inset-0 z-50 grid place-items-center p-4",style:{background:"color-mix(in srgb, black 60%, transparent)"},onClick:hl(Q,["self"])},[a("div",Dw,[a("div",Fw,[a("div",Rw,[a("div",Bw,w(Oe.value.title),1),a("div",Uw,w(Oe.value.fileName),1)]),a("div",Vw,[a("a",{href:Ze.value,target:"_blank",rel:"noopener",class:"btn-ghost inline-flex items-center gap-1.5",title:"Open in new tab"},[A(J,{name:"globe",size:14}),b[38]||(b[38]=z(" New tab ",-1))],8,Zw),a("a",{href:Ee(zr)(Oe.value.id),class:"btn-ghost inline-flex items-center gap-1.5",title:"Download"},[A(J,{name:"download",size:14}),b[39]||(b[39]=z(" Download ",-1))],8,Hw),a("button",{class:"btn-icon",title:"Close",onClick:Q},[A(J,{name:"x",size:16})])])]),a("div",jw,[Te.value==="image"?(p(),m("img",{key:0,src:Ze.value,alt:Oe.value.title,class:"mx-auto block max-w-full"},null,8,Ww)):Te.value==="frame"?(p(),m("iframe",{key:1,src:Ze.value,class:"h-[74vh] w-full border-0 bg-white",title:Oe.value.title},null,8,Kw)):(p(),m("div",Gw,[A(J,{name:"fileText",size:28,class:"text-ink-muted"}),b[41]||(b[41]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"Preview isn't available for this file type",-1)),a("div",qw,w(Oe.value.fileName),1),a("a",{href:Ee(zr)(Oe.value.id),class:"btn-accent mt-4 inline-flex items-center gap-2"},[A(J,{name:"download",size:15}),b[40]||(b[40]=z(" Download instead ",-1))],8,Yw)]))])])])):I("",!0)]))]))}},Xw={class:"grid h-full grid-cols-[248px_1fr] max-[900px]:grid-cols-1"},Qw={class:"flex flex-col border-r border-line bg-surface-1 px-4 py-5 max-[900px]:hidden"},e2={class:"flex items-center gap-2.5 px-2 pb-5"},t2={class:"flex flex-col gap-0.5"},n2=["onClick"],i2={class:"mt-auto flex flex-col gap-2.5"},o2={class:"rounded-lg bg-surface-2 p-3"},s2={class:"flex items-center gap-2"},a2={class:"text-xs font-semibold text-ink"},r2={class:"mt-1.5 block font-mono text-[10.5px] text-ink-muted"},l2={class:"flex items-center gap-2.5 px-2 py-1"},u2={class:"grid h-8 w-8 place-items-center rounded-full bg-[var(--navy-800)] text-xs font-bold text-white"},c2={class:"min-w-0 flex-1"},d2={class:"truncate text-[13px] font-semibold text-ink"},f2={class:"flex items-center gap-1.5 text-[11px] text-ink-muted"},h2=["title"],p2={class:"overflow-y-auto"},m2={class:"sticky top-0 z-10 flex items-center gap-4 border-b border-line px-7 py-3.5",style:{background:"color-mix(in srgb, var(--bg-app) 82%, transparent)","backdrop-filter":"blur(10px)"}},g2={class:"mt-0.5 text-[22px] font-bold tracking-tightest text-ink"},v2={class:"ml-auto flex items-center gap-3"},_2={class:"flex h-10 w-60 items-center gap-2 rounded border border-line-strong bg-surface-1 px-3 max-[1100px]:hidden"},b2={key:0,class:"mx-auto flex max-w-[1240px] flex-col gap-5 p-7"},y2={class:"grid grid-cols-4 gap-4 max-[1100px]:grid-cols-2 max-[560px]:grid-cols-1"},x2={class:"flex items-center justify-between"},w2={class:"eyebrow"},k2={class:"mt-2.5 text-[34px] font-bold leading-none tracking-tightest text-ink"},S2={class:"grid grid-cols-[1.6fr_1fr] gap-5 max-[1100px]:grid-cols-1"},T2={class:"panel p-5"},P2={class:"mb-3.5 flex items-center justify-between"},C2={class:"flex items-center gap-2"},L2={class:"relative z-[1200]"},A2={class:"panel absolute right-0 z-[1200] mt-1.5 w-72 p-3.5 shadow-lg"},M2={class:"flex items-center justify-between gap-3"},E2={class:"mb-1.5 flex items-center justify-between"},O2={class:"font-mono text-[11px] text-ink-muted"},z2=["value"],$2={key:0,class:"mt-1.5 text-[11px] text-ink-muted"},I2={key:0,class:"mt-2.5 text-xs text-ink-muted"},N2={key:1,class:"mt-2.5 text-xs text-ink-muted"},D2={key:2,class:"mt-2.5 text-xs text-ink-muted"},F2={class:"flex flex-col gap-5"},R2={class:"panel p-5"},B2={class:"mb-3.5 flex items-center justify-between"},U2={class:"flex items-center gap-3"},V2={class:"text-5xl leading-none"},Z2={class:"min-w-0"},H2={class:"flex items-baseline gap-1"},j2={class:"text-[34px] font-bold leading-none tracking-tightest text-ink"},W2={class:"text-lg font-semibold text-ink-secondary"},K2={class:"mt-1 truncate text-sm capitalize text-ink-secondary"},G2={class:"mt-1.5 truncate text-xs text-ink-muted"},q2={class:"mt-4 grid grid-cols-2 gap-2.5"},Y2={class:"rounded-lg bg-surface-2 px-3 py-2"},J2={class:"mt-0.5 font-mono text-sm text-ink"},X2={class:"rounded-lg bg-surface-2 px-3 py-2"},Q2={class:"mt-0.5 font-mono text-sm text-ink"},ek={class:"rounded-lg bg-surface-2 px-3 py-2"},tk={class:"mt-0.5 font-mono text-sm text-ink"},nk={key:0},ik={class:"rounded-lg bg-surface-2 px-3 py-2"},ok={class:"mt-0.5 font-mono text-sm text-ink"},sk={key:0},ak={key:0,class:"mt-3 text-[11px] text-ink-muted"},rk={key:1,class:"grid place-items-center py-8 text-center"},lk={class:"mt-0.5 text-xs text-ink-muted"},uk={key:2,class:"grid place-items-center py-8 text-center text-sm text-ink-muted"},ck={class:"panel p-5"},dk={class:"mb-3.5 flex items-center justify-between"},fk={class:"grid place-items-center py-10 text-center"},hk={class:"panel overflow-hidden p-0"},pk={class:"flex items-center justify-between px-5 py-4"},mk={class:"flex gap-2"},gk={key:0,class:"px-5 py-12 text-center text-sm text-ink-muted"},vk={key:1,class:"overflow-x-auto"},_k={class:"w-full border-collapse text-sm"},bk={class:"text-left"},yk=["onClick"],xk={class:"px-5 py-3 font-mono font-bold text-ink"},wk={class:"px-5 py-3 text-ink-secondary"},kk={class:"px-5 py-3"},Sk={class:"px-5 py-3 font-mono text-ink-secondary"},Tk={class:"px-5 py-3"},Pk={key:0,class:"flex items-center gap-2"},Ck={class:"h-1.5 w-12 overflow-hidden rounded bg-surface-2"},Lk={class:"font-mono text-xs text-ink-secondary"},Ak={key:1,class:"font-mono text-xs text-ink-muted"},Mk={class:"px-5 py-3 font-mono text-ink-secondary"},Ek={class:"px-5 py-3 text-right"},Ok=["onClick"],zk={key:1,class:"p-7"},$k={class:"mb-4 flex flex-wrap items-center gap-3"},Ik={class:"font-mono text-mode font-bold text-ink"},Nk={key:0,class:"rounded-full bg-danger-soft px-2.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-caps text-danger-fg"},Dk={key:1,class:"ml-auto flex flex-wrap gap-1.5"},Fk=["onClick"],Rk={key:0,class:"panel grid place-items-center p-16 text-center"},Bk={class:"pill"},Uk={class:"pill"},Vk={class:"pill"},Zk={class:"mt-1 text-sm font-semibold text-ink"},Hk={class:"pill"},jk={class:"mt-1 font-mono text-sm font-bold tabular text-ink"},Wk={class:"grid grid-cols-2 gap-4 max-[820px]:grid-cols-1"},Kk={class:"panel p-4"},Gk={class:"flex items-center gap-4"},qk={class:"h-9 flex-1 overflow-hidden rounded border border-line bg-surface-2"},Yk={class:"readout"},Jk={class:"panel p-4"},Xk={class:"readout"},Qk={class:"panel p-4"},eS={class:"space-y-1.5 text-sm"},tS={class:"flex justify-between"},nS={class:"text-ink"},iS={class:"flex justify-between"},oS={class:"text-ink"},sS={class:"flex justify-between"},aS={class:"font-mono tabular text-ink"},rS={class:"flex justify-between"},lS={class:"font-mono tabular text-ink"},uS={class:"panel p-4"},cS={class:"space-y-1.5 text-sm"},dS={class:"flex justify-between"},fS={class:"font-mono tabular text-ink"},hS={class:"flex justify-between"},pS={class:"font-mono tabular text-ink"},mS={class:"flex justify-between"},gS={class:"font-mono tabular text-ink"},vS={class:"panel col-span-2 p-4 max-[820px]:col-span-1"},_S={class:"panel p-4"},bS={class:"flex flex-wrap gap-2"},yS={class:"mt-2 min-h-[16px] text-xs text-ink-muted"},xS={class:"panel p-4"},wS={class:"h-[180px] overflow-y-auto font-mono text-xs"},kS={class:"text-ink-muted"},SS={class:"font-semibold text-accent"},TS={class:"break-all text-ink"},PS={key:6,class:"p-7"},CS={class:"panel grid place-items-center p-16 text-center"},LS={class:"mt-3 text-sm font-medium text-ink-secondary"},AS={key:0,class:"mt-1 text-xs text-ink-muted"},MS={key:1,class:"mt-1 text-xs text-ink-muted"},ES="34,-25,72,45",OS=600*1e3,zS={__name:"Dashboard",props:{email:{type:String,default:""},role:{type:String,default:"user"},organization:{type:String,default:""},organizationName:{type:String,default:""}},emits:["logout"],setup(t,{emit:i}){const s=t,l=i,u=gt({}),f=gt({}),h=Y(null),_=Y(!1),y=gt([]),C=Y(""),T=Y([]),M=gt({unavailable:!1,detail:"",loaded:!1,plan:"",recommendedInterval:30}),H=ce(()=>T.value.filter(U=>!U.onGround).length),j=Y(!1);let K=null;const F=[{value:"auto",label:"Auto"},{value:5,label:"5s"},{value:10,label:"10s"},{value:15,label:"15s"},{value:30,label:"30s"},{value:60,label:"60s"},{value:120,label:"120s"}],te=ce(()=>{if(be.airTrafficInterval==="auto")return M.recommendedInterval||30;const U=Number(be.airTrafficInterval);return Number.isFinite(U)&&U>0?U:30}),X=Y(null);let fe=!1;function Se(){if(!(fe||X.value!==null)){if(typeof navigator>"u"||!navigator.geolocation){X.value=!1;return}fe=!0,navigator.geolocation.getCurrentPosition(U=>{X.value={lat:U.coords.latitude,lng:U.coords.longitude},fe=!1},()=>{X.value=!1,fe=!1},{timeout:8e3,maximumAge:6e5})}}function de(U,E,Me){const tt=U&&U.telemetry||{},It=tt[E],St=tt[Me];return typeof It=="number"&&typeof St=="number"&&(It||St)?{lat:It,lng:St}:null}function Fe(){const U=de(W.value,"latitude","longitude")||S.value.map(tt=>de(u[tt],"latitude","longitude")).find(Boolean);if(U){const tt=$r(U.lat,U.lng);if(tt)return tt.bbox}const E=de(W.value,"phoneLatitude","phoneLongitude")||S.value.map(tt=>de(u[tt],"phoneLatitude","phoneLongitude")).find(Boolean);if(E){const tt=$r(E.lat,E.lng);if(tt)return tt.bbox}if(Se(),X.value){const tt=$r(X.value.lat,X.value.lng);if(tt)return tt.bbox}const Me=xm(be.region);return Me||ES}async function Oe(){if(!be.showAirTraffic)return;const U=be.autoBbox?Fe():void 0,{states:E,unavailable:Me,detail:tt,plan:It,recommendedInterval:St}=await mp(U);T.value=E,M.unavailable=Me,M.detail=tt,M.plan=It||"",St&&(M.recommendedInterval=St),M.loaded=!0}function Te(){K&&clearInterval(K),K=setInterval(()=>{Le.value==="Overview"&&be.showAirTraffic&&Oe()},te.value*1e3)}function Ze(){Oe(),Te()}function he(){K&&clearInterval(K),K=null}const Q=gt({loaded:!1,unavailable:!1,detail:"",data:null,units:"metric",source:"",updatedAt:0});let B=null;function O(){const U=de(W.value,"latitude","longitude")||S.value.map(Me=>de(u[Me],"latitude","longitude")).find(Boolean);if(U)return{lat:U.lat,lng:U.lng,source:"drone"};const E=de(W.value,"phoneLatitude","phoneLongitude")||S.value.map(Me=>de(u[Me],"phoneLatitude","phoneLongitude")).find(Boolean);return E?{lat:E.lat,lng:E.lng,source:"phone"}:X.value?{lat:X.value.lat,lng:X.value.lng,source:"browser"}:null}async function N(){const U=O(),E=await Sp(U?U.lat:void 0,U?U.lng:void 0);if(Q.loaded=!0,Q.units=E.units||"metric",E.unavailable||!E.weather){Q.unavailable=!0,Q.detail=E.detail||"Weather is unavailable.",Q.data=null;return}Q.unavailable=!1,Q.detail="",Q.data=E.weather,Q.source=U?U.source:"default",Q.updatedAt=Date.now()}function $(){B&&clearInterval(B),B=setInterval(()=>{Le.value==="Overview"&&N()},OS)}function Ye(){N(),$()}function we(){B&&clearInterval(B),B=null}const ge=ce(()=>Q.units==="imperial"?"°F":Q.units==="standard"?"K":"°C"),ue=ce(()=>Q.units==="imperial"?"mph":"m/s");function ft(U){const E=(U||"").slice(0,2);return E==="01"?(U||"").endsWith("n")?"🌙":"☀️":{"02":"🌤️","03":"⛅","04":"☁️","09":"🌧️",10:"🌦️",11:"⛈️",13:"❄️",50:"🌫️"}[E]||"🌡️"}const pe=ce(()=>ft(Q.data&&Q.data.icon)),Ue=ce(()=>{const U=Q.data;return U?U.country?`${U.location}, ${U.country}`:U.location||"Unknown location":""}),Ve=ce(()=>Q.source==="drone"?"at aircraft location":Q.source==="phone"||Q.source==="browser"?"at your location":"default location"),wt=ce(()=>Q.updatedAt?new Date(Q.updatedAt).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"");function st(U,E=0){return typeof U=="number"?U.toFixed(E):"—"}const Le=Y("Overview"),De=[["grid","Overview"],["radio","Live flights"],["route","Routes"],["calendar","Schedule"],["drone","Drones"],["book","Logbook"],["fileText","Documents"],["server","Drives"],["settings","Settings"]],zt=ce(()=>(De.find(([,U])=>U===Le.value)||["grid"])[0]),At=Y(""),Ut=Y(""),Pt=Y("");let kt=null,x=null,b=!1;const S=ce(()=>Object.keys(u).sort((U,E)=>(u[E].online?1:0)-(u[U].online?1:0)||U.localeCompare(E))),W=ce(()=>h.value?u[h.value]:null),V=ce(()=>W.value&&W.value.telemetry||{}),G=ce(()=>!!(W.value&&W.value.online)),re=ce(()=>{const U=V.value;return typeof U.latitude=="number"&&typeof U.longitude=="number"&&(U.latitude||U.longitude)?{lat:U.latitude,lng:U.longitude}:null}),ae=ce(()=>h.value&&f[h.value]||[]),oe=ce(()=>{const U=V.value;return typeof U.velocityX=="number"&&typeof U.velocityY=="number"?Math.hypot(U.velocityX,U.velocityY):null});function ee(U){return U.online?U.connected?["In flight","success"]:["Standby","accent"]:["Offline","neutral"]}function ve(U){const E=U&&U.telemetry||{};return typeof E.velocityX=="number"&&typeof E.velocityY=="number"?Math.hypot(E.velocityX,E.velocityY):null}const se=ce(()=>S.value.map(U=>{const E=u[U],Me=E.telemetry||{},[tt,It]=ee(E);return{id:U,mission:E.model||(E.connected?"Drone linked":E.online?"App online":"No signal"),status:tt,tone:It,alt:typeof Me.altitude=="number"?Me.altitude.toFixed(0)+" m":"—",battery:typeof Me.batteryPercent=="number"?Me.batteryPercent:null,speed:ve(E)}})),ke=ce(()=>S.value.map(U=>u[U].connected?u[U].flightControllerSerial:"").filter(Boolean)),Pe=ce(()=>S.value.filter(U=>u[U].online).length),Re=ce(()=>S.value.filter(U=>u[U].online&&u[U].connected).length),Ke=ce(()=>S.value.filter(U=>!u[U].online).length),Ge=ce(()=>{const U=S.value.map(E=>{var Me;return(Me=u[E].telemetry)==null?void 0:Me.batteryPercent}).filter(E=>typeof E=="number");return U.length?Math.round(U.reduce((E,Me)=>E+Me,0)/U.length):null}),pt=ce(()=>[{label:"Active flights",value:String(Re.value),delta:`${Pe.value} online`,tone:"success",icon:"radio"},{label:"Avg battery",value:Ge.value==null?"—":Ge.value+"%",delta:Ge.value==null?"no telemetry":Ge.value<40?"low — watch":"nominal",tone:Ge.value!=null&&Ge.value<40?"danger":"neutral",icon:"battery"},{label:"Fleet size",value:String(S.value.length),delta:`${Re.value} in flight`,tone:"neutral",icon:"grid"},{label:"Offline",value:String(Ke.value),delta:Ke.value?"needs attention":"all reachable",tone:Ke.value?"warning":"success",icon:"signal"}]),ht={success:"bg-success-soft text-success-fg",warning:"bg-amber-soft text-amber-fg",danger:"bg-danger-soft text-danger-fg",accent:"bg-accent-soft text-accent-soft-fg",neutral:"bg-surface-2 text-ink-secondary"},Vt={success:"text-success-fg",danger:"text-danger-fg",warning:"text-amber-fg",neutral:"text-ink-muted",accent:"text-accent-soft-fg"},Jt=ce(()=>{var Me,tt,It;const E=(s.email||"PV").split("@")[0].split(/[.\-_ ]+/).filter(Boolean);return((((Me=E[0])==null?void 0:Me[0])||"P")+(((tt=E[1])==null?void 0:tt[0])||((It=E[0])==null?void 0:It[1])||"V")).toUpperCase()}),Zt={superadmin:"Superadmin",admin:"Admin",user:"Operator"},pn=ce(()=>Zt[s.role]||"Operator"),Ct=ce(()=>s.organizationName||(s.role==="superadmin"?"All organizations":"No organization")),$t=new Set,kn=Y(null);async function zi(U){var It,St,Et;if(!U.connected||!U.flightControllerSerial)return;const E={flightControllerSerial:U.flightControllerSerial,model:U.model||"",firmware:U.firmware||"",controllerFirmware:U.controllerFirmware||""},Me=[E.flightControllerSerial,E.model,E.firmware,E.controllerFirmware].join("|");if($t.has(Me))return;$t.add(Me);const tt=await Pp(E);if(!tt.ok){(tt.status===0||tt.status>=500)&&$t.delete(Me);return}((It=tt.body)!=null&&It.created||(St=tt.body)!=null&&St.updated)&&((Et=kn.value)==null||Et.reload())}function at(U){if(U)for(const E of $t)E.startsWith(`${U}|`)&&$t.delete(E)}function Sn(U){var Me;u[U.deviceId]=U,zi(U);const E=U.telemetry||{};typeof E.latitude=="number"&&typeof E.longitude=="number"&&(E.latitude||E.longitude)&&(f[U.deviceId]||(f[U.deviceId]=[]),f[U.deviceId].push([E.latitude,E.longitude]),f[U.deviceId].length>1e3&&f[U.deviceId].shift()),(!h.value||U.online&&!((Me=u[h.value])!=null&&Me.online))&&(h.value=U.deviceId)}function $i(U){delete u[U],delete f[U],h.value===U&&(h.value=S.value[0]||null)}function rt(U){y.unshift({t:ku(Date.now()),tag:U.type||"?",text:JSON.stringify(hi(U))}),y.length>200&&y.pop()}function hi(U){const E={...U};return delete E.type,E}function pi(){const U=location.protocol==="https:"?"wss":"ws";kt=new WebSocket(`${U}://${location.host}/bff/ws`),kt.onopen=()=>_.value=!0,kt.onclose=()=>{_.value=!1,b||(x=setTimeout(pi,1500))},kt.onerror=()=>kt&&kt.close(),kt.onmessage=E=>{let Me;try{Me=JSON.parse(E.data)}catch{return}Me.type==="snapshot"?(Me.devices||[]).forEach(Sn):Me.type==="update"&&Me.device?(Sn(Me.device),Me.event&&Me.device.deviceId===h.value&&rt(Me.event)):Me.type==="removed"&&Me.deviceId&&$i(Me.deviceId)}}async function Ii(){if(!h.value)return Pt.value="No device selected.";if(!At.value.trim())return Pt.value="Enter a command name.";let U;if(Ut.value.trim())try{U=JSON.parse(Ut.value)}catch{return Pt.value="Payload is not valid JSON."}const{ok:E,body:Me}=await Rp(h.value,At.value.trim(),U);Pt.value=E?`Sent "${At.value.trim()}".`:`Error: ${Me.error||"failed"}`}function Gt(U,E,Me=""){return typeof U=="number"?U.toFixed(E)+Me:"—"}function jn(U){h.value=U,Le.value="Live flights"}return Bt(Le,U=>{U==="Overview"&&(Oe(),N())}),Bt(()=>be.showAirTraffic,U=>{U?Oe():T.value=[]}),Bt(te,Te),fi(async()=>{(await np()).forEach(Sn),pi(),Ze(),Ye()}),us(()=>{b=!0,x&&clearTimeout(x),kt&&kt.close(),he(),we()}),(U,E)=>{var Me,tt,It,St,Et;return p(),m("div",Xw,[a("aside",Qw,[a("div",e2,[A(nd,{size:26}),E[11]||(E[11]=a("span",{class:"text-[19px] tracking-tightest"},[a("span",{class:"font-medium text-ink-secondary"},"Pilot"),a("span",{class:"font-bold text-ink"},"Vault")],-1))]),a("nav",t2,[(p(),m(le,null,Ie(De,([Z,_t])=>a("button",{key:_t,class:Ce(["flex items-center gap-3 rounded px-3 py-2.5 text-left text-sm transition",Le.value===_t?"bg-accent-soft font-semibold text-accent-soft-fg":"font-medium text-ink-secondary hover:bg-surface-2"]),onClick:bt=>Le.value=_t},[A(J,{name:Z,size:18,stroke:Le.value===_t?2.2:1.8},null,8,["name","stroke"]),z(" "+w(_t),1)],10,n2)),64))]),a("div",i2,[a("div",o2,[a("div",s2,[a("span",{class:Ce(["h-2 w-2 rounded-full",_.value?"bg-ready":"bg-caution"])},null,2),a("span",a2,w(_.value?"Link healthy":"Reconnecting…"),1)]),a("span",r2,"API gateway · "+w(_.value?"streaming":"retrying"),1)]),a("div",l2,[a("div",u2,w(Jt.value),1),a("div",c2,[a("div",d2,w(t.email||"Operator"),1),a("div",f2,[A(J,{name:"grid",size:11,class:"shrink-0"}),a("span",{class:"truncate",title:`${pn.value} · ${Ct.value}`},w(pn.value)+" · "+w(Ct.value),9,h2)])]),a("button",{class:"text-ink-muted transition hover:text-ink",title:"Log out","aria-label":"Log out",onClick:E[0]||(E[0]=Z=>l("logout"))},[A(J,{name:"logout",size:16})])])])]),a("main",p2,[a("header",m2,[a("div",null,[E[12]||(E[12]=a("div",{class:"eyebrow"},"Live operations",-1)),a("h1",g2,w(Le.value),1)]),a("div",v2,[a("div",_2,[A(J,{name:"search",size:16,class:"text-ink-muted"}),ie(a("input",{"onUpdate:modelValue":E[1]||(E[1]=Z=>C.value=Z),placeholder:"Search drones, routes…",class:"w-full border-none bg-transparent text-sm text-ink outline-none placeholder:text-ink-muted"},null,512),[[me,C.value]])]),a("button",{class:"btn-accent flex items-center gap-2",onClick:E[2]||(E[2]=Z=>Le.value="Live flights")},[A(J,{name:"radio",size:16}),E[13]||(E[13]=z(" Live flights ",-1))])])]),Le.value==="Overview"?(p(),m("div",b2,[a("div",y2,[(p(!0),m(le,null,Ie(pt.value,Z=>(p(),m("div",{key:Z.label,class:"panel p-5"},[a("div",x2,[a("span",w2,w(Z.label),1),A(J,{name:Z.icon,size:16,class:"text-ink-muted"},null,8,["name"])]),a("div",k2,w(Z.value),1),a("span",{class:Ce(["mt-2 block font-mono text-[11px]",Vt[Z.tone]])},w(Z.delta),3)]))),128))]),a("div",S2,[a("div",T2,[a("div",P2,[E[18]||(E[18]=a("div",null,[a("div",{class:"eyebrow"},"Airspace"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Live map")],-1)),a("div",C2,[Ee(be).showAirTraffic&&H.value?(p(),m("span",{key:0,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.accent]),title:"Live aircraft from OpenSky Network"},[A(J,{name:"radio",size:12}),z(w(H.value)+" aircraft ",1)],2)):I("",!0),Re.value?(p(),m("span",{key:1,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.success])},[E[14]||(E[14]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Re.value)+" drones ",1)],2)):I("",!0),a("div",L2,[a("button",{type:"button",class:Ce(["grid h-7 w-7 place-items-center rounded-md text-ink-muted transition hover:bg-surface-2 hover:text-ink",j.value?"bg-surface-2 text-ink":""]),title:"Map settings","aria-label":"Map settings",onClick:E[3]||(E[3]=Z=>j.value=!j.value)},[A(J,{name:"settings",size:16})],2),j.value?(p(),m(le,{key:0},[a("div",{class:"fixed inset-0 z-[1190]",onClick:E[4]||(E[4]=Z=>j.value=!1)}),a("div",A2,[E[17]||(E[17]=a("div",{class:"eyebrow mb-2.5"},"Map settings",-1)),a("label",M2,[E[15]||(E[15]=a("span",{class:"text-sm text-ink-secondary"},"Show live air traffic",-1)),A(nn,{modelValue:Ee(be).showAirTraffic,"onUpdate:modelValue":E[5]||(E[5]=Z=>Ee(be).showAirTraffic=Z)},null,8,["modelValue"])]),a("div",{class:Ce(["mt-3.5",Ee(be).showAirTraffic?"":"pointer-events-none opacity-40"])},[a("div",E2,[E[16]||(E[16]=a("span",{class:"text-sm text-ink-secondary"},"Refresh interval",-1)),a("span",O2,"every "+w(te.value)+"s",1)]),ie(a("select",{"onUpdate:modelValue":E[6]||(E[6]=Z=>Ee(be).airTrafficInterval=Z),class:"field"},[(p(),m(le,null,Ie(F,Z=>a("option",{key:Z.value,value:Z.value},w(Z.label)+w(Z.value==="auto"?` (plan: ${M.recommendedInterval}s)`:""),9,z2)),64))],512),[[Ot,Ee(be).airTrafficInterval]]),M.plan?(p(),m("p",$2," OpenSky plan: "+w(M.plan),1)):I("",!0)],2)])],64)):I("",!0)])])]),A(Cu,{position:re.value,trail:ae.value,aircraft:Ee(be).showAirTraffic?T.value:[]},null,8,["position","trail","aircraft"]),Ee(be).showAirTraffic?M.loaded&&M.unavailable?(p(),m("p",N2,w(M.detail||"Live air traffic is unavailable."),1)):(p(),m("p",D2," Live air traffic from OpenSky Network · updates every "+w(te.value)+"s ",1)):(p(),m("p",I2," Live air traffic hidden · enable it in Map settings "))]),a("div",F2,[a("div",R2,[a("div",B2,[E[19]||(E[19]=a("div",null,[a("div",{class:"eyebrow"},"Conditions"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Weather")],-1)),A(J,{name:"sun",size:16,class:"text-ink-muted"})]),Q.data?(p(),m(le,{key:0},[a("div",U2,[a("div",V2,w(pe.value),1),a("div",Z2,[a("div",H2,[a("span",j2,w(st(Q.data.temp)),1),a("span",W2,w(ge.value),1)]),a("div",K2,w(Q.data.description||"—"),1)])]),a("div",G2,w(Ue.value)+" · "+w(Ve.value),1),a("div",q2,[a("div",Y2,[E[20]||(E[20]=a("div",{class:"eyebrow"},"Feels like",-1)),a("div",J2,w(st(Q.data.feelsLike))+w(ge.value),1)]),a("div",X2,[E[21]||(E[21]=a("div",{class:"eyebrow"},"Wind",-1)),a("div",Q2,w(st(Q.data.windSpeed,1))+" "+w(ue.value),1)]),a("div",ek,[E[22]||(E[22]=a("div",{class:"eyebrow"},"Humidity",-1)),a("div",tk,[z(w(st(Q.data.humidity)),1),Q.data.humidity!=null?(p(),m("span",nk,"%")):I("",!0)])]),a("div",ik,[E[23]||(E[23]=a("div",{class:"eyebrow"},"Cloud cover",-1)),a("div",ok,[z(w(st(Q.data.clouds)),1),Q.data.clouds!=null?(p(),m("span",sk,"%")):I("",!0)])])]),wt.value?(p(),m("div",ak,"Updated "+w(wt.value)+" · OpenWeather",1)):I("",!0)],64)):Q.loaded&&Q.unavailable?(p(),m("div",rk,[A(J,{name:"sun",size:24,class:"text-ink-muted"}),E[24]||(E[24]=a("div",{class:"mt-2 text-sm font-medium text-ink-secondary"},"Weather unavailable",-1)),a("div",lk,w(Q.detail),1)])):(p(),m("div",uk," Loading weather… "))]),a("div",ck,[a("div",dk,[E[25]||(E[25]=a("div",null,[a("div",{class:"eyebrow"},"Today"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Schedule")],-1)),A(J,{name:"clock",size:16,class:"text-ink-muted"})]),a("div",fk,[A(J,{name:"calendar",size:24,class:"text-ink-muted"}),E[26]||(E[26]=a("div",{class:"mt-2 text-sm font-medium text-ink-secondary"},"No missions scheduled",-1)),E[27]||(E[27]=a("div",{class:"mt-0.5 text-xs text-ink-muted"},"Scheduling is not wired to a backend yet.",-1))])])])]),a("div",hk,[a("div",pk,[E[30]||(E[30]=a("div",null,[a("div",{class:"eyebrow"},"Fleet"),a("div",{class:"mt-0.5 text-base font-semibold text-ink"},"Aircraft status")],-1)),a("div",mk,[a("span",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.success])},[E[28]||(E[28]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Re.value)+" in flight ",1)],2),Ke.value?(p(),m("span",{key:0,class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht.warning])},[E[29]||(E[29]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Ke.value)+" offline ",1)],2)):I("",!0)])]),se.value.length?(p(),m("div",vk,[a("table",_k,[a("thead",null,[a("tr",bk,[(p(),m(le,null,Ie(["Aircraft","Mission","Status","Alt","Battery","Speed",""],Z=>a("th",{key:Z,class:"border-y border-line bg-surface-2 px-5 py-2.5 font-mono text-[10.5px] font-normal uppercase tracking-caps text-ink-muted"},w(Z),1)),64))])]),a("tbody",null,[(p(!0),m(le,null,Ie(se.value,(Z,_t)=>(p(),m("tr",{key:Z.id,class:Ce(["cursor-pointer transition hover:bg-surface-2",_tjn(Z.id)},[a("td",xk,w(Z.id),1),a("td",wk,w(Z.mission),1),a("td",kk,[a("span",{class:Ce(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold",ht[Z.tone]])},[E[31]||(E[31]=a("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),z(w(Z.status),1)],2)]),a("td",Sk,w(Z.alt),1),a("td",Tk,[Z.battery!=null?(p(),m("div",Pk,[a("div",Ck,[a("div",{class:Ce(["h-full",Z.battery<40?"bg-caution":"bg-ready"]),style:Eo({width:Z.battery+"%"})},null,6)]),a("span",Lk,w(Z.battery)+"%",1)])):(p(),m("span",Ak,"—"))]),a("td",Mk,[z(w(Z.speed==null?"—":Z.speed.toFixed(1))+" ",1),E[32]||(E[32]=a("span",{class:"text-ink-muted"},"m/s",-1))]),a("td",Ek,[a("button",{class:"btn-ghost inline-flex items-center gap-1.5 whitespace-nowrap",onClick:hl(bt=>jn(Z.id),["stop"])},[A(J,{name:"play",size:14}),E[33]||(E[33]=z(" Track ",-1))],8,Ok)])],10,yk))),128))])])])):(p(),m("div",gk," No aircraft connected yet. Devices appear here as they come online. "))])])):Le.value==="Live flights"?(p(),m("div",zk,[a("div",$k,[a("span",Ik,w(h.value||"No device selected"),1),W.value&&!G.value?(p(),m("span",Nk,"Offline")):I("",!0),S.value.length?(p(),m("div",Dk,[(p(!0),m(le,null,Ie(S.value,Z=>(p(),m("button",{key:Z,class:Ce(["flex items-center gap-2 rounded border px-3 py-1.5 font-mono text-xs font-bold transition",Z===h.value?"border-accent bg-accent-soft text-accent-soft-fg":"border-line bg-surface-1 text-ink-secondary hover:border-line-strong"]),onClick:_t=>h.value=Z},[a("span",{class:Ce(["h-2 w-2 rounded-full",u[Z].online?"bg-ready":"bg-ink-muted"])},null,2),z(" "+w(Z),1)],10,Fk))),128))])):I("",!0)]),S.value.length?(p(),m(le,{key:1},[a("div",{class:Ce(["mb-4 grid gap-3",!G.value&&W.value?"opacity-60":""]),style:{"grid-template-columns":"repeat(auto-fit, minmax(150px, 1fr))"}},[a("div",Bk,[E[36]||(E[36]=a("div",{class:"eyebrow"},"Registration",-1)),a("div",{class:Ce(["mt-1 text-sm font-semibold",G.value?((Me=W.value)==null?void 0:Me.registration)==="success"?"text-success-fg":"text-danger-fg":"text-ink"])},w(G.value&&((tt=W.value)!=null&&tt.registration)?W.value.registration:"—"),3)]),a("div",Uk,[E[37]||(E[37]=a("div",{class:"eyebrow"},"Drone link",-1)),a("div",{class:Ce(["mt-1 text-sm font-semibold",G.value?(It=W.value)!=null&&It.connected?"text-success-fg":"text-danger-fg":"text-ink"])},w(W.value?G.value?W.value.connected?"connected":"no drone":"app offline":"—"),3)]),a("div",Vk,[E[38]||(E[38]=a("div",{class:"eyebrow"},"Model",-1)),a("div",Zk,w(((St=W.value)==null?void 0:St.model)||"—"),1)]),a("div",Hk,[E[39]||(E[39]=a("div",{class:"eyebrow"},"Last update",-1)),a("div",jk,w((Et=W.value)!=null&&Et.lastSeenMs?Ee(ku)(W.value.lastSeenMs):"—"),1)])],2),a("div",Wk,[a("div",Kk,[E[41]||(E[41]=a("div",{class:"mb-3 eyebrow"},"Battery",-1)),a("div",Gk,[a("div",qk,[a("div",{class:Ce(["h-full transition-all",typeof V.value.batteryPercent=="number"?V.value.batteryPercent<20?"bg-warning":V.value.batteryPercent<40?"bg-caution":"bg-ready":""]),style:Eo({width:(typeof V.value.batteryPercent=="number"?V.value.batteryPercent:0)+"%"})},null,6)]),a("div",Yk,[z(w(typeof V.value.batteryPercent=="number"?V.value.batteryPercent:"—"),1),E[40]||(E[40]=a("span",{class:"text-sm text-ink-secondary"},"%",-1))])])]),a("div",Jk,[E[43]||(E[43]=a("div",{class:"mb-3 eyebrow"},"Altitude",-1)),a("div",Xk,[z(w(Gt(V.value.altitude,1)),1),E[42]||(E[42]=a("span",{class:"text-sm text-ink-secondary"}," m",-1))])]),a("div",Qk,[E[48]||(E[48]=a("div",{class:"mb-3 eyebrow"},"Flight",-1)),a("div",eS,[a("div",tS,[E[44]||(E[44]=a("span",{class:"text-ink-secondary"},"Mode",-1)),a("b",nS,w(V.value.flightMode||"—"),1)]),a("div",iS,[E[45]||(E[45]=a("span",{class:"text-ink-secondary"},"Flying",-1)),a("b",oS,w(V.value.isFlying==null?"—":V.value.isFlying?"yes":"no"),1)]),a("div",sS,[E[46]||(E[46]=a("span",{class:"text-ink-secondary"},"GPS sats",-1)),a("b",aS,w(V.value.satelliteCount==null?"—":V.value.satelliteCount),1)]),a("div",rS,[E[47]||(E[47]=a("span",{class:"text-ink-secondary"},"Speed (H)",-1)),a("b",lS,w(oe.value==null?"—":Gt(oe.value,2," m/s")),1)])])]),a("div",uS,[E[52]||(E[52]=a("div",{class:"mb-3 eyebrow"},"Position",-1)),a("div",cS,[a("div",dS,[E[49]||(E[49]=a("span",{class:"text-ink-secondary"},"Latitude",-1)),a("b",fS,w(Gt(V.value.latitude,6)),1)]),a("div",hS,[E[50]||(E[50]=a("span",{class:"text-ink-secondary"},"Longitude",-1)),a("b",pS,w(Gt(V.value.longitude,6)),1)]),a("div",mS,[E[51]||(E[51]=a("span",{class:"text-ink-secondary"},"Vert. speed",-1)),a("b",gS,w(Gt(typeof V.value.velocityZ=="number"?-V.value.velocityZ:void 0,2," m/s")),1)])])]),a("div",vS,[E[53]||(E[53]=a("div",{class:"mb-3 eyebrow"},"Track",-1)),A(Cu,{position:re.value,trail:ae.value},null,8,["position","trail"])]),a("div",_S,[E[54]||(E[54]=a("div",{class:"mb-3 eyebrow"},"Send command",-1)),a("div",bS,[ie(a("input",{"onUpdate:modelValue":E[7]||(E[7]=Z=>At.value=Z),class:"field flex-1",placeholder:"command (e.g. startConnection)"},null,512),[[me,At.value]]),ie(a("input",{"onUpdate:modelValue":E[8]||(E[8]=Z=>Ut.value=Z),class:"field flex-1",placeholder:"payload JSON (optional)"},null,512),[[me,Ut.value]]),a("button",{class:"btn-accent",onClick:Ii},"Send")]),a("div",yS,w(Pt.value),1)]),a("div",xS,[E[55]||(E[55]=a("div",{class:"mb-3 eyebrow"},"Event log",-1)),a("div",wS,[(p(!0),m(le,null,Ie(y,(Z,_t)=>(p(),m("div",{key:_t,class:"border-b border-line py-1"},[a("span",kS,w(Z.t),1),a("span",SS,w(Z.tag),1),a("span",TS,w(Z.text),1)]))),128))])])])],64)):(p(),m("div",Rk,[A(J,{name:"radio",size:28,class:"text-ink-muted"}),E[34]||(E[34]=a("div",{class:"mt-3 text-sm font-medium text-ink-secondary"},"No aircraft online",-1)),E[35]||(E[35]=a("div",{class:"mt-1 text-xs text-ink-muted"},"Live telemetry appears here once a drone connects.",-1))]))])):Le.value==="Logbook"?(p(),nt(gx,{key:2,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName},null,8,["email","role","organization","organization-name"])):Le.value==="Drones"?(p(),nt(f0,{key:3,ref_key:"dronesView",ref:kn,"connected-fc-serials":ke.value,onDeleted:at},null,8,["connected-fc-serials"])):Le.value==="Documents"?(p(),nt(Jw,{key:4,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName},null,8,["email","role","organization","organization-name"])):Le.value==="Settings"?(p(),nt(ey,{key:5,email:t.email,role:t.role,organization:t.organization,"organization-name":t.organizationName,onLogout:E[9]||(E[9]=Z=>l("logout"))},null,8,["email","role","organization","organization-name"])):(p(),m("div",PS,[a("div",CS,[A(J,{name:zt.value,size:28,class:"text-ink-muted"},null,8,["name"]),a("div",LS,w(Le.value),1),Le.value==="Drives"?(p(),m("div",AS,[E[56]||(E[56]=z(" Browse and transfer files here once a drive is connected. Configure drives in ",-1)),a("button",{class:"font-semibold text-accent hover:underline",onClick:E[10]||(E[10]=Z=>Le.value="Settings")},"Settings → Integrations"),E[57]||(E[57]=z(". ",-1))])):(p(),m("div",MS,"This section is part of the console shell and has no backend yet."))])]))])])}}},$S={key:0,class:"h-full"},IS={key:1,class:"grid h-full place-items-center text-ink-muted text-sm"},NS={__name:"App",setup(t){const i=Y(!1),s=Y(null),l=Y("user"),u=Y(""),f=Y(""),h=Y("");function _(T){l.value=T&&T.role||"user",u.value=T&&T.organization||"",f.value=T&&T.organizationName||""}fi(async()=>{h.value=(await Qh()).apiBase||"";const T=await _u();T&&(s.value=T.email,_(T),await Tu()),i.value=!0});async function y(T){s.value=T,_(await _u()),await Tu()}async function C(){Hp(),await tp(),s.value=null,l.value="user",u.value="",f.value=""}return(T,M)=>i.value?(p(),m("div",$S,[s.value?(p(),nt(zS,{key:0,email:s.value,role:l.value,organization:u.value,"organization-name":f.value,onLogout:C},null,8,["email","role","organization","organization-name"])):(p(),nt(rm,{key:1,"default-api-base":h.value,onSignedIn:y},null,8,["default-api-base"]))])):(p(),m("div",IS,"Loading…"))}};qh(NS).mount("#app"); diff --git a/Web App/server/dist/index.html b/Web App/server/dist/index.html index d6331cc..3b063a5 100644 --- a/Web App/server/dist/index.html +++ b/Web App/server/dist/index.html @@ -35,8 +35,8 @@ })() PilotVault — Control Panel - - + +
diff --git a/Web App/server/main.go b/Web App/server/main.go index 0afea6e..ae8cb1a 100644 --- a/Web App/server/main.go +++ b/Web App/server/main.go @@ -88,6 +88,9 @@ func main() { mux.HandleFunc("PATCH /bff/flights/{id}", app.requireAuth(app.handleUpdateFlight)) mux.HandleFunc("DELETE /bff/flights/{id}", app.requireAuth(app.handleDeleteFlight)) mux.HandleFunc("GET /bff/logbook/export", app.requireAuth(app.handleExportLogbook)) + // Routes — saved waypoint missions from the Fly App (read-only here) + mux.HandleFunc("GET /bff/routes", app.requireAuth(app.handleListRoutes)) + // Documents — the compliance + operational document store (scoping upstream) mux.HandleFunc("GET /bff/documents", app.requireAuth(app.handleListDocuments)) mux.HandleFunc("POST /bff/documents", app.requireAuth(app.handleCreateDocument)) diff --git a/Web App/web/src/api.js b/Web App/web/src/api.js index e297258..205bf10 100644 --- a/Web App/web/src/api.js +++ b/Web App/web/src/api.js @@ -418,6 +418,21 @@ export function exportLogbookUrl() { return '/bff/logbook/export' } +/* ---------- Routes ---------- */ + +// List the saved waypoint routes in scope (own; an admin's whole org). Each +// carries the Fly App's route JSON in `spec`. +export async function getRoutes() { + try { + const r = await fetch('/bff/routes') + if (!r.ok) return { ok: false, status: r.status, routes: [] } + const d = await r.json() + return { ok: true, status: 200, routes: d.routes || [] } + } catch { + return { ok: false, status: 0, routes: [] } + } +} + /* ---------- Documents ---------- */ // List in-scope documents. Pass `expiring` (days) to narrow to documents that diff --git a/Web App/web/src/components/Dashboard.vue b/Web App/web/src/components/Dashboard.vue index cbbc28d..52d9250 100644 --- a/Web App/web/src/components/Dashboard.vue +++ b/Web App/web/src/components/Dashboard.vue @@ -7,6 +7,7 @@ import Settings from './Settings.vue' import Logbook from './Logbook.vue' import Drones from './Drones.vue' import Documents from './Documents.vue' +import RoutesView from './Routes.vue' import Toggle from './settings/Toggle.vue' import { getDevices, sendCommand, getOpenSkyStates, getOpenWeatherCurrent, autoAddDrone } from '../api.js' import { formatTime, prefs } from '../prefs.js' @@ -1060,13 +1061,16 @@ onBeforeUnmount(() => { + + + - +
diff --git a/Web App/web/src/components/Routes.vue b/Web App/web/src/components/Routes.vue new file mode 100644 index 0000000..253ff77 --- /dev/null +++ b/Web App/web/src/components/Routes.vue @@ -0,0 +1,176 @@ + + +