Split the automatic logging path by the app that logged the flight

logging_path is now manual, automatic_flyapp or automatic_flyagentapp. The
Fly App's entries are backed by the aircraft's flight recorder and keep the
missing-FDR red flag; the Fly Agent App's come from Remote ID, which is not a
flight recorder, so they must carry the § 5 fields like a manual entry. The API
maps the old "automatic" onto automatic_flyapp so Fly App builds already on
devices keep filing. The migration has been applied to the remote PocketBase.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
tajniak81andClaude Opus 5.5 committed 2026-10-22 19:36:16 +02:00
1 parent 3dd31b257a
commit bc41d8b128
12 files changed
+242 -50

No files matched your search

+52 -13
View File
@@ -175,7 +175,7 @@ type compliance struct {
Required bool `json:"required"` // does § 5 require a logbook entry?
Exempt bool `json:"exempt"` // exempt from the logbook obligation
ExemptReason string `json:"exemptReason"` // why, when exempt
LoggingPath string `json:"loggingPath"` // automatic | manual
LoggingPath string `json:"loggingPath"` // manual | automatic_flyapp | automatic_flyagentapp
RedFlags []string `json:"redFlags"` // compliance gaps to surface
}
@@ -205,16 +205,49 @@ func (f flightRecord) view(drones map[string]droneRecord) flightView {
// Compliance logic (BEK 1649 § 5 + the checklist's red flags).
// ---------------------------------------------------------------------------
// Logging paths: who produced the entry.
//
// manual: typed in by the pilot (Web App form).
//
// automatic_flyapp: recorded by the Fly App from the aircraft's own telemetry
// over the DJI SDK; the FDR log backs it.
//
// automatic_flyagentapp: recorded by the Fly Agent App from the aircraft's
// Remote ID broadcast. That is not a flight data recorder, so the entry must
// carry the § 5 minimum like a manual one.
const (
loggingManual = "manual"
loggingFlyApp = "automatic_flyapp"
loggingFlyAgentApp = "automatic_flyagentapp"
loggingLegacyAutomatic = "automatic" // pre-split value, still sent by older Fly App builds
)
// normalizeLoggingPath maps the pre-split "automatic" onto the Fly App path:
// it was the only app that logged automatically before the split.
func normalizeLoggingPath(p string) string {
p = strings.TrimSpace(p)
if p == loggingLegacyAutomatic {
return loggingFlyApp
}
return p
}
// effectiveLoggingPath is the stored path, or — when blank — derived from the
// drone's capability (autologging → automatic, else manual).
// drone's capability (autologging → the Fly App path, else manual).
func effectiveLoggingPath(f flightRecord, d *droneRecord) string {
if p := strings.TrimSpace(f.LoggingPath); p != "" {
if p := normalizeLoggingPath(f.LoggingPath); p != "" {
return p
}
if d != nil && d.AutologsFlights {
return "automatic"
return loggingFlyApp
}
return "manual"
return loggingManual
}
// needsManualFields reports whether the path has no flight data recorder behind
// it, so the entry itself must hold every § 5 field.
func needsManualFields(path string) bool {
return path == loggingManual || path == loggingFlyAgentApp
}
// manualRequired are the § 5 minimum fields a manual-path entry must carry.
@@ -263,13 +296,13 @@ func computeCompliance(f flightRecord, d *droneRecord) compliance {
c.LoggingPath = effectiveLoggingPath(f, d)
// 3. Red flags (compliance gaps, not just missing data).
if d != nil && d.AutologsFlights && c.LoggingPath == "automatic" && strings.TrimSpace(f.RawFDRLogURL) == "" {
if d != nil && d.AutologsFlights && c.LoggingPath == loggingFlyApp && strings.TrimSpace(f.RawFDRLogURL) == "" {
c.RedFlags = append(c.RedFlags, "Automatic-logging drone but no FDR log stored for this operation")
}
if f.Category == "specific" && strings.TrimSpace(f.AuthorisationRef) == "" {
c.RedFlags = append(c.RedFlags, "Specific-category flight with no linked authorisation reference")
}
if c.Required && c.LoggingPath == "manual" {
if c.Required && needsManualFields(c.LoggingPath) {
for _, m := range missingManualFields(f) {
c.RedFlags = append(c.RedFlags, "Missing § 5 field: "+m)
}
@@ -786,7 +819,7 @@ func (in flightInput) asRecord() flightRecord {
AreaRoute: strings.TrimSpace(in.AreaRoute), MaxAltitudeAGL: in.MaxAltitudeAGL,
PilotName: strings.TrimSpace(in.PilotName), CertificateRef: strings.TrimSpace(in.CertificateRef),
Category: strings.TrimSpace(in.Category), Purpose: strings.TrimSpace(in.Purpose),
LoggingPath: strings.TrimSpace(in.LoggingPath), RawFDRLogURL: strings.TrimSpace(in.RawFDRLogURL),
LoggingPath: normalizeLoggingPath(in.LoggingPath), RawFDRLogURL: strings.TrimSpace(in.RawFDRLogURL),
AuthorisationRef: strings.TrimSpace(in.AuthorisationRef),
}
}
@@ -804,7 +837,7 @@ func (in flightInput) payload(remotePilot, org, retentionUntil string) map[strin
"certificate_ref": strings.TrimSpace(in.CertificateRef),
"category": strings.TrimSpace(in.Category),
"purpose": strings.TrimSpace(in.Purpose),
"logging_path": strings.TrimSpace(in.LoggingPath),
"logging_path": normalizeLoggingPath(in.LoggingPath),
"raw_fdr_log_url": strings.TrimSpace(in.RawFDRLogURL),
"authorisation_ref": strings.TrimSpace(in.AuthorisationRef),
"weather": strings.TrimSpace(in.Weather),
@@ -822,8 +855,9 @@ func (in flightInput) payload(remotePilot, org, retentionUntil string) map[strin
}
// validateFlight enforces the § 5 minimum for the effective logging path. It
// returns an error message (and false) when a manual-path entry is incomplete —
// callers must block the save rather than store a silent partial record.
// returns an error message (and false) when an entry with no FDR behind it is
// incomplete — callers must block the save rather than store a silent partial
// record.
func validateFlight(rec flightRecord, d *droneRecord) (string, bool) {
if strings.TrimSpace(rec.OperationDate) == "" {
return "operation date is required", false
@@ -831,9 +865,14 @@ func validateFlight(rec flightRecord, d *droneRecord) (string, bool) {
if strings.TrimSpace(rec.Drone) == "" {
return "a drone must be selected", false
}
if effectiveLoggingPath(rec, d) == "manual" {
switch effectiveLoggingPath(rec, d) {
case loggingManual, loggingFlyApp, loggingFlyAgentApp:
default:
return "logging path must be manual, automatic_flyapp or automatic_flyagentapp", false
}
if path := effectiveLoggingPath(rec, d); needsManualFields(path) {
if missing := missingManualFields(rec); len(missing) > 0 {
return "manual logbook entry is missing required § 5 field(s): " + strings.Join(missing, ", "), false
return path + " logbook entry is missing required § 5 field(s): " + strings.Join(missing, ", "), false
}
}
return "", true
+89
View File
@@ -0,0 +1,89 @@
package api
import (
"strings"
"testing"
)
func completeFlight(path string) flightRecord {
return flightRecord{
OperationDate: "2026-10-22", StartTime: "14:05", EndTime: "14:17", Drone: "d1",
AreaRoute: "Field north of the hangar", MaxAltitudeAGL: 80, PilotName: "pilot@example.com",
Category: "open", Purpose: "commercial", LoggingPath: path,
}
}
func TestNormalizeLoggingPath(t *testing.T) {
cases := map[string]string{
"automatic": loggingFlyApp,
" automatic ": loggingFlyApp,
"automatic_flyapp": loggingFlyApp,
"automatic_flyagentapp": loggingFlyAgentApp,
"manual": loggingManual,
"": "",
}
for in, want := range cases {
if got := normalizeLoggingPath(in); got != want {
t.Errorf("normalizeLoggingPath(%q) = %q, want %q", in, got, want)
}
}
}
func TestEffectiveLoggingPathDefaults(t *testing.T) {
autolog := &droneRecord{AutologsFlights: true}
if got := effectiveLoggingPath(flightRecord{}, autolog); got != loggingFlyApp {
t.Errorf("autologging drone, blank path = %q, want %q", got, loggingFlyApp)
}
if got := effectiveLoggingPath(flightRecord{}, &droneRecord{}); got != loggingManual {
t.Errorf("plain drone, blank path = %q, want %q", got, loggingManual)
}
if got := effectiveLoggingPath(flightRecord{LoggingPath: "automatic"}, nil); got != loggingFlyApp {
t.Errorf("legacy automatic = %q, want %q", got, loggingFlyApp)
}
}
func TestValidateFlightByPath(t *testing.T) {
// The Fly App path is backed by the FDR, so a sparse entry is accepted.
sparse := flightRecord{OperationDate: "2026-10-22", Drone: "d1", LoggingPath: loggingFlyApp}
if msg, ok := validateFlight(sparse, nil); !ok {
t.Errorf("sparse automatic_flyapp entry rejected: %s", msg)
}
// Manual and Fly Agent entries have no FDR behind them: § 5 fields are required.
for _, path := range []string{loggingManual, loggingFlyAgentApp} {
sparse.LoggingPath = path
msg, ok := validateFlight(sparse, nil)
if ok || !strings.Contains(msg, path) {
t.Errorf("sparse %s entry: ok=%v msg=%q, want a rejection naming the path", path, ok, msg)
}
if msg, ok := validateFlight(completeFlight(path), nil); !ok {
t.Errorf("complete %s entry rejected: %s", path, msg)
}
}
if _, ok := validateFlight(completeFlight("companion"), nil); ok {
t.Error("unknown logging path accepted")
}
}
func TestComplianceRedFlagsByPath(t *testing.T) {
autolog := &droneRecord{AutologsFlights: true}
hasFDRFlag := func(c compliance) bool {
for _, f := range c.RedFlags {
if strings.Contains(f, "no FDR log") {
return true
}
}
return false
}
if c := computeCompliance(completeFlight(loggingFlyApp), autolog); !hasFDRFlag(c) {
t.Error("automatic_flyapp without an FDR url should be flagged")
}
if c := computeCompliance(completeFlight(loggingFlyAgentApp), autolog); hasFDRFlag(c) {
t.Error("automatic_flyagentapp never has an FDR; it must not be flagged for one")
}
agent := completeFlight(loggingFlyAgentApp)
agent.AreaRoute = ""
c := computeCompliance(agent, nil)
if c.LoggingPath != loggingFlyAgentApp || len(c.RedFlags) == 0 {
t.Errorf("automatic_flyagentapp missing area: path=%q flags=%v, want a missing-field flag", c.LoggingPath, c.RedFlags)
}
}
@@ -0,0 +1,60 @@
/// <reference path="../pb_data/types.d.ts" />
// Splits the flights' `logging_path` "automatic" by which app logged it, since
// there are now two and they are not equally trustworthy:
//
// manual typed in by the pilot (Web App form)
// automatic_flyapp Fly App, from the aircraft's own telemetry over the
// DJI SDK; backed by the FDR log
// automatic_flyagentapp Fly Agent App, from the aircraft's Remote ID
// broadcast; no FDR, so the API Server still requires
// the § 5 minimum fields on it
//
// Every existing "automatic" record was logged by the Fly App (the only app
// that logged automatically before this), so it becomes "automatic_flyapp".
// The API Server also maps an incoming "automatic" onto "automatic_flyapp",
// so Fly App builds already on devices keep filing.
//
// Apply by copying into your PocketBase deployment's `pb_migrations/` directory
// and restarting. Written for PocketBase v0.22+/v0.23. Idempotent: the values
// are set outright and only records still holding "automatic" are rewritten.
//
// Depends on 1720300700_add_logbook.js.
migrate(
(app) => {
const flights = app.findCollectionByNameOrId('flights')
const field = flights.fields.find((f) => f.name === 'logging_path')
// Widen first, so records can move to the new value before the old one goes.
field.values = ['manual', 'automatic', 'automatic_flyapp', 'automatic_flyagentapp']
app.save(flights)
for (const rec of app.findRecordsByFilter('flights', "logging_path = 'automatic'", '', 0, 0)) {
rec.set('logging_path', 'automatic_flyapp')
app.save(rec)
}
field.values = ['manual', 'automatic_flyapp', 'automatic_flyagentapp']
app.save(flights)
},
(app) => {
const flights = app.findCollectionByNameOrId('flights')
const field = flights.fields.find((f) => f.name === 'logging_path')
field.values = ['automatic', 'manual', 'automatic_flyapp', 'automatic_flyagentapp']
app.save(flights)
// The old schema has one automatic value, so both apps fold back into it.
for (const rec of app.findRecordsByFilter(
'flights',
"logging_path = 'automatic_flyapp' || logging_path = 'automatic_flyagentapp'",
'', 0, 0,
)) {
rec.set('logging_path', 'automatic')
app.save(rec)
}
field.values = ['automatic', 'manual']
app.save(flights)
},
)
+6 -5
View File
@@ -37,7 +37,7 @@ flutter build apk --debug
The scanners only strip transport framing; all decoding is in Dart and unit
tested against byte-built messages (`test/`).
**API Server contract.** No server changes were needed:
**API Server contract.** The only server change is the logging-path split:
- Live map: the hub already ingests `telemetry` events (`latitude`, `longitude`,
`altitude` = height above take-off, `velocityX/Y/Z` = north/east/down,
@@ -45,10 +45,11 @@ tested against byte-built messages (`test/`).
`ridSerial`, `pilotLatitude/Longitude`, `uaClass`, which ride along in the raw
event. It never sends `flightControllerSerial`, so the Web App's fleet
auto-add does not mint a drone from a Remote ID serial.
- Logbook: entries are filed with `loggingPath: "manual"` and every § 5 manual
field filled from the session (Remote ID is not the aircraft's own flight
recorder, so "automatic" would be a false claim). `logging_path` only allows
`automatic | manual`, so the plan's `"companion"` value would need a migration.
- Logbook: entries are filed with `loggingPath: "automatic_flyagentapp"`
(migration `1720301200_split_logging_path.js`; the paths are `manual`,
`automatic_flyapp`, `automatic_flyagentapp`). Remote ID is not the aircraft's
own flight recorder, so the API Server still requires every § 5 field on this
path, and the session fills them all in.
- Pairing lives on the phone (SharedPreferences), not on the drone record; a
`remote_id_serial` drone field is a later server change.
@@ -202,9 +202,9 @@ class FlightSession {
/// The `POST /api/flights` body (API Server `flightInput`).
///
/// Logged on the **manual** path: Remote ID gives us times, track and height,
/// but this is not the aircraft's own flight data recorder, so the § 5 manual
/// fields are all filled in here rather than claiming an automatic log.
/// Logged on the Fly Agent's own path, `automatic_flyagentapp`. Remote ID gives
/// times, track and height but is not the aircraft's flight data recorder, so
/// the API Server still requires every § 5 field and they are all filled here.
Map<String, dynamic> toFlightInput() {
final DateTime s = (startedAt ?? armedAt ?? DateTime.now()).toLocal();
final DateTime e = (endedAt ?? DateTime.now()).toLocal();
@@ -226,7 +226,7 @@ class FlightSession {
'maxAltitudeAgl': double.parse(effectiveMaxHeight.toStringAsFixed(1)),
'category': category,
'purpose': purpose,
'loggingPath': 'manual',
'loggingPath': 'automatic_flyagentapp',
'weather': weather,
'incidents': incidentText,
'notes': <String>[if (notes.trim().isNotEmpty) notes.trim(), source].join('\n'),
+1 -1
View File
@@ -76,7 +76,7 @@ void main() {
expect(j['endTime'], '14:17');
expect(j['drone'], 'd1');
expect(j['maxAltitudeAgl'], 80.0);
expect(j['loggingPath'], 'manual');
expect(j['loggingPath'], 'automatic_flyagentapp');
expect((j['areaRoute'] as String), contains('Remote ID track'));
expect(j['routeGeojson']['type'], 'LineString');
expect((j['routeGeojson']['coordinates'] as List).first, <double>[12.0, 55.0, 30.0]);
+2 -2
View File
@@ -73,7 +73,7 @@ String areaLabel(FlightRecord r) {
}
/// The `/api/flights` body for [r] flown with logbook drone [droneId]: the
/// app-recorded ("automatic") path, the §5 times and maximum height, the track
/// Fly App's own logging path (`automatic_flyapp`), the §5 times and maximum height, the track
/// as GeoJSON, and the flight's numbers in the notes.
Map<String, Object?> logbookEntry(FlightRecord r, {required String droneId}) {
final String notes = <String>[
@@ -94,7 +94,7 @@ Map<String, Object?> logbookEntry(FlightRecord r, {required String droneId}) {
if (route != null) 'routeGeojson': route,
// Height above take-off: the closest the aircraft's barometer gets to AGL.
'maxAltitudeAgl': double.parse(r.maxAltitude.toStringAsFixed(1)),
'loggingPath': 'automatic',
'loggingPath': 'automatic_flyapp',
'notes': notes,
};
}
+1 -1
View File
@@ -233,7 +233,7 @@ void main() {
expect(e['endTime'], '14:17');
expect(e['drone'], 'd1');
expect(e['maxAltitudeAgl'], 42.4);
expect(e['loggingPath'], 'automatic');
expect(e['loggingPath'], 'automatic_flyapp');
expect(e['areaRoute'], 'Take-off 55.67610° N, 12.56830° E');
final Map<String, Object?> route = e['routeGeojson']! as Map<String, Object?>;
expect(route['type'], 'LineString');
+20
View File
@@ -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 gt={},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),Fe=Array.isArray,ts=t=>ea(t)==="[object Map]",ls=t=>ea(t)==="[object Set]",Al=t=>ea(t)==="[object Date]",We=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)||We(t))&&We(t.then)&&We(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<t.length;s++)t[s](...i)},Du=(t,i,s,l=!1)=>{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(Fe(t)){const i={};for(let s=0;s<t.length;s++){const l=t[s],u=Tt(l)?wd(l):Eo(l);if(u)for(const f in u)i[f]=u[f]}return i}else if(Tt(t)||dt(t))return t}const bd=/;(?![^(]*\))/g,yd=/:([^]+)/,xd=/\/\*[^]*?\*\//g;function wd(t){const i={};return t.replace(xd,"").split(bd).forEach(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(Fe(t))for(let s=0;s<t.length;s++){const l=Ce(t[s]);l&&(i+=l+" ")}else if(dt(t))for(const s in t)t[s]&&(i+=s+" ");return i.trim()}const kd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Sd=Xr(kd);function Ru(t){return!!t||t===""}function Td(t,i){if(t.length!==i.length)return!1;let s=!0;for(let l=0;s&&l<t.length;l++)s=Xi(t[l],i[l]);return s}function Xi(t,i){if(t===i)return!0;let s=Al(t),l=Al(i);if(s||l)return s&&l?t.getTime()===i.getTime():!1;if(s=Qn(t),l=Qn(i),s||l)return t===i;if(s=Fe(t),l=Fe(i),s||l)return s&&l?Td(t,i):!1;if(s=dt(t),l=dt(i),s||l){if(!s||!l)return!1;const u=Object.keys(t).length,f=Object.keys(i).length;if(u!==f)return!1;for(const h in t){const _=t.hasOwnProperty(h),b=i.hasOwnProperty(h);if(_&&!b||!_&&b||!Xi(t[h],i[h]))return!1}}return String(t)===String(i)}function tl(t,i){return t.findIndex(s=>Xi(s,i))}const Bu=t=>!!(t&&t.__v_isRef===!0),x=t=>Tt(t)?t:t==null?"":Fe(t)||dt(t)&&(t.toString===Iu||!We(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)&&!Fe(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;i<s;i++)this.scopes[i].pause();for(i=0,s=this.effects.length;i<s;i++)this.effects[i].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let i,s;if(this.scopes)for(i=0,s=this.scopes.length;i<s;i++)this.scopes[i].resume();for(i=0,s=this.effects.length;i<s;i++)this.effects[i].resume()}}run(i){if(this._active){const s=Yt;try{return Yt=this,i()}finally{Yt=s}}}on(){++this._on===1&&(this.prevScope=Yt,Yt=this)}off(){if(this._on>0&&--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;s<l;s++)this.effects[s].stop();for(this.effects.length=0,s=0,l=this.cleanups.length;s<l;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){for(s=0,l=this.scopes.length;s<l;s++)this.scopes[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!i){const u=this.parent.scopes.pop();u&&u!==this&&(this.parent.scopes[this.index]=u,u.index=this.index)}this.parent=void 0}}}function Cd(){return Yt}let yt;const kr=new WeakSet;class Vu{constructor(i){this.fn=i,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Yt&&(Yt.active?Yt.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,kr.has(this)&&(kr.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Hu(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,El(this),ju(this);const i=yt,s=Xn;yt=this,Xn=!0;try{return this.fn()}finally{Wu(this),yt=i,Xn=s,this.flags&=-3}}stop(){if(this.flags&1){for(let i=this.deps;i;i=i.nextDep)ol(i);this.deps=this.depsTail=void 0,El(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?kr.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Ir(this)&&this.run()}get dirty(){return Ir(this)}}let Zu=0,Bs,Us;function Hu(t,i=!1){if(t.flags|=8,i){t.next=Us,Us=t;return}t.next=Bs,Bs=t}function nl(){Zu++}function il(){if(--Zu>0)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=yt,l=Xn;yt=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{yt=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=yt;yt=void 0;try{i()}finally{yt=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(!yt||!Xn||yt===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==yt)s=this.activeLink=new Ad(yt,this),yt.deps?(s.prevDep=yt.depsTail,yt.depsTail.nextDep=s,yt.depsTail=s):yt.deps=yt.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=yt.depsTail,s.nextDep=void 0,yt.depsTail.nextDep=s,yt.depsTail=s,yt.deps===s&&(yt.deps=l)}return s}trigger(i){this.versiLine truncated
* @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(We(t)){const u=ta(t,i,s,l);return u&&$u(u)&&u.catch(f=>{Ja(f,i,s)}),u}if(Fe(t)){const u=[];for(let f=0;f<t.length;f++)u.push(Hn(t[f],i,s,l));return u}}function Ja(t,i,s,l=!0){const u=i?i.vnode:null,{errorHandler:f,throwUnhandledErrorInProduction:h}=i&&i.appContext.config||gt;if(i){let _=i.parent;const b=i.proxy,C=`https://vuejs.org/error-reference/#runtime-${s}`;for(;_;){const T=_.ec;if(T){for(let E=0;E<T.length;E++)if(T[E](t,b,C)===!1)return}_=_.parent}if(f){di(),ta(f,null,10,[t,b,C]),fi();return}}ef(t,s,u,l,h)}function ef(t,i,s,l=!0,u=!1){if(u)throw t;console.error(t)}const fn=[];let ai=-1;const ns=[];let Ji=null,Qo=0;const ic=Promise.resolve();let $a=null;function oc(t){const i=$a||ic;return t?i.then(this?t.bind(this):t):i}function tf(t){let i=ai+1,s=fn.length;for(;i<s;){const l=i+s>>>1,u=fn[l],f=Gs(u);f<t||f===t&&u.flags&2?i=l+1:s=l}return i}function ul(t){if(!(t.flags&1)){const i=Gs(t),s=fn[fn.length-1];!s||!(t.flags&2)&&i>=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){Fe(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(;s<fn.length;s++){const l=fn[s];if(l&&l.flags&2){if(t&&l.id!==t.uid)continue;fn.splice(s,1),s--,l.flags&4&&(l.flags&=-2),l(),l.flags&4||(l.flags&=-2)}}}function ac(t){if(ns.length){const i=[...new Set(ns)].sort((s,l)=>Gs(s)-Gs(l));if(ns.length=0,Ji){Ji.push(...i);return}for(Ji=i,Qo=0;Qo<Ji.length;Qo++){const s=Ji[Qo];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}Ji=null,Qo=0}}const Gs=t=>t.id==null?t.flags&2?-1:1/0:t.id;function rc(t){try{for(ai=0;ai<fn.length;ai++){const i=fn[ai];i&&!(i.flags&8)&&(i.flags&4&&(i.flags&=-2),ta(i,i.i,i.i?15:14),i.flags&4||(i.flags&=-2))}}finally{for(;ai<fn.length;ai++){const i=fn[ai];i&&(i.flags&=-2)}ai=-1,fn.length=0,ac(),$a=null,(fn.length||ns.length)&&rc()}}let an=null,lc=null;function Ia(t){const i=an;return an=t,lc=t&&t.type.__scopeId||null,i}function we(t,i=an,s){if(!i||t._n)return t;const l=(...u)=>{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 oe(t,i){if(an===null)return t;const s=nr(an),l=t.dirs||(t.dirs=[]);for(let u=0;u<i.length;u++){let[f,h,_,b=gt]=i[u];f&&(We(f)&&(f={mounted:f,updated:f}),f.deep&&Ai(h),l.push({dir:f,instance:s,value:h,oldValue:void 0,arg:_,modifiers:b}))}return t}function wo(t,i,s,l){const u=t.dirs,f=i&&i.dirs;for(let h=0;h<u.length;h++){const _=u[h];f&&(_.oldValue=f[h].value);let b=_.dir[l];b&&(di(),Hn(b,s,8,[t.el,_,t,i]),fi())}}function uc(t,i){if(hn){let s=hn.provides;const l=hn.parent&&hn.parent.provides;l===s&&(s=hn.provides=Object.create(l)),s[t]=i}}function Vs(t,i,s=!1){const l=Uc();if(l||os){let u=os?os._context.provides:l?l.parent==null||l.ce?l.vnode.appContext&&l.vnode.appContext.provides:l.parent.provides:void 0;if(u&&t in u)return u[t];if(arguments.length>1)return s&&We(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=gt){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 U=sf();C=U.__watcherHandles||(U.__watcherHandles=[])}else if(!b){const U=()=>{};return U.stop=ci,U.resume=ci,U.pause=ci,U}}const T=hn;_.call=(U,G,I)=>Hn(U,T,G,I);let E=!1;f==="post"?_.scheduler=U=>{dn(U,T&&T.suspense)}:f!=="sync"&&(E=!0,_.scheduler=(U,G)=>{G?U():ul(U)}),_.augmentJob=U=>{i&&(U.flags|=4),E&&(U.flags|=2,T&&(U.id=T.uid,U.i=T))};const Z=Qd(t,i,_);return Xs&&(C?C.push(Z):b&&Z()),Z}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;We(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;u<s.length&&l;u++)l=l[s[u]];return l}}const Yi=new WeakMap,fc=Symbol("_vte"),hc=t=>t.__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:E,pbc:Z,o:{insert:U,querySelector:G,createText:I,createComment:R,parentNode:Q}}=C,K=Co(i.props);let{dynamicChildren:ke}=i;const de=(Me,Ze,ve)=>{Me.shapeFlag&16&&T(Me.children,Ze,ve,u,f,h,_,b)},xe=(Me=i)=>{const Ze=Co(Me.props),ve=Me.target=Br(Me.props,G),te=Ur(ve,Me,I,U);ve&&(h!=="svg"&&$l(ve)?h="svg":h!=="mathml"&&Il(ve)&&(h="mathml"),u&&u.isCE&&(u.ce._teleportTargets||(u.ce._teleportTargets=new Set)).add(ve),Ze||(de(Me,ve,te),Is(Me,!1)))},Le=Me=>{const Ze=()=>{if(Yi.get(Me)===Ze){if(Yi.delete(Me),Co(Me.props)){const ve=Q(Me.el)||s;de(Me,ve,Me.anchor),Is(Me,!0)}xe(Me)}};Yi.set(Me,Ze),dn(Ze,f)};if(t==null){const Me=i.el=I(""),Ze=i.anchor=I("");if(U(Me,s,l),U(Ze,s,l),rf(i. Line truncated
* @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"?`<svg>${t}</svg>`:l==="mathml"?`<math>${t}</math>`: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=[])=>{Fe(t)?t.forEach(s=>s(...i)):t&&t(...i)},Jl=t=>t?Fe(t)?t.some(i=>i.length>1):t.length>1:!1;function _h(t){const i={};for(const F in t)F in jc||(i[F]=t[F]);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:E=`${s}-leave-from`,leaveActiveClass:Z=`${s}-leave-active`,leaveToClass:U=`${s}-leave-to`}=t,G=bh(u),I=G&&G[0],R=G&&G[1],{onBeforeEnter:Q,onEnter:K,onEnterCancelled:ke,onLeave:de,onLeaveCancelled:xe,onBeforeAppear:Le=Q,onAppear:Me=K,onAppearCancelled:Ze=ke}=i,ve=(F,se,M,H)=>{F._enterCancelled=H,To(F,se?T:_),To(F,se?C:h),M&&M()},te=(F,se)=>{F._isLeaving=!1,To(F,E),To(F,U),To(F,Z),se&&se()},B=F=>(se,M)=>{const H=F?Me:K,Pe=()=>ve(se,F,M);So(H,[se,Pe]),Xl(()=>{To(se,F?b:f),Ti(se,F?T:_),Jl(H)||Ql(se,l,I,Pe)})};return Kt(i,{onBeforeEnter(F){So(Q,[F]),Ti(F,f),Ti(F,h)},onBeforeAppear(F){So(Le,[F]),Ti(F,b),Ti(F,C)},onEnter:B(!1),onAppear:B(!0),onLeave(F,se){F._isLeaving=!0;const M=()=>te(F,se);Ti(F,E),F._enterCancelled?(Ti(F,Z),nu(F)):(nu(F),Ti(F,Z)),Xl(()=>{F._isLeaving&&(To(F,E),Ti(F,U),Jl(de)||Ql(F,l,R,M))}),So(de,[F,M])},onEnterCancelled(F){ve(F,!1,void 0,!0),So(ke,[F])},onAppearCancelled(F){ve(F,!0,void 0,!0),So(Ze,[F])},onLeaveCancelled(F){te(F),So(xe,[F])}})}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 E=()=>{t.removeEventListener(C,Z),f()},Z=U=>{U.target===t&&++T>=b&&E()};setTimeout(()=>{T<b&&E()},_+1),t.addEventListener(C,Z)}function xh(t,i){const s=window.getComputedStyle(t),l=G=>(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,E=0,Z=0;i===Gi?h>0&&(T=Gi,E=h,Z=f.length):i===zs?C>0&&(T=zs,E=C,Z=b.length):(E=Math.max(h,C),T=E>0?h>C?Gi:zs:null,Z=T?T===Gi?f.length:b.length:0);const U=T===Gi&&/\b(?:transform|all)(?:,|$)/.test(l(`${Gi}Property`).toString());return{type:T,timeout:E,propCount:Z,hasTransform:U}}function eu(t,i){for(;t.length<i.length;)t=t.concat(t);return Math.max(...i.map((s,l)=>tu(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.beforeEnte Line truncated
* 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<r;o++){d=arguments[o];for(n in d)e[n]=d[n]}return e}var f=Object.create||(function(){function e(){}return function(n){return e.prototype=n,new e}})();function h(e,n){var o=Array.prototype.slice;if(e.bind)return e.bind.apply(e,o.call(arguments,1));var r=o.call(arguments,2);return function(){return e.apply(n,r.length?r.concat(o.call(arguments)):arguments)}}var _=0;function b(e){return"_leaflet_id"in e||(e._leaflet_id=++_),e._leaflet_id}function C(e,n,o){var r,d,v,P;return P=function(){r=!1,d&&(v.apply(o,d),d=!1)},v=function(){r?d=arguments:(e.apply(o,arguments),setTimeout(P,n),r=!0)},v}function T(e,n,o){var r=n[1],d=n[0],v=r-d;return e===r&&o?e:((e-d)%v+v)%v+d}function E(){return!1}function Z(e,n){if(n===!1)return e;var o=Math.pow(10,n===void 0?6:n);return Math.round(e*o)/o}function U(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function G(e){return U(e).split(/\s+/)}function I(e,n){Object.prototype.hasOwnProperty.call(e,"options")||(e.options=e.options?f(e.options):{});for(var o in n)e.options[o]=n[o];return e.options}function R(e,n,o){var r=[];for(var d in e)r.push(encodeURIComponent(o?d.toUpperCase():d)+"="+encodeURIComponent(e[d]));return(!n||n.indexOf("?")===-1?"?":"&")+r.join("&")}var Q=/\{ *([\w_ -]+) *\}/g;function K(e,n){return e.replace(Q,function(o,r){var d=n[r];if(d===void 0)throw new Error("No value provided for variable "+o);return typeof d=="function"&&(d=d(n)),d})}var ke=Array.isArray||function(e){return Object.prototype.toString.call(e)==="[object Array]"};function de(e,n){for(var o=0;o<e.length;o++)if(e[o]===n)return o;return-1}var xe="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function Le(e){return window["webkit"+e]||window["moz"+e]||window["ms"+e]}var Me=0;function Ze(e){var n=+new Date,o=Math.max(0,16-(n-Me));return Me=n+o,window.setTimeout(e,o)}var ve=window.requestAnimationFrame||Le("RequestAnimationFrame")||Ze,te=window.cancelAnimationFrame||Le("CancelAnimationFrame")||Le("CancelRequestAnimationFrame")||function(e){window.clearTimeout(e)};function B(e,n,o){if(o&&ve===Ze)e.call(n);else return ve.call(window,h(e,n))}function F(e){e&&te.call(window,e)}var se={__proto__:null,extend:u,create:f,bind:h,get lastId(){return _},stamp:b,throttle:C,wrapNum:T,falseFn:E,formatNum:Z,trim:U,splitWords:G,setOptions:I,getParamString:R,template:K,isArray:ke,indexOf:de,emptyImageUrl:xe,requestFn:ve,cancelFn:te,requestAnimFrame:B,cancelAnimFrame:F};function M(){}M.extend=function(e){var n=function(){I(this),this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},o=n.__super__=this.prototype,r=f(o);r.constructor=n,n.prototype=r;for(var d in this)Object.prototype.hasOwnProperty.call(this,d)&&d!=="prototype"&&d!=="__super__"&&(n[d]=this[d]);return e.statics&&u(n,e.statics),e.includes&&(H(e.includes),u.apply(null,[r].concat(e.includes))),u(r,e),delete r.statics,delete r.includes,r.options&&(r.options=o.options?f(o.options):{},u(r.options,e.options)),r._initHooks=[],r.callInitHooks=function(){if(!this._initHooksCalled){o.callInitHooks&&o.callInitHooks.call(this),this._initHooksCalled=!0;for(var v=0,P=r._initHooks.length;v<P;v++)r._initHooks[v].call(this)}},n},M.include=function(e){var n=this.prototype.options;return u(this.prototype,e),e.options&&(this.prototype.options=n,this.mergeOptions(e.options)),this},M.mergeOptions=function(e){return u(this.prototype.options,e),this},M.addInitHook=function(e){var n=Array.prototype.slice.call(arguments,1),o=typeof e=="function"?e:function(){this[e].apply(this,n)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(o),this};function H(e){if(!(typeof L>"u"||!L||!L.Mixin)){e=ke(e)?e:[e];for(var n=0;n<e.length;n++)e[n]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",new Error().stack)}}var Pe={on:function(e,n,o){if(typeof e=="object")for(var r in e)this._on(r,e[r],n);else{e=G(e);for(var d=0,v=e.length;d<v;d++)this._on(e[d],n,o)}return this},off:function(e,n,o){if(!arguments.length)delete this._events;else if(typeof e=="object")for(var r in e)this._off(r,e[r],n);else{e=G(e);for(var d=arguments.length===1,v=0,P=e.length;v<P;v++)d?this._off(e[v]):this._off(e[v],n,o)}return this},_on:function(e,n,o,r){if(typeof n!="function"){console.warn("wrong listener type: "+typeof n);return}if(this._listens(e,n,o)===!1){o===this&&(o=void 0);var d={fn:n,ctx:o};r&&(d.once=!0),this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(d)}},_off:function(e,n,o){var r,d,v;if(this._events&&(r=this._events[e],!!r)){if(arguments.length===1){if(this._firingCount)for(d=0,v=r.length;d<v;d++)r[d].fn=E;delete this._events[e];return}if(typeof n!="function"){console.warn("wrong listener type: "+typeof n);reLine truncated
-20
View File
@@ -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=[],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<t.length;s++)t[s](...i)},Du=(t,i,s,l=!1)=>{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<t.length;s++){const l=t[s],u=Tt(l)?wd(l):Eo(l);if(u)for(const f in u)i[f]=u[f]}return i}else if(Tt(t)||dt(t))return t}const bd=/;(?![^(]*\))/g,yd=/:([^]+)/,xd=/\/\*[^]*?\*\//g;function wd(t){const i={};return t.replace(xd,"").split(bd).forEach(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;s<t.length;s++){const l=Pe(t[s]);l&&(i+=l+" ")}else if(dt(t))for(const s in t)t[s]&&(i+=s+" ");return i.trim()}const kd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Sd=Xr(kd);function Ru(t){return!!t||t===""}function Td(t,i){if(t.length!==i.length)return!1;let s=!0;for(let l=0;s&&l<t.length;l++)s=Xi(t[l],i[l]);return s}function Xi(t,i){if(t===i)return!0;let s=Al(t),l=Al(i);if(s||l)return s&&l?t.getTime()===i.getTime():!1;if(s=Qn(t),l=Qn(i),s||l)return t===i;if(s=Ne(t),l=Ne(i),s||l)return s&&l?Td(t,i):!1;if(s=dt(t),l=dt(i),s||l){if(!s||!l)return!1;const u=Object.keys(t).length,f=Object.keys(i).length;if(u!==f)return!1;for(const h in t){const _=t.hasOwnProperty(h),b=i.hasOwnProperty(h);if(_&&!b||!_&&b||!Xi(t[h],i[h]))return!1}}return String(t)===String(i)}function tl(t,i){return t.findIndex(s=>Xi(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;i<s;i++)this.scopes[i].pause();for(i=0,s=this.effects.length;i<s;i++)this.effects[i].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let i,s;if(this.scopes)for(i=0,s=this.scopes.length;i<s;i++)this.scopes[i].resume();for(i=0,s=this.effects.length;i<s;i++)this.effects[i].resume()}}run(i){if(this._active){const s=Yt;try{return Yt=this,i()}finally{Yt=s}}}on(){++this._on===1&&(this.prevScope=Yt,Yt=this)}off(){if(this._on>0&&--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;s<l;s++)this.effects[s].stop();for(this.effects.length=0,s=0,l=this.cleanups.length;s<l;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){for(s=0,l=this.scopes.length;s<l;s++)this.scopes[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!i){const u=this.parent.scopes.pop();u&&u!==this&&(this.parent.scopes[this.index]=u,u.index=this.index)}this.parent=void 0}}}function Cd(){return Yt}let xt;const kr=new WeakSet;class Vu{constructor(i){this.fn=i,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Yt&&(Yt.active?Yt.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,kr.has(this)&&(kr.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Hu(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,El(this),ju(this);const i=xt,s=Xn;xt=this,Xn=!0;try{return this.fn()}finally{Wu(this),xt=i,Xn=s,this.flags&=-3}}stop(){if(this.flags&1){for(let i=this.deps;i;i=i.nextDep)ol(i);this.deps=this.depsTail=void 0,El(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?kr.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Ir(this)&&this.run()}get dirty(){return Ir(this)}}let Zu=0,Bs,Us;function Hu(t,i=!1){if(t.flags|=8,i){t.next=Us,Us=t;return}t.next=Bs,Bs=t}function nl(){Zu++}function il(){if(--Zu>0)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.versiLine truncated
* @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<t.length;f++)u.push(Hn(t[f],i,s,l));return u}}function Ja(t,i,s,l=!0){const u=i?i.vnode:null,{errorHandler:f,throwUnhandledErrorInProduction:h}=i&&i.appContext.config||vt;if(i){let _=i.parent;const b=i.proxy,C=`https://vuejs.org/error-reference/#runtime-${s}`;for(;_;){const T=_.ec;if(T){for(let M=0;M<T.length;M++)if(T[M](t,b,C)===!1)return}_=_.parent}if(f){di(),ta(f,null,10,[t,b,C]),fi();return}}ef(t,s,u,l,h)}function ef(t,i,s,l=!0,u=!1){if(u)throw t;console.error(t)}const fn=[];let ai=-1;const ns=[];let Ji=null,Qo=0;const ic=Promise.resolve();let $a=null;function oc(t){const i=$a||ic;return t?i.then(this?t.bind(this):t):i}function tf(t){let i=ai+1,s=fn.length;for(;i<s;){const l=i+s>>>1,u=fn[l],f=Gs(u);f<t||f===t&&u.flags&2?i=l+1:s=l}return i}function ul(t){if(!(t.flags&1)){const i=Gs(t),s=fn[fn.length-1];!s||!(t.flags&2)&&i>=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(;s<fn.length;s++){const l=fn[s];if(l&&l.flags&2){if(t&&l.id!==t.uid)continue;fn.splice(s,1),s--,l.flags&4&&(l.flags&=-2),l(),l.flags&4||(l.flags&=-2)}}}function ac(t){if(ns.length){const i=[...new Set(ns)].sort((s,l)=>Gs(s)-Gs(l));if(ns.length=0,Ji){Ji.push(...i);return}for(Ji=i,Qo=0;Qo<Ji.length;Qo++){const s=Ji[Qo];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}Ji=null,Qo=0}}const Gs=t=>t.id==null?t.flags&2?-1:1/0:t.id;function rc(t){try{for(ai=0;ai<fn.length;ai++){const i=fn[ai];i&&!(i.flags&8)&&(i.flags&4&&(i.flags&=-2),ta(i,i.i,i.i?15:14),i.flags&4||(i.flags&=-2))}}finally{for(;ai<fn.length;ai++){const i=fn[ai];i&&(i.flags&=-2)}ai=-1,fn.length=0,ac(),$a=null,(fn.length||ns.length)&&rc()}}let an=null,lc=null;function Ia(t){const i=an;return an=t,lc=t&&t.type.__scopeId||null,i}function ye(t,i=an,s){if(!i||t._n)return t;const l=(...u)=>{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;u<i.length;u++){let[f,h,_,b=vt]=i[u];f&&(je(f)&&(f={mounted:f,updated:f}),f.deep&&Ai(h),l.push({dir:f,instance:s,value:h,oldValue:void 0,arg:_,modifiers:b}))}return t}function wo(t,i,s,l){const u=t.dirs,f=i&&i.dirs;for(let h=0;h<u.length;h++){const _=u[h];f&&(_.oldValue=f[h].value);let b=_.dir[l];b&&(di(),Hn(b,s,8,[t.el,_,t,i]),fi())}}function uc(t,i){if(hn){let s=hn.provides;const l=hn.parent&&hn.parent.provides;l===s&&(s=hn.provides=Object.create(l)),s[t]=i}}function Vs(t,i,s=!1){const l=Uc();if(l||os){let u=os?os._context.provides:l?l.parent==null||l.ce?l.vnode.appContext&&l.vnode.appContext.provides:l.parent.provides:void 0;if(u&&t in u)return u[t];if(arguments.length>1)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;u<s.length&&l;u++)l=l[s[u]];return l}}const Yi=new WeakMap,fc=Symbol("_vte"),hc=t=>t.__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 Line truncated
* @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"?`<svg>${t}</svg>`:l==="mathml"?`<math>${t}</math>`: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<b&&M()},_+1),t.addEventListener(C,H)}function xh(t,i){const s=window.getComputedStyle(t),l=G=>(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.length<i.length;)t=t.concat(t);return Math.max(...i.map((s,l)=>tu(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):$ Line truncated
* 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<r;o++){d=arguments[o];for(n in d)e[n]=d[n]}return e}var f=Object.create||(function(){function e(){}return function(n){return e.prototype=n,new e}})();function h(e,n){var o=Array.prototype.slice;if(e.bind)return e.bind.apply(e,o.call(arguments,1));var r=o.call(arguments,2);return function(){return e.apply(n,r.length?r.concat(o.call(arguments)):arguments)}}var _=0;function b(e){return"_leaflet_id"in e||(e._leaflet_id=++_),e._leaflet_id}function C(e,n,o){var r,d,v,P;return P=function(){r=!1,d&&(v.apply(o,d),d=!1)},v=function(){r?d=arguments:(e.apply(o,arguments),setTimeout(P,n),r=!0)},v}function T(e,n,o){var r=n[1],d=n[0],v=r-d;return e===r&&o?e:((e-d)%v+v)%v+d}function M(){return!1}function H(e,n){if(n===!1)return e;var o=Math.pow(10,n===void 0?6:n);return Math.round(e*o)/o}function j(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function G(e){return j(e).split(/\s+/)}function N(e,n){Object.prototype.hasOwnProperty.call(e,"options")||(e.options=e.options?f(e.options):{});for(var o in n)e.options[o]=n[o];return e.options}function U(e,n,o){var r=[];for(var d in e)r.push(encodeURIComponent(o?d.toUpperCase():d)+"="+encodeURIComponent(e[d]));return(!n||n.indexOf("?")===-1?"?":"&")+r.join("&")}var R=/\{ *([\w_ -]+) *\}/g;function oe(e,n){return e.replace(R,function(o,r){var d=n[r];if(d===void 0)throw new Error("No value provided for variable "+o);return typeof d=="function"&&(d=d(n)),d})}var we=Array.isArray||function(e){return Object.prototype.toString.call(e)==="[object Array]"};function ue(e,n){for(var o=0;o<e.length;o++)if(e[o]===n)return o;return-1}var ke="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function Ce(e){return window["webkit"+e]||window["moz"+e]||window["ms"+e]}var Le=0;function Ze(e){var n=+new Date,o=Math.max(0,16-(n-Le));return Le=n+o,window.setTimeout(e,o)}var he=window.requestAnimationFrame||Ce("RequestAnimationFrame")||Ze,ee=window.cancelAnimationFrame||Ce("CancelAnimationFrame")||Ce("CancelRequestAnimationFrame")||function(e){window.clearTimeout(e)};function V(e,n,o){if(o&&he===Ze)e.call(n);else return he.call(window,h(e,n))}function O(e){e&&ee.call(window,e)}var F={__proto__:null,extend:u,create:f,bind:h,get lastId(){return _},stamp:b,throttle:C,wrapNum:T,falseFn:M,formatNum:H,trim:j,splitWords:G,setOptions:N,getParamString:U,template:oe,isArray:we,indexOf:ue,emptyImageUrl:ke,requestFn:he,cancelFn:ee,requestAnimFrame:V,cancelAnimFrame:O};function $(){}$.extend=function(e){var n=function(){N(this),this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},o=n.__super__=this.prototype,r=f(o);r.constructor=n,n.prototype=r;for(var d in this)Object.prototype.hasOwnProperty.call(this,d)&&d!=="prototype"&&d!=="__super__"&&(n[d]=this[d]);return e.statics&&u(n,e.statics),e.includes&&(Ye(e.includes),u.apply(null,[r].concat(e.includes))),u(r,e),delete r.statics,delete r.includes,r.options&&(r.options=o.options?f(o.options):{},u(r.options,e.options)),r._initHooks=[],r.callInitHooks=function(){if(!this._initHooksCalled){o.callInitHooks&&o.callInitHooks.call(this),this._initHooksCalled=!0;for(var v=0,P=r._initHooks.length;v<P;v++)r._initHooks[v].call(this)}},n},$.include=function(e){var n=this.prototype.options;return u(this.prototype,e),e.options&&(this.prototype.options=n,this.mergeOptions(e.options)),this},$.mergeOptions=function(e){return u(this.prototype.options,e),this},$.addInitHook=function(e){var n=Array.prototype.slice.call(arguments,1),o=typeof e=="function"?e:function(){this[e].apply(this,n)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(o),this};function Ye(e){if(!(typeof L>"u"||!L||!L.Mixin)){e=we(e)?e:[e];for(var n=0;n<e.length;n++)e[n]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",new Error().stack)}}var Se={on:function(e,n,o){if(typeof e=="object")for(var r in e)this._on(r,e[r],n);else{e=G(e);for(var d=0,v=e.length;d<v;d++)this._on(e[d],n,o)}return this},off:function(e,n,o){if(!arguments.length)delete this._events;else if(typeof e=="object")for(var r in e)this._off(r,e[r],n);else{e=G(e);for(var d=arguments.length===1,v=0,P=e.length;v<P;v++)d?this._off(e[v]):this._off(e[v],n,o)}return this},_on:function(e,n,o,r){if(typeof n!="function"){console.warn("wrong listener type: "+typeof n);return}if(this._listens(e,n,o)===!1){o===this&&(o=void 0);var d={fn:n,ctx:o};r&&(d.once=!0),this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(d)}},_off:function(e,n,o){var r,d,v;if(this._events&&(r=this._events[e],!!r)){if(arguments.length===1){if(this._firingCount)for(d=0,v=r.length;d<v;d++)r[d].fn=M;delete this._events[e];return}if(typeof n!="function"){console.warn("wrong listener type: "+typeof n)Line truncated
+1 -1
View File
@@ -35,7 +35,7 @@
})()
</script>
<title>PilotVault — Control Panel</title>
<script type="module" crossorigin src="./assets/index-DwIAtafL.js"></script>
<script type="module" crossorigin src="./assets/index-DtfZVo9q.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-DFvwkmh-.css">
</head>
<body>
+6 -3
View File
@@ -71,8 +71,11 @@ const PURPOSES = [
const PATHS = [
{ value: '', label: 'Auto (from drone)' },
{ value: 'manual', label: 'Manual' },
{ value: 'automatic', label: 'Automatic (FDR)' },
{ value: 'automatic_flyapp', label: 'Automatic — Fly App (FDR)' },
{ value: 'automatic_flyagentapp', label: 'Automatic — Fly Agent (Remote ID)' },
]
// Compliance reports the effective path as its raw value; show the same labels.
const pathLabel = (v) => PATHS.find((p) => p.value === v)?.label || v || '—'
function blankFlight() {
return {
@@ -270,7 +273,7 @@ const stats = computed(() => {
</div>
<label class="mt-3 block">
<span class="eyebrow mb-1 block">FDR log URL (automatic path)</span>
<span class="eyebrow mb-1 block">FDR log URL (Fly App path)</span>
<input v-model="flightForm.rawFdrLogUrl" class="field" placeholder="Link to the stored flight-data-recorder export" />
</label>
@@ -354,7 +357,7 @@ const stats = computed(() => {
<tr v-if="openRow === f.id" class="border-b border-line bg-surface-2">
<td colspan="7" class="px-5 py-3">
<div class="flex flex-wrap gap-x-8 gap-y-1.5 text-xs">
<span class="text-ink-secondary">Logging path: <b class="text-ink">{{ f.compliance?.loggingPath || '—' }}</b></span>
<span class="text-ink-secondary">Logging path: <b class="text-ink">{{ pathLabel(f.compliance?.loggingPath) }}</b></span>
<span class="text-ink-secondary">Category: <b class="text-ink">{{ f.category || '—' }}</b></span>
<span class="text-ink-secondary">Retain until: <b class="font-mono text-ink">{{ (f.retentionUntil || '').slice(0, 10) || '—' }}</b></span>
<span v-if="f.compliance?.exempt" class="text-ink-secondary">Exempt: <b class="text-ink">{{ f.compliance.exemptReason }}</b></span>