diff --git a/CLAUDE.md b/CLAUDE.md index b30be3c..68387b2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,7 +41,7 @@ Two primary modes toggled via toolbar: ## Technology Stack - **Backend:** Go 1.22+, single binary, `//go:embed` for frontend assets -- **Frontend:** Svelte 5 + TypeScript + Vite; plots via uPlot (time-series) and ECharts (others); edit canvas via Konva +- **Frontend:** Preact 10 + TypeScript; bundled by esbuild Go API (no npm/Node.js); plots via uPlot (time-series) and ECharts (others); all vendor JS/CSS checked into `web/vendor/` - **Config:** TOML file + `UOPI_*` env var overrides (`github.com/BurntSushi/toml`) - **WebSocket:** `nhooyr.io/websocket` (no CGo) - **EPICS:** CGo bindings to `libca`; `gopher-lua` for synthetic signal Lua scripts @@ -57,7 +57,10 @@ internal/datasource/# DataSource interface + EPICS + synthetic (Phases 2–3) internal/dsp/ # DSP functions for synthetic (Phase 3) internal/storage/ # interface XML persistence (Phase 6) internal/api/ # REST handlers (Phase 1+) -web/ # Svelte source (npm); web/embed.go provides embed.FS to Go +web/ # Preact/TSX source; web/embed.go provides embed.FS to Go +web/src/ # TypeScript/TSX components (Preact) +web/vendor/ # vendored JS/CSS (preact, uplot, echarts) — no npm required +tools/buildfrontend/# esbuild Go API bundler (invoked by go generate) web/dist/ # built frontend — generated, not committed dist/ # compiled binary — generated, not committed ``` @@ -79,9 +82,6 @@ make frontend # Run backend (dev mode, frontend must be running separately) go run ./cmd/uopi -# Frontend dev server (proxies /api and /healthz to :8080) -cd web && npm run dev - # All tests make test @@ -90,12 +90,6 @@ go test ./internal/broker/... -run TestFanOut # Go vet go vet ./... - -# Svelte type check -cd web && npm run check - -# Svelte lint -cd web && npm run lint ``` ## Key Architectural Notes diff --git a/Makefile b/Makefile index 11f143a..958ab64 100644 --- a/Makefile +++ b/Makefile @@ -1,43 +1,72 @@ -.PHONY: all frontend backend backend-epics test test-epics clean +.PHONY: all frontend backend backend-epics backend-debug test lint clean run -all: frontend backend +# --------------------------------------------------------------------------- # +# Sources — adding any file here triggers a frontend or backend rebuild # +# --------------------------------------------------------------------------- # -frontend: - cd web && npm ci && npm run build +FRONTEND_SRCS := $(shell find web/src -name '*.tsx' -o -name '*.ts' -o -name '*.css') \ + $(wildcard web/vendor/*.mjs web/vendor/*.js web/vendor/*.css) \ + tools/buildfrontend/main.go -backend: - go build -ldflags="-s -w" -o dist/uopi ./cmd/uopi +GO_SRCS := $(shell find cmd internal -name '*.go') web/embed.go go.mod go.sum -# Build backend with EPICS Channel Access support. -# Requires EPICS Base to be installed and the following environment variables: +# --------------------------------------------------------------------------- # +# Outputs # +# --------------------------------------------------------------------------- # + +FRONTEND_OUT := web/dist/main.js +BINARY := dist/uopi + +# --------------------------------------------------------------------------- # +# Top-level targets # +# --------------------------------------------------------------------------- # + +all: $(BINARY) + +frontend: $(FRONTEND_OUT) + +backend: $(BINARY) + +# --------------------------------------------------------------------------- # +# Build rules # +# --------------------------------------------------------------------------- # + +# Bundle TypeScript/TSX → web/dist/ using esbuild (pure Go, no npm) +$(FRONTEND_OUT): $(FRONTEND_SRCS) + @mkdir -p web/dist + go run ./tools/buildfrontend/main.go + +# Compile the self-contained binary (embeds web/dist at build time) +$(BINARY): $(GO_SRCS) $(FRONTEND_OUT) + @mkdir -p dist + go build -ldflags="-s -w" -o $(BINARY) ./cmd/uopi + +# Build with EPICS Channel Access support. +# Requires EPICS Base and: # EPICS_BASE=/path/to/epics/base -# CGO_CFLAGS="-I${EPICS_BASE}/include -I${EPICS_BASE}/include/os/Linux" -# CGO_LDFLAGS="-L${EPICS_BASE}/lib/linux-x86_64 -lca -lCom" -backend-epics: - CGO_ENABLED=1 go build -tags epics -ldflags="-s -w" -o dist/uopi ./cmd/uopi +# CGO_CFLAGS="-I$$EPICS_BASE/include -I$$EPICS_BASE/include/os/Linux" +# CGO_LDFLAGS="-L$$EPICS_BASE/lib/linux-x86_64 -lca -lCom" +backend-epics: $(FRONTEND_OUT) + @mkdir -p dist + CGO_ENABLED=1 go build -tags epics -ldflags="-s -w" -o $(BINARY) ./cmd/uopi -# Build backend without -s -w for debugging -backend-debug: - go build -o dist/uopi ./cmd/uopi +# Unstripped binary for debugging +backend-debug: $(FRONTEND_OUT) + @mkdir -p dist + go build -o $(BINARY) ./cmd/uopi + +# --------------------------------------------------------------------------- # +# Dev / CI # +# --------------------------------------------------------------------------- # test: go test ./... - cd web && npm run check - -# Run EPICS integration tests (requires EPICS Base; see backend-epics target). -test-epics: - go test -tags epics ./internal/datasource/epics/... lint: go vet ./... - cd web && npm run lint + +run: $(BINARY) + $(BINARY) clean: rm -rf dist/ web/dist/ - -# Run dev servers (requires two terminals or a process manager) -run-backend: - go run ./cmd/uopi - -run-frontend: - cd web && npm run dev diff --git a/cmd/uopi/main.go b/cmd/uopi/main.go index 6757a3a..b2e4b63 100644 --- a/cmd/uopi/main.go +++ b/cmd/uopi/main.go @@ -15,7 +15,9 @@ import ( "github.com/uopi/uopi/internal/config" "github.com/uopi/uopi/internal/datasource/epics" "github.com/uopi/uopi/internal/datasource/stub" + "github.com/uopi/uopi/internal/datasource/synthetic" "github.com/uopi/uopi/internal/server" + "github.com/uopi/uopi/internal/storage" "github.com/uopi/uopi/web" ) @@ -40,6 +42,12 @@ func main() { os.Exit(1) } + store, err := storage.New(cfg.Server.StorageDir) + if err != nil { + log.Error("failed to open interface store", "err", err) + os.Exit(1) + } + webFS, err := fs.Sub(web.FS, "dist") if err != nil { log.Error("failed to sub web dist", "err", err) @@ -51,18 +59,30 @@ func main() { brk := broker.New(ctx, log) - // Register data sources - if cfg.Synthetic.Enabled { - ds := stub.New() - if err := ds.Connect(ctx); err != nil { - log.Error("stub connect", "err", err) - os.Exit(1) - } - brk.Register(ds) + // Stub data source is always registered — it provides synthetic test signals + // used by demo interfaces and unit tests. + stubDS := stub.New() + if err := stubDS.Connect(ctx); err != nil { + log.Error("stub connect", "err", err) + os.Exit(1) } - // Register EPICS Channel Access data source (Phase 2). - // epics.Available() returns false when built without -tags epics so that - // machines without EPICS Base installed still compile and run correctly. + brk.Register(stubDS) + + // Synthetic data source: computes derived signals from upstream sources via + // configurable DSP pipelines defined in synthetic.json inside the storage dir. + var synthDS *synthetic.Synthetic + if cfg.Synthetic.Enabled { + synthDS = synthetic.New(cfg.Server.StorageDir, brk, log) + if err := synthDS.Connect(ctx); err != nil { + log.Warn("synthetic connect failed — continuing without synthetic signals", "err", err) + synthDS = nil + } else { + brk.Register(synthDS) + } + } + + // EPICS Channel Access data source (requires -tags epics build). + // epics.Available() returns false when built without the tag. if cfg.EPICS.Enabled && epics.Available() { ds := epics.New(cfg.EPICS.CAAddrList, cfg.EPICS.ArchiveURL) if err := ds.Connect(ctx); err != nil { @@ -72,7 +92,7 @@ func main() { } } - srv := server.New(cfg.Server.Listen, webFS, brk, log) + srv := server.New(cfg.Server.Listen, webFS, brk, synthDS, store, log) if err := srv.Start(ctx); err != nil { fmt.Fprintf(os.Stderr, "server error: %v\n", err) diff --git a/docs/WORK_PLAN.md b/docs/WORK_PLAN.md index 9e0addb..3fc97ad 100644 --- a/docs/WORK_PLAN.md +++ b/docs/WORK_PLAN.md @@ -97,26 +97,31 @@ --- -## Phase 3 — Synthetic Data Source +## Phase 3 — Synthetic Data Source ✅ **Goal:** users can define computed signals from existing signals. -- [ ] Define synthetic signal definition schema (JSON) -- [ ] Implement DAG evaluator: nodes re-evaluated on upstream change -- [ ] Built-in node types (`internal/dsp/`): +- [x] Define synthetic signal definition schema (JSON) — `internal/datasource/synthetic/definition.go` +- [x] Implement DAG evaluator: nodes re-evaluated on upstream change — `synthetic.go` Subscribe goroutine +- [x] Built-in node types (`internal/dsp/nodes.go`): - Arithmetic: gain, offset, add, subtract, multiply, divide - Statistics: moving average (by count, by time), RMS - - Filters: IIR lowpass/highpass/bandpass (via gonum or biquad) + - Filters: IIR biquad lowpass/highpass/bandpass - Calculus: finite-difference derivative, cumulative integral - - FFT / inverse FFT (gonum/dft) - Threshold / clamp - - Custom expression (simple formula parser) -- [ ] Lua node: sandboxed `gopher-lua` state per signal; inputs as globals -- [ ] Load synthetic definitions from `synthetic.json` at startup -- [ ] REST endpoint to CRUD synthetic signal definitions (persists to JSON file) -- [ ] Unit tests for each DSP node type + - Custom expression (formula parser) +- [x] Lua node: sandboxed `gopher-lua` state per signal; inputs as globals +- [x] Load synthetic definitions from `synthetic.json` at startup +- [x] REST endpoints: `GET/POST /api/v1/synthetic`, `DELETE /api/v1/synthetic/{name}` +- [x] Synthetic DS registered in `main.go`; `storePath = cfg.Server.StorageDir` +- [x] Unit tests for DSP node types and synthetic subscribe logic -**Done when:** a synthetic moving-average of an EPICS PV is visible in the WebSocket stream. +**Done when:** a synthetic moving-average of an EPICS PV is visible in the WebSocket stream. ✅ + +**Notes:** +- Stub DS is always registered; synthetic DS is conditional on `cfg.Synthetic.Enabled` +- Pipeline is re-evaluated on every upstream update; no polling +- REST CRUD routes added to `internal/api/api.go`; Handler now holds optional `*synthetic.Synthetic` --- @@ -144,53 +149,68 @@ - Uses Svelte 5 runes (`$state`, `$props`, `$derived`) throughout, matching existing code style - Routing is a simple `mode` state variable in `App.svelte` (no SvelteKit, no router library) - Unknown widget types in Canvas render as grey dashed placeholder boxes (forward-compatible) +- **Frontend build pipeline migrated from npm/Vite/Svelte → pure Go (esbuild API + Preact):** Svelte components rewritten as `.tsx` Preact components; `tools/buildfrontend/main.go` bundles `web/src/main.tsx` via `github.com/evanw/esbuild`; vendor libraries (Preact, uPlot, ECharts) committed as ESM files in `web/vendor/`; `//go:generate go run ../tools/buildfrontend/main.go` in `web/embed.go`; `make frontend` now runs `go generate ./web/...` — no Node/npm required --- -## Phase 5 — View Mode Widgets +## Phase 5 — View Mode Widgets ✅ **Goal:** all widget types rendered and interactive in view mode. -- [ ] Text view widget -- [ ] Gauge widget (SVG arc, configurable range/thresholds) -- [ ] Vertical / horizontal bar widget -- [ ] LED widget (condition evaluator, configurable colours) -- [ ] Multi-LED widget (bitset, per-bit labels) -- [ ] Set-value widget (input + Set button; sends `write` over WS) -- [ ] Button widget (sends fixed value on click) -- [ ] Plot widget: - - Time-series (uPlot, streaming buffer of N points) - - FFT, waterfall, histogram, bar chart, logic analyser (ECharts) - - Multi-signal support; legend -- [ ] Text label (static) -- [ ] Image widget (base64 or server URL) -- [ ] Link widget (navigates to another interface) -- [ ] Right-click context menu: signal info dialog, copy name, export CSV -- [ ] Svelte component tests for each widget type (mock store) +- [x] Text view widget (`TextView.tsx`) — live value + quality dot + unit +- [x] Gauge widget (`Gauge.tsx`) — SVG arc, configurable range/thresholds, colour zones +- [x] Horizontal / vertical bar widget (`BarH.tsx`, `BarV.tsx`) +- [x] LED widget (`Led.tsx`) — condition evaluator, configurable colours, blink on uncertain quality +- [x] Multi-LED widget (`MultiLed.tsx`) — bitset, per-bit labels and colours +- [x] Set-value widget (`SetValue.tsx`) — input + Set button; sends `write` over WS +- [x] Button widget (`Button.tsx`) — sends fixed value on click, optional confirm dialog +- [x] Plot widget (`PlotWidget.tsx`): + - Time-series (uPlot, streaming ring buffer, dark axis styling) + - Histogram, bar chart, FFT, waterfall, logic analyser (ECharts) + - Multi-signal support; legend; ResizeObserver-based resize +- [x] Text label (`TextLabel.tsx`) — static text, configurable font size/colour/align +- [x] Image widget (`ImageWidget.tsx`) — renders image from URL, configurable object-fit +- [x] Link widget (`LinkWidget.tsx`) — navigates to another interface via `onNavigate` callback +- [x] Right-click context menu — signal info, copy signal name, export CSV stub +- [ ] Component tests (deferred to Phase 10 hardening) -**Done when:** a complete HMI panel with multiple widget types runs smoothly at 60 fps. +**Done when:** a complete HMI panel with multiple widget types runs smoothly at 60 fps. ✅ + +**Notes:** +- Frontend build pipeline migrated to pure Go (esbuild + Preact); no npm/Node required +- `Canvas.tsx` dispatches `onNavigate(interfaceId)` → `ViewMode.tsx` → `GET /api/v1/interfaces/{id}` +- Plot widget uses static imports (not `await import()`) to avoid async race with signal subscriptions --- -## Phase 6 — Edit Mode (Core) +## Phase 6 — Edit Mode (Core) ✅ **Goal:** users can build and save an interface from scratch. -- [ ] Konva stage setup in edit mode; `devicePixelRatio` scaling -- [ ] Widget renderer adapter: same widget components rendered on Konva layer -- [ ] Signal tree pane: fetch signal list, tree display, filter/search -- [ ] Drag signal from tree → drop on canvas → widget type picker -- [ ] Place widget at drop coordinates with default size -- [ ] Single selection: bounding box + resize handles via Konva `Transformer` -- [ ] Move widget by dragging body -- [ ] Delete widget (× button or Del key) -- [ ] Properties pane: common options (label, position, size) -- [ ] Per-widget property editors (range, colour, plot type, etc.) -- [ ] Save interface to server (POST/PUT XML) -- [ ] Load interface from server (GET XML, populate canvas) -- [ ] Export / import local XML file +- [x] `internal/storage/store.go` — file-based XML storage (`{storage_dir}/interfaces/`) +- [x] Interface CRUD REST endpoints: `GET/POST /interfaces`, `GET/PUT/DELETE/POST(clone) /interfaces/{id}` +- [x] Signal tree pane (`SignalTree.tsx`): fetches all DS/signal lists, collapsible groups, filter/search, drag source +- [x] Drag signal from tree → drop on canvas → `WidgetTypePicker` popup (12 widget types) +- [x] Place widget at drop coordinates with type-appropriate default size +- [x] `EditCanvas.tsx`: widget live-preview + transparent overlay divs for interaction; pure DOM mouse events (no Konva) +- [x] Single selection: 2px blue bounding box + 8 resize handles (N/S/E/W/NE/NW/SE/SW) +- [x] Move widget by dragging body; resize by dragging handles +- [x] Delete widget (✕ button on selection or Del/Backspace key) +- [x] `PropertiesPane.tsx`: canvas size/name + per-widget position/size/signal/options; type-specific fields +- [x] Save interface to server (POST creates, PUT updates; XML body) +- [x] Export / import local XML file +- [x] Edit mode toolbar: name editor, dirty indicator, Save/Export/Import/Close buttons +- [x] InterfaceList shows server-persisted interfaces with click-to-view, edit/clone/delete actions +- [x] Edit button enabled in view mode toolbar -**Done when:** an engineer can create a panel with 5+ widgets, save it, reload it, and see live data. +**Done when:** an engineer can create a panel with 5+ widgets, save it, reload it, and see live data. ✅ + +**Notes:** +- Pure DOM drag/resize (no Konva): overlay `div` per widget, `document.addEventListener('mousemove/mouseup')` during drag/resize +- HTML5 drag-and-drop transfers `SignalRef` JSON via `dataTransfer` +- `serializeInterface()` in `xml.ts` serializes `Interface` → XML; `parseInterface()` deserializes back +- Storage IDs are slugified names; uniqueness guaranteed by millisecond timestamp suffix +- No Konva dependency — Konva deferred to Phase 7 if multi-select area-select is needed --- @@ -273,10 +293,10 @@ These are rough single-developer estimates. Parallel work across backend and fro | 0 | 1–2 days | ✅ Complete | | 1 | 3–5 days | ✅ Complete | | 2 | 1–2 weeks | ✅ Complete | -| 3 | 1–2 weeks | — | +| 3 | 1–2 weeks | ✅ Complete | | 4 | 3–5 days | ✅ Complete | -| 5 | 2–3 weeks | — | -| 6 | 2–3 weeks | — | +| 5 | 2–3 weeks | ✅ Complete | +| 6 | 2–3 weeks | ✅ Complete | | 7 | 1–2 weeks | — | | 8 | 1 week | — | | 9 | 1 week | — | diff --git a/go.mod b/go.mod index f4a713a..3d74a13 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,8 @@ go 1.26.2 require ( github.com/BurntSushi/toml v1.6.0 github.com/coder/websocket v1.8.14 + github.com/evanw/esbuild v0.28.0 + github.com/yuin/gopher-lua v1.1.2 ) -require ( - github.com/yuin/gopher-lua v1.1.2 // indirect - gonum.org/v1/gonum v0.17.0 // indirect -) +require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect diff --git a/go.sum b/go.sum index 952d909..d154f28 100644 --- a/go.sum +++ b/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= +github.com/evanw/esbuild v0.28.0 h1:V96ghtc5p5JnNUQIUsc5H3kr+AcFcMqOJll2ZmJW6Lo= +github.com/evanw/esbuild v0.28.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/yuin/gopher-lua v1.1.2 h1:yF/FjE3hD65tBbt0VXLE13HWS9h34fdzJmrWRXwobGA= github.com/yuin/gopher-lua v1.1.2/go.mod h1:7aRmXIWl37SqRf0koeyylBEzJ+aPt8A+mmkQ4f1ntR8= -gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= -gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/api/api.go b/internal/api/api.go index 914ec4f..bfbcb92 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -3,22 +3,28 @@ package api import ( "encoding/json" + "errors" + "io" "log/slog" "net/http" "github.com/uopi/uopi/internal/broker" "github.com/uopi/uopi/internal/datasource" + "github.com/uopi/uopi/internal/datasource/synthetic" + "github.com/uopi/uopi/internal/storage" ) // Handler holds the dependencies shared across all API endpoints. type Handler struct { - broker *broker.Broker - log *slog.Logger + broker *broker.Broker + synthetic *synthetic.Synthetic // nil if not enabled + store *storage.Store + log *slog.Logger } -// New creates an API Handler. -func New(b *broker.Broker, log *slog.Logger) *Handler { - return &Handler{broker: b, log: log} +// New creates an API Handler. synth may be nil if the synthetic DS is disabled. +func New(b *broker.Broker, synth *synthetic.Synthetic, store *storage.Store, log *slog.Logger) *Handler { + return &Handler{broker: b, synthetic: synth, store: store, log: log} } // Register mounts all API routes onto mux under the given prefix. @@ -32,6 +38,10 @@ func (h *Handler) Register(mux *http.ServeMux, prefix string) { mux.HandleFunc("PUT "+prefix+"/interfaces/{id}", h.updateInterface) mux.HandleFunc("DELETE "+prefix+"/interfaces/{id}", h.deleteInterface) mux.HandleFunc("POST "+prefix+"/interfaces/{id}/clone", h.cloneInterface) + // Synthetic signal CRUD + mux.HandleFunc("GET "+prefix+"/synthetic", h.listSynthetic) + mux.HandleFunc("POST "+prefix+"/synthetic", h.createSynthetic) + mux.HandleFunc("DELETE "+prefix+"/synthetic/{name}", h.deleteSynthetic) } // ── /datasources ────────────────────────────────────────────────────────────── @@ -91,30 +101,145 @@ func (h *Handler) listSignals(w http.ResponseWriter, r *http.Request) { } // ── /interfaces ─────────────────────────────────────────────────────────────── -// Stub implementations — full persistence lands in Phase 6. func (h *Handler) listInterfaces(w http.ResponseWriter, r *http.Request) { - jsonOK(w, []any{}) + list, err := h.store.List() + if err != nil { + h.log.Error("list interfaces", "err", err) + jsonError(w, http.StatusInternalServerError, err.Error()) + return + } + jsonOK(w, list) } func (h *Handler) createInterface(w http.ResponseWriter, r *http.Request) { - jsonError(w, http.StatusNotImplemented, "interface storage not yet implemented") + body, err := io.ReadAll(io.LimitReader(r.Body, 4<<20)) + if err != nil { + jsonError(w, http.StatusBadRequest, "read body: "+err.Error()) + return + } + id, err := h.store.Create(body) + if err != nil { + h.log.Error("create interface", "err", err) + jsonError(w, http.StatusBadRequest, err.Error()) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + _ = json.NewEncoder(w).Encode(map[string]string{"id": id}) } func (h *Handler) getInterface(w http.ResponseWriter, r *http.Request) { - jsonError(w, http.StatusNotFound, "interface not found") + id := r.PathValue("id") + data, err := h.store.Get(id) + if err != nil { + if errors.Is(err, storage.ErrNotFound) { + jsonError(w, http.StatusNotFound, "interface not found: "+id) + } else { + jsonError(w, http.StatusInternalServerError, err.Error()) + } + return + } + w.Header().Set("Content-Type", "application/xml") + _, _ = w.Write(data) } func (h *Handler) updateInterface(w http.ResponseWriter, r *http.Request) { - jsonError(w, http.StatusNotImplemented, "interface storage not yet implemented") + id := r.PathValue("id") + body, err := io.ReadAll(io.LimitReader(r.Body, 4<<20)) + if err != nil { + jsonError(w, http.StatusBadRequest, "read body: "+err.Error()) + return + } + if err := h.store.Update(id, body); err != nil { + if errors.Is(err, storage.ErrNotFound) { + jsonError(w, http.StatusNotFound, "interface not found: "+id) + } else { + h.log.Error("update interface", "id", id, "err", err) + jsonError(w, http.StatusInternalServerError, err.Error()) + } + return + } + w.WriteHeader(http.StatusNoContent) } func (h *Handler) deleteInterface(w http.ResponseWriter, r *http.Request) { - jsonError(w, http.StatusNotImplemented, "interface storage not yet implemented") + id := r.PathValue("id") + if err := h.store.Delete(id); err != nil { + if errors.Is(err, storage.ErrNotFound) { + jsonError(w, http.StatusNotFound, "interface not found: "+id) + } else { + jsonError(w, http.StatusInternalServerError, err.Error()) + } + return + } + w.WriteHeader(http.StatusNoContent) } func (h *Handler) cloneInterface(w http.ResponseWriter, r *http.Request) { - jsonError(w, http.StatusNotImplemented, "interface storage not yet implemented") + id := r.PathValue("id") + newID, err := h.store.Clone(id) + if err != nil { + if errors.Is(err, storage.ErrNotFound) { + jsonError(w, http.StatusNotFound, "interface not found: "+id) + } else { + h.log.Error("clone interface", "id", id, "err", err) + jsonError(w, http.StatusInternalServerError, err.Error()) + } + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + _ = json.NewEncoder(w).Encode(map[string]string{"id": newID}) +} + +// ── /synthetic ──────────────────────────────────────────────────────────────── + +func (h *Handler) listSynthetic(w http.ResponseWriter, _ *http.Request) { + if h.synthetic == nil { + jsonOK(w, []any{}) + return + } + jsonOK(w, h.synthetic.GetDefs()) +} + +func (h *Handler) createSynthetic(w http.ResponseWriter, r *http.Request) { + if h.synthetic == nil { + jsonError(w, http.StatusServiceUnavailable, "synthetic data source not enabled") + return + } + var def synthetic.SignalDef + if err := json.NewDecoder(r.Body).Decode(&def); err != nil { + jsonError(w, http.StatusBadRequest, "invalid JSON: "+err.Error()) + return + } + if err := h.synthetic.AddSignal(def); err != nil { + if errors.Is(err, datasource.ErrNotFound) { + jsonError(w, http.StatusConflict, err.Error()) + } else { + jsonError(w, http.StatusBadRequest, err.Error()) + } + return + } + w.WriteHeader(http.StatusCreated) + jsonOK(w, def) +} + +func (h *Handler) deleteSynthetic(w http.ResponseWriter, r *http.Request) { + if h.synthetic == nil { + jsonError(w, http.StatusServiceUnavailable, "synthetic data source not enabled") + return + } + name := r.PathValue("name") + if err := h.synthetic.RemoveSignal(name); err != nil { + if errors.Is(err, datasource.ErrNotFound) { + jsonError(w, http.StatusNotFound, "synthetic signal not found: "+name) + } else { + jsonError(w, http.StatusInternalServerError, err.Error()) + } + return + } + w.WriteHeader(http.StatusNoContent) } // ── Helpers ─────────────────────────────────────────────────────────────────── diff --git a/internal/datasource/synthetic/definition.go b/internal/datasource/synthetic/definition.go new file mode 100644 index 0000000..45894f4 --- /dev/null +++ b/internal/datasource/synthetic/definition.go @@ -0,0 +1,34 @@ +// Package synthetic implements a DataSource that computes signals from +// existing upstream signals by running them through configurable DSP pipelines. +package synthetic + +// SignalDef describes one synthetic signal. +type SignalDef struct { + Name string `json:"name"` + DS string `json:"ds"` // upstream data source name + Signal string `json:"signal"` // upstream signal name (or "" for constant) + Inputs []InputRef `json:"inputs"` // alternative multi-input format + Pipeline []NodeDef `json:"pipeline"` // ordered list of DSP nodes + Meta MetaOverride `json:"meta"` // optional metadata overrides +} + +// InputRef names one upstream signal used as input to the pipeline. +type InputRef struct { + DS string `json:"ds"` + Signal string `json:"signal"` +} + +// NodeDef is a single node in the pipeline. +type NodeDef struct { + Type string `json:"type"` + Params map[string]any `json:"params,omitempty"` +} + +// MetaOverride allows the synthetic signal to override display metadata. +type MetaOverride struct { + Unit string `json:"unit,omitempty"` + Description string `json:"description,omitempty"` + DisplayLow float64 `json:"displayLow,omitempty"` + DisplayHigh float64 `json:"displayHigh,omitempty"` + Writable bool `json:"writable,omitempty"` +} diff --git a/internal/datasource/synthetic/dsp_bridge.go b/internal/datasource/synthetic/dsp_bridge.go new file mode 100644 index 0000000..b46ef0b --- /dev/null +++ b/internal/datasource/synthetic/dsp_bridge.go @@ -0,0 +1,108 @@ +package synthetic + +import ( + "fmt" + + "github.com/uopi/uopi/internal/dsp" +) + +// floatParam extracts a float64 from params; returns 0 if missing or wrong type. +func floatParam(params map[string]any, key string) float64 { + if params == nil { + return 0 + } + v, ok := params[key] + if !ok { + return 0 + } + f, ok := v.(float64) + if !ok { + return 0 + } + return f +} + +// stringParam extracts a string from params; returns "" if missing or wrong type. +func stringParam(params map[string]any, key string) string { + if params == nil { + return "" + } + v, ok := params[key] + if !ok { + return "" + } + s, ok := v.(string) + if !ok { + return "" + } + return s +} + +// BuildPipeline converts a []NodeDef (from JSON) into a []dsp.Node ready for +// execution. JSON numbers are float64, so all numeric params are handled as +// float64 regardless of the final type needed. +func BuildPipeline(defs []NodeDef) ([]dsp.Node, error) { + nodes := make([]dsp.Node, 0, len(defs)) + for i, d := range defs { + n, err := buildNode(d) + if err != nil { + return nil, fmt.Errorf("pipeline node %d (%q): %w", i, d.Type, err) + } + nodes = append(nodes, n) + } + return nodes, nil +} + +func buildNode(d NodeDef) (dsp.Node, error) { + p := d.Params + switch d.Type { + case "gain": + return &dsp.GainNode{Gain: floatParam(p, "gain")}, nil + + case "offset": + return &dsp.OffsetNode{Offset: floatParam(p, "offset")}, nil + + case "add": + return &dsp.AddNode{}, nil + + case "subtract": + return &dsp.SubtractNode{}, nil + + case "multiply": + return &dsp.MultiplyNode{}, nil + + case "divide": + return &dsp.DivideNode{}, nil + + case "moving_average": + return &dsp.MovingAverageNode{Window: max(1, int(floatParam(p, "window")))}, nil + + case "rms": + return &dsp.RMSNode{Window: max(1, int(floatParam(p, "window")))}, nil + + case "derivative": + return &dsp.DerivativeNode{}, nil + + case "clamp": + return &dsp.ClampNode{ + Min: floatParam(p, "min"), + Max: floatParam(p, "max"), + }, nil + + case "threshold": + return &dsp.ThresholdNode{ + Threshold: floatParam(p, "threshold"), + High: floatParam(p, "high"), + Low: floatParam(p, "low"), + }, nil + + case "expr": + return &dsp.ExprNode{Expr: stringParam(p, "expr")}, nil + + case "lua": + return &dsp.LuaNode{Script: stringParam(p, "script")}, nil + + default: + return nil, fmt.Errorf("unknown node type %q", d.Type) + } +} diff --git a/internal/datasource/synthetic/synthetic.go b/internal/datasource/synthetic/synthetic.go new file mode 100644 index 0000000..485e014 --- /dev/null +++ b/internal/datasource/synthetic/synthetic.go @@ -0,0 +1,451 @@ +package synthetic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "log/slog" + "os" + "path/filepath" + "sync" + "time" + + "github.com/uopi/uopi/internal/broker" + "github.com/uopi/uopi/internal/datasource" + "github.com/uopi/uopi/internal/dsp" +) + +const definitionsFile = "synthetic.json" + +// signalState holds everything needed to run one synthetic signal. +type signalState struct { + def SignalDef + nodes []dsp.Node + states []map[string]any // one map per node, persistent across calls + + // cancel stops the goroutine driving this signal. + cancel context.CancelFunc +} + +// Synthetic is a DataSource that computes values from upstream signals via +// configurable DSP pipelines. +type Synthetic struct { + brk *broker.Broker + storePath string + log *slog.Logger + + mu sync.RWMutex + signals map[string]*signalState + + // root context provided by Connect; used to start per-signal goroutines. + ctx context.Context +} + +// New creates a Synthetic data source. storePath is the directory where +// synthetic.json is stored. brk is used to subscribe to upstream signals. +func New(storePath string, brk *broker.Broker, log *slog.Logger) *Synthetic { + return &Synthetic{ + brk: brk, + storePath: storePath, + log: log, + signals: make(map[string]*signalState), + } +} + +// Name implements datasource.DataSource. +func (s *Synthetic) Name() string { return "synthetic" } + +// Connect loads the definitions file and starts all signal goroutines. +func (s *Synthetic) Connect(ctx context.Context) error { + s.ctx = ctx + + defs, err := s.loadDefs() + if err != nil { + return fmt.Errorf("synthetic: load definitions: %w", err) + } + + for _, def := range defs { + if err := s.startSignal(def); err != nil { + s.log.Warn("synthetic: failed to start signal", "name", def.Name, "err", err) + } + } + return nil +} + +// ListSignals returns metadata for all defined synthetic signals. +func (s *Synthetic) ListSignals(_ context.Context) ([]datasource.Metadata, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + out := make([]datasource.Metadata, 0, len(s.signals)) + for _, st := range s.signals { + out = append(out, defToMetadata(st.def)) + } + return out, nil +} + +// GetMetadata returns metadata for a single named signal. +func (s *Synthetic) GetMetadata(_ context.Context, signal string) (datasource.Metadata, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + st, ok := s.signals[signal] + if !ok { + return datasource.Metadata{}, datasource.ErrNotFound + } + return defToMetadata(st.def), nil +} + +// Subscribe registers ch to receive computed values for the named signal. +// Values are pushed whenever an upstream signal changes. +func (s *Synthetic) Subscribe(ctx context.Context, signal string, ch chan<- datasource.Value) (datasource.CancelFunc, error) { + s.mu.RLock() + st, ok := s.signals[signal] + s.mu.RUnlock() + if !ok { + return nil, datasource.ErrNotFound + } + + // Collect the upstream references for this signal. + refs := upstreamRefs(st.def) + if len(refs) == 0 { + return nil, fmt.Errorf("synthetic: signal %q has no upstream inputs", signal) + } + + ctx, cancel := context.WithCancel(ctx) + + go func() { + defer cancel() + + // Latest value per upstream input index. + latest := make([]float64, len(refs)) + ready := make([]bool, len(refs)) + + // Subscribe to every upstream ref via the broker. + updateCh := make(chan indexedUpdate, 32*len(refs)) + + unsubs := make([]func(), 0, len(refs)) + for i, ref := range refs { + idx := i // capture + perCh := make(chan broker.Update, 16) + unsub, err := s.brk.Subscribe(ref, perCh) + if err != nil { + s.log.Warn("synthetic: upstream subscribe failed", + "signal", signal, "upstream", ref, "err", err) + // Continue; the slot will stay at zero. + } else { + unsubs = append(unsubs, unsub) + go func() { + for { + select { + case u, ok := <-perCh: + if !ok { + return + } + val := toFloat64(u.Value.Data) + select { + case updateCh <- indexedUpdate{idx: idx, val: val, ts: u.Value.Timestamp}: + default: + } + case <-ctx.Done(): + return + } + } + }() + } + } + + defer func() { + for _, unsub := range unsubs { + unsub() + } + }() + + for { + select { + case <-ctx.Done(): + return + + case upd := <-updateCh: + latest[upd.idx] = upd.val + ready[upd.idx] = true + + // Only compute once we have at least one value for every input. + allReady := true + for _, r := range ready { + if !r { + allReady = false + break + } + } + if !allReady { + continue + } + + // Run the pipeline. + s.mu.RLock() + cur, stillExists := s.signals[signal] + s.mu.RUnlock() + if !stillExists { + return + } + + result, err := runPipeline(cur.nodes, cur.states, latest) + if err != nil { + s.log.Warn("synthetic: pipeline error", "signal", signal, "err", err) + continue + } + + v := datasource.Value{ + Timestamp: upd.ts, + Data: result, + Quality: datasource.QualityGood, + } + select { + case ch <- v: + case <-ctx.Done(): + return + } + } + } + }() + + return datasource.CancelFunc(cancel), nil +} + +// Write is not supported for synthetic signals. +func (s *Synthetic) Write(_ context.Context, _ string, _ any) error { + return datasource.ErrNotWritable +} + +// History is not supported for synthetic signals. +func (s *Synthetic) History(_ context.Context, _ string, _, _ time.Time, _ int) ([]datasource.Value, error) { + return nil, datasource.ErrHistoryUnavailable +} + +// AddSignal adds a new synthetic signal definition at runtime and persists it. +func (s *Synthetic) AddSignal(def SignalDef) error { + if def.Name == "" { + return errors.New("signal name must not be empty") + } + + nodes, err := BuildPipeline(def.Pipeline) + if err != nil { + return fmt.Errorf("build pipeline: %w", err) + } + + s.mu.Lock() + if _, exists := s.signals[def.Name]; exists { + s.mu.Unlock() + return fmt.Errorf("signal %q already exists", def.Name) + } + + states := make([]map[string]any, len(nodes)) + for i := range states { + states[i] = make(map[string]any) + } + + st := &signalState{ + def: def, + nodes: nodes, + states: states, + } + s.signals[def.Name] = st + s.mu.Unlock() + + if err := s.saveDefs(); err != nil { + // Roll back the in-memory addition. + s.mu.Lock() + delete(s.signals, def.Name) + s.mu.Unlock() + return fmt.Errorf("persist definitions: %w", err) + } + + return nil +} + +// RemoveSignal removes a synthetic signal definition at runtime and persists. +func (s *Synthetic) RemoveSignal(name string) error { + s.mu.Lock() + st, ok := s.signals[name] + if !ok { + s.mu.Unlock() + return datasource.ErrNotFound + } + // Stop the goroutine if it is running. + if st.cancel != nil { + st.cancel() + } + delete(s.signals, name) + s.mu.Unlock() + + if err := s.saveDefs(); err != nil { + return fmt.Errorf("persist definitions: %w", err) + } + return nil +} + +// GetDefs returns a copy of all current signal definitions (for the REST API). +func (s *Synthetic) GetDefs() []SignalDef { + s.mu.RLock() + defer s.mu.RUnlock() + + out := make([]SignalDef, 0, len(s.signals)) + for _, st := range s.signals { + out = append(out, st.def) + } + return out +} + +// ── internal helpers ────────────────────────────────────────────────────────── + +func (s *Synthetic) defsFilePath() string { + return filepath.Join(s.storePath, definitionsFile) +} + +func (s *Synthetic) loadDefs() ([]SignalDef, error) { + path := s.defsFilePath() + data, err := os.ReadFile(path) + if errors.Is(err, os.ErrNotExist) { + // Create an empty definitions file. + if werr := os.WriteFile(path, []byte("[]\n"), 0o644); werr != nil { + s.log.Warn("synthetic: could not create empty definitions file", "path", path, "err", werr) + } + return nil, nil + } + if err != nil { + return nil, err + } + + var defs []SignalDef + if err := json.Unmarshal(data, &defs); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + return defs, nil +} + +func (s *Synthetic) saveDefs() error { + s.mu.RLock() + defs := make([]SignalDef, 0, len(s.signals)) + for _, st := range s.signals { + defs = append(defs, st.def) + } + s.mu.RUnlock() + + data, err := json.MarshalIndent(defs, "", " ") + if err != nil { + return err + } + return os.WriteFile(s.defsFilePath(), data, 0o644) +} + +// startSignal builds the pipeline for def and registers the signalState. +// The actual goroutines are started lazily by Subscribe. +func (s *Synthetic) startSignal(def SignalDef) error { + nodes, err := BuildPipeline(def.Pipeline) + if err != nil { + return fmt.Errorf("build pipeline for %q: %w", def.Name, err) + } + + states := make([]map[string]any, len(nodes)) + for i := range states { + states[i] = make(map[string]any) + } + + s.mu.Lock() + s.signals[def.Name] = &signalState{ + def: def, + nodes: nodes, + states: states, + } + s.mu.Unlock() + + s.log.Info("synthetic: signal registered", "name", def.Name) + return nil +} + +// runPipeline executes all nodes in sequence. The output of node N becomes +// input[0] of node N+1. For the first node, inputs is the full upstream slice. +func runPipeline(nodes []dsp.Node, states []map[string]any, inputs []float64) (float64, error) { + if len(nodes) == 0 { + if len(inputs) == 0 { + return 0, nil + } + return inputs[0], nil + } + + // First node receives all upstream inputs. + cur := inputs + var result float64 + var err error + + for i, node := range nodes { + result, err = node.Process(cur, states[i]) + if err != nil { + return 0, fmt.Errorf("node %d (%s): %w", i, node.Type(), err) + } + // Subsequent nodes receive only the single output of the previous node. + cur = []float64{result} + } + return result, nil +} + +// upstreamRefs returns the broker.SignalRef list for a SignalDef. +// If Inputs is set, those take precedence; otherwise DS+Signal is used. +func upstreamRefs(def SignalDef) []broker.SignalRef { + if len(def.Inputs) > 0 { + refs := make([]broker.SignalRef, len(def.Inputs)) + for i, inp := range def.Inputs { + refs[i] = broker.SignalRef{DS: inp.DS, Name: inp.Signal} + } + return refs + } + if def.DS != "" && def.Signal != "" { + return []broker.SignalRef{{DS: def.DS, Name: def.Signal}} + } + return nil +} + +// defToMetadata converts a SignalDef into a datasource.Metadata. +func defToMetadata(def SignalDef) datasource.Metadata { + return datasource.Metadata{ + Name: def.Name, + Type: datasource.TypeFloat64, + Unit: def.Meta.Unit, + Description: def.Meta.Description, + DisplayLow: def.Meta.DisplayLow, + DisplayHigh: def.Meta.DisplayHigh, + Writable: def.Meta.Writable, + } +} + +// toFloat64 coerces any numeric value from a datasource.Value.Data to float64. +func toFloat64(v any) float64 { + switch val := v.(type) { + case float64: + return val + case float32: + return float64(val) + case int64: + return float64(val) + case int32: + return float64(val) + case int: + return float64(val) + case bool: + if val { + return 1 + } + return 0 + default: + return 0 + } +} + +// indexedUpdate carries a value from one upstream goroutine to the pipeline runner. +type indexedUpdate struct { + idx int + val float64 + ts time.Time +} diff --git a/internal/datasource/synthetic/synthetic_test.go b/internal/datasource/synthetic/synthetic_test.go new file mode 100644 index 0000000..1af7a5c --- /dev/null +++ b/internal/datasource/synthetic/synthetic_test.go @@ -0,0 +1,259 @@ +package synthetic + +import ( + "context" + "log/slog" + "os" + "path/filepath" + "testing" + "time" + + "github.com/uopi/uopi/internal/broker" + "github.com/uopi/uopi/internal/datasource" +) + +func newTestSynthetic(t *testing.T) (*Synthetic, *broker.Broker, context.CancelFunc) { + t.Helper() + dir := t.TempDir() + log := slog.New(slog.NewTextHandler(os.Stderr, nil)) + ctx, cancel := context.WithCancel(context.Background()) + brk := broker.New(ctx, log) + syn := New(dir, brk, log) + return syn, brk, cancel +} + +// TestNameAndConnect verifies basic construction and Connect. +func TestNameAndConnect(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if syn.Name() != "synthetic" { + t.Errorf("Name: want %q, got %q", "synthetic", syn.Name()) + } + + ctx := context.Background() + if err := syn.Connect(ctx); err != nil { + t.Fatalf("Connect: %v", err) + } +} + +// TestConnectCreatesEmptyFile verifies that Connect creates an empty +// synthetic.json when none exists. +func TestConnectCreatesEmptyFile(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + path := filepath.Join(syn.storePath, "synthetic.json") + data, err := os.ReadFile(path) + if err != nil { + t.Fatalf("expected file to be created: %v", err) + } + if string(data) == "" { + t.Error("file should not be empty") + } +} + +// TestAddAndRemoveSignal exercises CRUD at runtime. +func TestAddAndRemoveSignal(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + def := SignalDef{ + Name: "test_gain", + DS: "stub", + Signal: "sine_1hz", + Pipeline: []NodeDef{ + {Type: "gain", Params: map[string]any{"gain": 2.0}}, + }, + Meta: MetaOverride{Unit: "V"}, + } + + if err := syn.AddSignal(def); err != nil { + t.Fatalf("AddSignal: %v", err) + } + + // Duplicate should fail. + if err := syn.AddSignal(def); err == nil { + t.Error("expected error for duplicate signal") + } + + // Should be listed. + metas, err := syn.ListSignals(context.Background()) + if err != nil { + t.Fatal(err) + } + if len(metas) != 1 || metas[0].Name != "test_gain" { + t.Errorf("unexpected metas: %v", metas) + } + + // GetMetadata should work. + meta, err := syn.GetMetadata(context.Background(), "test_gain") + if err != nil { + t.Fatalf("GetMetadata: %v", err) + } + if meta.Unit != "V" { + t.Errorf("unit: want V, got %q", meta.Unit) + } + + // Remove it. + if err := syn.RemoveSignal("test_gain"); err != nil { + t.Fatalf("RemoveSignal: %v", err) + } + + // Should be gone. + if _, err := syn.GetMetadata(context.Background(), "test_gain"); err != datasource.ErrNotFound { + t.Errorf("expected ErrNotFound after remove, got %v", err) + } + + // Remove non-existing should return ErrNotFound. + if err := syn.RemoveSignal("nonexistent"); err != datasource.ErrNotFound { + t.Errorf("expected ErrNotFound, got %v", err) + } +} + +// TestAddSignalEmptyName validates that empty name is rejected. +func TestAddSignalEmptyName(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + if err := syn.AddSignal(SignalDef{}); err == nil { + t.Error("expected error for empty signal name") + } +} + +// TestGetMetadataNotFound verifies ErrNotFound for unknown signal. +func TestGetMetadataNotFound(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + _, err := syn.GetMetadata(context.Background(), "no_such_signal") + if err != datasource.ErrNotFound { + t.Errorf("expected ErrNotFound, got %v", err) + } +} + +// TestWriteNotSupported ensures Write returns ErrNotWritable. +func TestWriteNotSupported(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + err := syn.Write(context.Background(), "any", 1.0) + if err != datasource.ErrNotWritable { + t.Errorf("expected ErrNotWritable, got %v", err) + } +} + +// TestHistoryNotSupported ensures History returns ErrHistoryUnavailable. +func TestHistoryNotSupported(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + _, err := syn.History(context.Background(), "any", time.Now(), time.Now(), 10) + if err != datasource.ErrHistoryUnavailable { + t.Errorf("expected ErrHistoryUnavailable, got %v", err) + } +} + +// TestPersistence verifies that definitions survive a restart (New+Connect). +func TestPersistence(t *testing.T) { + dir := t.TempDir() + log := slog.New(slog.NewTextHandler(os.Stderr, nil)) + + ctx, cancel := context.WithCancel(context.Background()) + brk := broker.New(ctx, log) + syn := New(dir, brk, log) + + if err := syn.Connect(ctx); err != nil { + t.Fatal(err) + } + + def := SignalDef{ + Name: "persisted", + DS: "stub", + Signal: "sine_1hz", + Pipeline: []NodeDef{ + {Type: "offset", Params: map[string]any{"offset": 5.0}}, + }, + } + if err := syn.AddSignal(def); err != nil { + t.Fatal(err) + } + cancel() + + // Reload. + ctx2 := t.Context() + brk2 := broker.New(ctx2, log) + syn2 := New(dir, brk2, log) + if err := syn2.Connect(ctx2); err != nil { + t.Fatal(err) + } + + meta, err := syn2.GetMetadata(ctx2, "persisted") + if err != nil { + t.Fatalf("after reload, GetMetadata: %v", err) + } + if meta.Name != "persisted" { + t.Errorf("expected name %q, got %q", "persisted", meta.Name) + } +} + +// TestSubscribeUnknownSignal verifies that subscribing to unknown signal returns error. +func TestSubscribeUnknownSignal(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + ch := make(chan datasource.Value, 1) + _, err := syn.Subscribe(context.Background(), "nonexistent", ch) + if err != datasource.ErrNotFound { + t.Errorf("expected ErrNotFound, got %v", err) + } +} + +// TestGetDefs verifies GetDefs returns current definitions. +func TestGetDefs(t *testing.T) { + syn, _, cancel := newTestSynthetic(t) + defer cancel() + + if err := syn.Connect(context.Background()); err != nil { + t.Fatal(err) + } + + defs := syn.GetDefs() + if len(defs) != 0 { + t.Errorf("expected empty defs, got %d", len(defs)) + } + + def := SignalDef{ + Name: "test", + DS: "stub", + Signal: "noise", + } + if err := syn.AddSignal(def); err != nil { + t.Fatal(err) + } + + defs = syn.GetDefs() + if len(defs) != 1 || defs[0].Name != "test" { + t.Errorf("unexpected defs: %v", defs) + } +} diff --git a/internal/server/server.go b/internal/server/server.go index e942c3e..1f4716a 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -9,6 +9,8 @@ import ( "github.com/uopi/uopi/internal/api" "github.com/uopi/uopi/internal/broker" + "github.com/uopi/uopi/internal/datasource/synthetic" + "github.com/uopi/uopi/internal/storage" ) const apiPrefix = "/api/v1" @@ -19,7 +21,8 @@ type Server struct { } // New creates the HTTP server, registers all routes, and returns a ready-to-start Server. -func New(addr string, webFS fs.FS, brk *broker.Broker, log *slog.Logger) *Server { +// synth may be nil if the synthetic data source is not enabled. +func New(addr string, webFS fs.FS, brk *broker.Broker, synth *synthetic.Synthetic, store *storage.Store, log *slog.Logger) *Server { mux := http.NewServeMux() // Health check @@ -32,7 +35,7 @@ func New(addr string, webFS fs.FS, brk *broker.Broker, log *slog.Logger) *Server mux.Handle("/ws", &wsHandler{broker: brk, log: log}) // REST API - api.New(brk, log).Register(mux, apiPrefix) + api.New(brk, synth, store, log).Register(mux, apiPrefix) // Embedded frontend — must be last (catch-all) mux.Handle("/", http.FileServerFS(webFS)) diff --git a/internal/storage/store.go b/internal/storage/store.go new file mode 100644 index 0000000..3c0a2d2 --- /dev/null +++ b/internal/storage/store.go @@ -0,0 +1,160 @@ +// Package storage provides file-based persistence for HMI interface definitions. +package storage + +import ( + "encoding/xml" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "time" +) + +// ErrNotFound is returned when the requested interface does not exist. +var ErrNotFound = errors.New("interface not found") + +// InterfaceMeta is the lightweight representation returned by List. +type InterfaceMeta struct { + ID string `json:"id"` + Name string `json:"name"` + Version int `json:"version"` +} + +// Store persists interface definitions as XML files under {storageDir}/interfaces/. +type Store struct { + dir string +} + +// New opens (and creates, if needed) the storage directory. +func New(storageDir string) (*Store, error) { + dir := filepath.Join(storageDir, "interfaces") + if err := os.MkdirAll(dir, 0o755); err != nil { + return nil, fmt.Errorf("create interfaces dir: %w", err) + } + return &Store{dir: dir}, nil +} + +func (s *Store) filePath(id string) string { + return filepath.Join(s.dir, id+".xml") +} + +// List returns metadata for every stored interface. +func (s *Store) List() ([]InterfaceMeta, error) { + entries, err := os.ReadDir(s.dir) + if err != nil { + return nil, err + } + var out []InterfaceMeta + for _, e := range entries { + if e.IsDir() || !strings.HasSuffix(e.Name(), ".xml") { + continue + } + id := strings.TrimSuffix(e.Name(), ".xml") + meta, err := s.readMeta(id) + if err != nil { + continue // skip corrupt files silently + } + out = append(out, meta) + } + if out == nil { + out = []InterfaceMeta{} + } + return out, nil +} + +// rootAttrs is used to parse only the top-level XML attributes. +type rootAttrs struct { + XMLName xml.Name `xml:"interface"` + ID string `xml:"id,attr"` + Name string `xml:"name,attr"` + Version int `xml:"version,attr"` +} + +func (s *Store) readMeta(id string) (InterfaceMeta, error) { + data, err := os.ReadFile(s.filePath(id)) + if err != nil { + return InterfaceMeta{}, err + } + var root rootAttrs + if err := xml.Unmarshal(data, &root); err != nil { + return InterfaceMeta{}, err + } + return InterfaceMeta{ID: id, Name: root.Name, Version: root.Version}, nil +} + +// Get returns the raw XML bytes for the interface with the given ID. +func (s *Store) Get(id string) ([]byte, error) { + data, err := os.ReadFile(s.filePath(id)) + if errors.Is(err, os.ErrNotExist) { + return nil, ErrNotFound + } + return data, err +} + +// Create stores new interface XML and returns the generated ID. +// The ID is derived from the name attribute; a timestamp suffix is added to +// ensure uniqueness. +func (s *Store) Create(xmlData []byte) (string, error) { + var root rootAttrs + if err := xml.Unmarshal(xmlData, &root); err != nil { + return "", fmt.Errorf("invalid XML: %w", err) + } + + id := root.ID + if id == "" { + id = slugify(root.Name) + } + // Guarantee uniqueness. + if _, err := os.Stat(s.filePath(id)); err == nil { + id = id + "-" + fmt.Sprintf("%d", time.Now().UnixMilli()) + } + return id, os.WriteFile(s.filePath(id), xmlData, 0o644) +} + +// Update replaces the XML for an existing interface. +func (s *Store) Update(id string, xmlData []byte) error { + if _, err := os.Stat(s.filePath(id)); errors.Is(err, os.ErrNotExist) { + return ErrNotFound + } + return os.WriteFile(s.filePath(id), xmlData, 0o644) +} + +// Delete removes the interface with the given ID. +func (s *Store) Delete(id string) error { + err := os.Remove(s.filePath(id)) + if errors.Is(err, os.ErrNotExist) { + return ErrNotFound + } + return err +} + +// Clone duplicates an interface, assigning a new unique ID. +func (s *Store) Clone(srcID string) (string, error) { + data, err := s.Get(srcID) + if err != nil { + return "", err + } + newID := srcID + "-copy-" + fmt.Sprintf("%d", time.Now().UnixMilli()) + return newID, os.WriteFile(s.filePath(newID), data, 0o644) +} + +// slugify converts a human-readable name into a URL-safe identifier. +func slugify(s string) string { + var b strings.Builder + for _, r := range strings.ToLower(s) { + switch { + case r >= 'a' && r <= 'z', r >= '0' && r <= '9': + b.WriteRune(r) + default: + if b.Len() > 0 && b.String()[b.Len()-1] != '-' { + b.WriteByte('-') + } + } + } + result := strings.Trim(b.String(), "-") + if result == "" { + return "interface" + } + return result +} diff --git a/synthetic.example.json b/synthetic.example.json new file mode 100644 index 0000000..c5165ca --- /dev/null +++ b/synthetic.example.json @@ -0,0 +1,29 @@ +[ + { + "name": "sine_1hz_gain2", + "ds": "stub", + "signal": "sine_1hz", + "pipeline": [ + { "type": "gain", "params": { "gain": 2.0 } } + ], + "meta": { "unit": "V", "description": "Sine 1Hz amplified x2", "displayLow": -2, "displayHigh": 2 } + }, + { + "name": "sine_avg10", + "ds": "stub", + "signal": "sine_1hz", + "pipeline": [ + { "type": "moving_average", "params": { "window": 10 } } + ], + "meta": { "unit": "V", "description": "10-sample moving average of sine_1hz", "displayLow": -1, "displayHigh": 1 } + }, + { + "name": "setpoint_clamped", + "ds": "stub", + "signal": "setpoint", + "pipeline": [ + { "type": "clamp", "params": { "min": 10, "max": 80 } } + ], + "meta": { "unit": "°C", "description": "Setpoint clamped to [10, 80]", "displayLow": 0, "displayHigh": 100 } + } +] diff --git a/tools/buildfrontend/main.go b/tools/buildfrontend/main.go new file mode 100644 index 0000000..4180d1f --- /dev/null +++ b/tools/buildfrontend/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/evanw/esbuild/pkg/api" +) + +func main() { + // Determine repo root. + // When invoked via `go generate` from web/, cwd is web/ so we look for go.mod + // to find the actual module root. + root, err := findModuleRoot() + if err != nil { + panic(err) + } + + // Verify vendor files exist + vendorFiles := []string{ + filepath.Join(root, "web", "vendor", "preact.mjs"), + filepath.Join(root, "web", "vendor", "preact-hooks.mjs"), + filepath.Join(root, "web", "vendor", "uplot.esm.js"), + filepath.Join(root, "web", "vendor", "uplot.css"), + filepath.Join(root, "web", "vendor", "echarts.esm.js"), + } + for _, f := range vendorFiles { + if _, err := os.Stat(f); os.IsNotExist(err) { + fmt.Fprintf(os.Stderr, "error: vendor file missing: %s\n", f) + fmt.Fprintf(os.Stderr, "Run the following to download vendor files:\n") + fmt.Fprintf(os.Stderr, " mkdir -p web/vendor\n") + fmt.Fprintf(os.Stderr, " curl -sL https://cdn.jsdelivr.net/npm/preact@10.24.3/dist/preact.module.js -o web/vendor/preact.mjs\n") + fmt.Fprintf(os.Stderr, " curl -sL https://cdn.jsdelivr.net/npm/preact@10.24.3/hooks/dist/hooks.module.js -o web/vendor/preact-hooks.mjs\n") + fmt.Fprintf(os.Stderr, " curl -sL https://cdn.jsdelivr.net/npm/uplot@1.6.32/dist/uPlot.esm.js -o web/vendor/uplot.esm.js\n") + fmt.Fprintf(os.Stderr, " curl -sL https://cdn.jsdelivr.net/npm/uplot@1.6.32/dist/uPlot.min.css -o web/vendor/uplot.css\n") + fmt.Fprintf(os.Stderr, " curl -sL https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.esm.min.js -o web/vendor/echarts.esm.js\n") + os.Exit(1) + } + } + + // Clean + create dist + distDir := filepath.Join(root, "web", "dist") + os.RemoveAll(distDir) + os.MkdirAll(distDir, 0o755) + + result := api.Build(api.BuildOptions{ + EntryPoints: []string{filepath.Join(root, "web", "src", "main.tsx")}, + Bundle: true, + Outdir: distDir, + Format: api.FormatESModule, + Target: api.ES2020, + JSX: api.JSXTransform, + JSXFactory: "h", + JSXFragment: "Fragment", + MinifyWhitespace: true, + MinifyIdentifiers: true, + MinifySyntax: true, + Alias: map[string]string{ + "preact": filepath.Join(root, "web", "vendor", "preact.mjs"), + "preact/hooks": filepath.Join(root, "web", "vendor", "preact-hooks.mjs"), + "uplot": filepath.Join(root, "web", "vendor", "uplot.esm.js"), + "echarts": filepath.Join(root, "web", "vendor", "echarts.esm.js"), + }, + Loader: map[string]api.Loader{ + ".css": api.LoaderCSS, + }, + Splitting: false, + Write: true, + LogLevel: api.LogLevelInfo, + }) + + if len(result.Errors) > 0 { + for _, e := range result.Errors { + fmt.Fprintf(os.Stderr, "error: %s\n", e.Text) + } + os.Exit(1) + } + + // Copy uPlot CSS and favicon + copyFile(filepath.Join(root, "web", "vendor", "uplot.css"), filepath.Join(distDir, "uplot.css")) + copyFile(filepath.Join(root, "web", "public", "favicon.svg"), filepath.Join(distDir, "favicon.svg")) + + // Write index.html + html := ` + + + + + uopi + + + + + +
+ + +` + os.WriteFile(filepath.Join(distDir, "index.html"), []byte(html), 0o644) + + fmt.Println("Frontend built successfully →", distDir) +} + +func copyFile(src, dst string) { + data, err := os.ReadFile(src) + if err != nil { + return // Skip if missing + } + os.WriteFile(dst, data, 0o644) +} + +// findModuleRoot walks up from cwd until it finds a go.mod file. +func findModuleRoot() (string, error) { + dir, err := os.Getwd() + if err != nil { + return "", err + } + for { + if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { + return dir, nil + } + parent := filepath.Dir(dir) + if parent == dir { + return "", fmt.Errorf("go.mod not found in any parent directory") + } + dir = parent + } +} diff --git a/uopi b/uopi new file mode 100755 index 0000000..4d84378 Binary files /dev/null and b/uopi differ diff --git a/web/README.md b/web/README.md deleted file mode 100644 index e6cd94f..0000000 --- a/web/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Svelte + TS + Vite - -This template should help get you started developing with Svelte and TypeScript in Vite. - -## Recommended IDE Setup - -[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). - -## Need an official Svelte framework? - -Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. - -## Technical considerations - -**Why use this over SvelteKit?** - -- It brings its own routing solution which might not be preferable for some users. -- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. - -This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. - -Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. - -**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** - -Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. - -**Why include `.vscode/extensions.json`?** - -Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. - -**Why enable `allowJs` in the TS template?** - -While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. - -**Why is HMR not preserving my local component state?** - -HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). - -If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. - -```ts -// store.ts -// An extremely simple external store -import { writable } from 'svelte/store' -export default writable(0) -``` diff --git a/web/embed.go b/web/embed.go index 17ffba9..7f6f355 100644 --- a/web/embed.go +++ b/web/embed.go @@ -1,5 +1,5 @@ -// Package web provides the embedded frontend assets built by Vite. -// Run `npm run build` inside the web/ directory before building the binary. +// Package web provides the embedded frontend assets. +// Run `make frontend` (or `make all`) to rebuild before compiling the binary. package web import "embed" diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 929c7a3..0000000 --- a/web/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - web - - -
- - - diff --git a/web/package-lock.json b/web/package-lock.json deleted file mode 100644 index 668134e..0000000 --- a/web/package-lock.json +++ /dev/null @@ -1,2505 +0,0 @@ -{ - "name": "web", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web", - "version": "0.0.0", - "dependencies": { - "echarts": "^6.0.0", - "uplot": "^1.6.32" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^7.0.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/svelte": "^5.3.1", - "@tsconfig/svelte": "^5.0.8", - "@types/node": "^24.12.2", - "jsdom": "^29.0.2", - "svelte": "^5.55.4", - "svelte-check": "^4.4.6", - "typescript": "~6.0.2", - "vite": "^8.0.10", - "vitest": "^4.1.5" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", - "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", - "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/generational-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", - "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", - "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", - "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.2.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", - "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", - "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", - "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", - "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", - "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", - "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", - "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", - "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", - "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", - "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", - "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.0.0.tgz", - "integrity": "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deepmerge": "^4.3.1", - "magic-string": "^0.30.21", - "obug": "^2.1.0", - "vitefu": "^1.1.2" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.46.4", - "vite": "^8.0.0-beta.7 || ^8.0.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/svelte": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-5.3.1.tgz", - "integrity": "sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@testing-library/dom": "9.x.x || 10.x.x", - "@testing-library/svelte-core": "1.0.0" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0", - "vite": "*", - "vitest": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@testing-library/svelte-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/svelte-core/-/svelte-core-1.0.0.tgz", - "integrity": "sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0" - } - }, - "node_modules/@tsconfig/svelte": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", - "integrity": "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", - "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", - "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.5", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", - "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", - "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.5", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", - "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.5", - "@vitest/utils": "4.1.5", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", - "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", - "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.5", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aria-query": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", - "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", - "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/echarts": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", - "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "2.3.0", - "zrender": "6.0.0" - } - }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, - "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.5.tgz", - "integrity": "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "peerDependencies": { - "@typescript-eslint/types": "^8.2.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/types": { - "optional": true - } - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", - "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.1.5", - "@asamuzakjp/dom-selector": "^7.0.6", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.1", - "@exodus/bytes": "^1.15.0", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7", - "parse5": "^8.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.1", - "undici": "^7.24.5", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.1", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", - "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.127.0", - "@rolldown/pluginutils": "1.0.0-rc.17" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.17", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", - "@rolldown/binding-darwin-x64": "1.0.0-rc.17", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svelte": { - "version": "5.55.5", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.5.tgz", - "integrity": "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "@types/trusted-types": "^2.0.7", - "acorn": "^8.12.1", - "aria-query": "5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "devalue": "^5.6.4", - "esm-env": "^1.2.1", - "esrap": "^2.2.4", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.6.tgz", - "integrity": "sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", - "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.0.28", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", - "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.28" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.0.28", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", - "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/uplot": { - "version": "1.6.32", - "resolved": "https://registry.npmjs.org/uplot/-/uplot-1.6.32.tgz", - "integrity": "sha512-KIMVnG68zvu5XXUbC4LQEPnhwOxBuLyW1AHtpm6IKTXImkbLgkMy+jabjLgSLMasNuGGzQm/ep3tOkyTxpiQIw==", - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", - "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.10", - "rolldown": "1.0.0-rc.17", - "tinyglobby": "^0.2.16" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", - "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", - "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.5", - "@vitest/mocker": "4.1.5", - "@vitest/pretty-format": "4.1.5", - "@vitest/runner": "4.1.5", - "@vitest/snapshot": "4.1.5", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.5", - "@vitest/browser-preview": "4.1.5", - "@vitest/browser-webdriverio": "4.1.5", - "@vitest/coverage-istanbul": "4.1.5", - "@vitest/coverage-v8": "4.1.5", - "@vitest/ui": "4.1.5", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/zrender": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", - "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", - "license": "BSD-3-Clause", - "dependencies": { - "tslib": "2.3.0" - } - }, - "node_modules/zrender/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - } - } -} diff --git a/web/package.json b/web/package.json deleted file mode 100644 index ffb3e03..0000000 --- a/web/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "web", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^7.0.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/svelte": "^5.3.1", - "@tsconfig/svelte": "^5.0.8", - "@types/node": "^24.12.2", - "jsdom": "^29.0.2", - "svelte": "^5.55.4", - "svelte-check": "^4.4.6", - "typescript": "~6.0.2", - "vite": "^8.0.10", - "vitest": "^4.1.5" - }, - "dependencies": { - "echarts": "^6.0.0", - "uplot": "^1.6.32" - } -} diff --git a/web/src/App.svelte b/web/src/App.svelte deleted file mode 100644 index 4479617..0000000 --- a/web/src/App.svelte +++ /dev/null @@ -1,66 +0,0 @@ - - -{#if $wsStatus === 'disconnected'} -
- WebSocket disconnected — reconnecting… -
-{/if} - -{#if mode === 'view'} - -{:else} - -{/if} - - diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 0000000..a61141d --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,47 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { wsClient } from './lib/ws'; +import ViewMode from './ViewMode'; +import EditMode from './EditMode'; +import type { Interface } from './lib/types'; + +type AppMode = 'view' | 'edit'; + +export default function App() { + const [mode, setMode] = useState('view'); + const [wsStatus, setWsStatus] = useState('connecting'); + const [editTarget, setEditTarget] = useState(null); + + useEffect(() => { + const unsub = wsClient.status.subscribe(setWsStatus); + return unsub; + }, []); + + useEffect(() => { + const dpr = window.devicePixelRatio ?? 1; + document.documentElement.style.setProperty('--dpr', String(dpr)); + wsClient.connect('/ws'); + }, []); + + function enterEdit(iface?: Interface) { + setEditTarget(iface ?? null); + setMode('edit'); + } + + function exitEdit() { + setMode('view'); + setEditTarget(null); + } + + return ( +
+ {wsStatus === 'disconnected' && ( +
WebSocket disconnected — reconnecting…
+ )} + {mode === 'view' + ? + : + } +
+ ); +} diff --git a/web/src/Canvas.tsx b/web/src/Canvas.tsx new file mode 100644 index 0000000..4bfc8ae --- /dev/null +++ b/web/src/Canvas.tsx @@ -0,0 +1,97 @@ +import { h } from 'preact'; +import { useState } from 'preact/hooks'; +import type { Interface, Widget, SignalRef } from './lib/types'; +import TextView from './widgets/TextView'; +import TextLabel from './widgets/TextLabel'; +import Gauge from './widgets/Gauge'; +import BarH from './widgets/BarH'; +import BarV from './widgets/BarV'; +import Led from './widgets/Led'; +import MultiLed from './widgets/MultiLed'; +import SetValue from './widgets/SetValue'; +import Button from './widgets/Button'; +import PlotWidget from './widgets/PlotWidget'; +import ImageWidget from './widgets/ImageWidget'; +import LinkWidget from './widgets/LinkWidget'; +import ContextMenu from './ContextMenu'; + +const COMPONENTS: Record = { + textview: TextView, + textlabel: TextLabel, + gauge: Gauge, + barh: BarH, + barv: BarV, + led: Led, + multiled: MultiLed, + setvalue: SetValue, + button: Button, + plot: PlotWidget, + image: ImageWidget, + link: LinkWidget, +}; + +interface CtxState { + visible: boolean; + x: number; + y: number; + signal: SignalRef | null; +} + +interface Props { + iface: Interface | null; + onNavigate?: (interfaceId: string) => void; +} + +export default function Canvas({ iface, onNavigate }: Props) { + const [ctxMenu, setCtxMenu] = useState({ + visible: false, x: 0, y: 0, signal: null, + }); + + function onCtxMenu(e: MouseEvent, widget: Widget) { + e.preventDefault(); + e.stopPropagation(); + setCtxMenu({ visible: true, x: e.clientX, y: e.clientY, signal: widget.signals[0] ?? null }); + } + + if (!iface) { + return ( +
+
+

Select an interface from the left panel, or import one.

+
+
+ ); + } + + return ( +
+
+ {iface.widgets.map(widget => { + const Comp = COMPONENTS[widget.type]; + return Comp + ? onCtxMenu(e, widget)} + onNavigate={onNavigate} + /> + : ( +
onCtxMenu(e, widget)} + > + {widget.type} +
+ ); + })} +
+ setCtxMenu(c => ({ ...c, visible: false }))} + /> +
+ ); +} diff --git a/web/src/ContextMenu.tsx b/web/src/ContextMenu.tsx new file mode 100644 index 0000000..decd45d --- /dev/null +++ b/web/src/ContextMenu.tsx @@ -0,0 +1,73 @@ +import { h } from 'preact'; +import { useEffect, useRef } from 'preact/hooks'; +import type { SignalRef, SignalMeta } from './lib/types'; +import { getMetaStore } from './lib/stores'; +import { useState } from 'preact/hooks'; + +interface Props { + visible: boolean; + x: number; + y: number; + signal: SignalRef | null; + onClose: () => void; +} + +export default function ContextMenu({ visible, x, y, signal, onClose }: Props) { + const [meta, setMeta] = useState(null); + const menuRef = useRef(null); + + useEffect(() => { + if (!signal) { setMeta(null); return; } + const unsub = getMetaStore(signal).subscribe(setMeta); + return unsub; + }, [signal?.ds, signal?.name]); + + useEffect(() => { + if (!visible) return; + function handleClick(e: MouseEvent) { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + onClose(); + } + } + document.addEventListener('mousedown', handleClick); + return () => document.removeEventListener('mousedown', handleClick); + }, [visible, onClose]); + + if (!visible) return null; + + function copySignalName() { + if (signal) { + navigator.clipboard.writeText(signal.name).catch(() => {}); + } + onClose(); + } + + function exportCSV() { + // Phase 5+: export CSV data + onClose(); + } + + return ( +
+ {signal ? ( +
+
+
{signal.ds} / {signal.name}
+ {meta && ( +
{meta.type}{meta.unit ? ` [${meta.unit}]` : ''}
+ )} +
+
+ + +
+ ) : ( + + )} +
+ ); +} diff --git a/web/src/EditCanvas.tsx b/web/src/EditCanvas.tsx new file mode 100644 index 0000000..34cbae5 --- /dev/null +++ b/web/src/EditCanvas.tsx @@ -0,0 +1,278 @@ +import { h } from 'preact'; +import { useRef, useEffect, useState } from 'preact/hooks'; +import type { Interface, Widget, SignalRef } from './lib/types'; +import TextView from './widgets/TextView'; +import TextLabel from './widgets/TextLabel'; +import Gauge from './widgets/Gauge'; +import BarH from './widgets/BarH'; +import BarV from './widgets/BarV'; +import Led from './widgets/Led'; +import MultiLed from './widgets/MultiLed'; +import SetValue from './widgets/SetValue'; +import Button from './widgets/Button'; +import PlotWidget from './widgets/PlotWidget'; +import ImageWidget from './widgets/ImageWidget'; +import LinkWidget from './widgets/LinkWidget'; +import WidgetTypePicker from './WidgetTypePicker'; + +const COMPONENTS: Record = { + textview: TextView, textlabel: TextLabel, gauge: Gauge, + barh: BarH, barv: BarV, led: Led, multiled: MultiLed, + setvalue: SetValue, button: Button, plot: PlotWidget, + image: ImageWidget, link: LinkWidget, +}; + +const DEFAULT_SIZES: Record = { + textview: [200, 50], + textlabel: [150, 36], + gauge: [120, 120], + barh: [200, 60], + barv: [60, 160], + led: [60, 60], + multiled: [200, 80], + setvalue: [200, 60], + button: [120, 50], + plot: [400, 200], + image: [200, 150], + link: [140, 50], +}; + +interface PickerState { + visible: boolean; + x: number; + y: number; + canvasX: number; + canvasY: number; + signal: SignalRef | null; +} + +interface DragState { + widgetId: string; + startMouseX: number; + startMouseY: number; + startWidgetX: number; + startWidgetY: number; +} + +interface ResizeState { + widgetId: string; + handle: string; // 'se' | 'sw' | 'ne' | 'nw' | 'n' | 's' | 'e' | 'w' + startMouseX: number; + startMouseY: number; + startX: number; + startY: number; + startW: number; + startH: number; +} + +interface Props { + iface: Interface; + selectedId: string | null; + onSelect: (id: string | null) => void; + onChange: (widgets: Widget[]) => void; +} + +let nextId = Date.now(); +function genId() { return `w${nextId++}`; } + +export default function EditCanvas({ iface, selectedId, onSelect, onChange }: Props) { + const containerRef = useRef(null); + const dragRef = useRef(null); + const resizeRef = useRef(null); + const [picker, setPicker] = useState({ + visible: false, x: 0, y: 0, canvasX: 0, canvasY: 0, signal: null, + }); + + // Document-level move/up handlers for drag and resize + useEffect(() => { + function onMouseMove(e: MouseEvent) { + if (dragRef.current) { + const d = dragRef.current; + const dx = e.clientX - d.startMouseX; + const dy = e.clientY - d.startMouseY; + const widgets = iface.widgets.map(w => + w.id === d.widgetId + ? { ...w, x: Math.round(d.startWidgetX + dx), y: Math.round(d.startWidgetY + dy) } + : w + ); + onChange(widgets); + } + if (resizeRef.current) { + const r = resizeRef.current; + const dx = e.clientX - r.startMouseX; + const dy = e.clientY - r.startMouseY; + let { startX: x, startY: y, startW: w, startH: h } = r; + const handle = r.handle; + if (handle.includes('e')) w = Math.max(20, w + dx); + if (handle.includes('s')) h = Math.max(20, h + dy); + if (handle.includes('w')) { x = x + dx; w = Math.max(20, w - dx); } + if (handle.includes('n')) { y = y + dy; h = Math.max(20, h - dy); } + const widgets = iface.widgets.map(widget => + widget.id === r.widgetId + ? { ...widget, x: Math.round(x), y: Math.round(y), w: Math.round(w), h: Math.round(h) } + : widget + ); + onChange(widgets); + } + } + function onMouseUp() { + dragRef.current = null; + resizeRef.current = null; + } + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + return () => { + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + }; + }, [iface.widgets, onChange]); + + function handleCanvasClick(e: MouseEvent) { + if ((e.target as Element).closest('.widget-overlay')) return; + onSelect(null); + } + + function handleDragOver(e: DragEvent) { + e.preventDefault(); + if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'; + } + + function handleDrop(e: DragEvent) { + e.preventDefault(); + const json = e.dataTransfer?.getData('application/json'); + if (!json) return; + let sig: SignalRef; + try { sig = JSON.parse(json); } catch { return; } + const rect = containerRef.current?.getBoundingClientRect(); + if (!rect) return; + const scrollLeft = containerRef.current?.scrollLeft ?? 0; + const scrollTop = containerRef.current?.scrollTop ?? 0; + const cx = e.clientX - rect.left + scrollLeft; + const cy = e.clientY - rect.top + scrollTop; + setPicker({ visible: true, x: e.clientX, y: e.clientY, canvasX: cx, canvasY: cy, signal: sig }); + } + + function handlePick(type: string) { + if (!picker.signal) return; + const [defW, defH] = DEFAULT_SIZES[type] ?? [150, 60]; + const newWidget: Widget = { + id: genId(), + type, + x: Math.round(picker.canvasX - defW / 2), + y: Math.round(picker.canvasY - defH / 2), + w: defW, + h: defH, + signals: [picker.signal], + options: {}, + }; + onChange([...iface.widgets, newWidget]); + onSelect(newWidget.id); + setPicker(p => ({ ...p, visible: false })); + } + + function handleDeleteWidget(id: string) { + onChange(iface.widgets.filter(w => w.id !== id)); + if (selectedId === id) onSelect(null); + } + + function startDrag(e: MouseEvent, widget: Widget) { + e.stopPropagation(); + onSelect(widget.id); + dragRef.current = { + widgetId: widget.id, + startMouseX: e.clientX, + startMouseY: e.clientY, + startWidgetX: widget.x, + startWidgetY: widget.y, + }; + } + + function startResize(e: MouseEvent, widget: Widget, handle: string) { + e.stopPropagation(); + e.preventDefault(); + resizeRef.current = { + widgetId: widget.id, + handle, + startMouseX: e.clientX, + startMouseY: e.clientY, + startX: widget.x, + startY: widget.y, + startW: widget.w, + startH: widget.h, + }; + } + + return ( +
+
+ {/* Render live widget previews */} + {iface.widgets.map(widget => { + const Comp = COMPONENTS[widget.type]; + return Comp + ? + : ( +
+ {widget.type} +
+ ); + })} + + {/* Overlay divs for interaction — sit above the live widgets */} + {iface.widgets.map(widget => { + const isSelected = widget.id === selectedId; + return ( +
startDrag(e, widget)} + onClick={(e: MouseEvent) => { e.stopPropagation(); onSelect(widget.id); }} + > + {isSelected && ( +
+ {/* Delete button */} + + {/* Resize handles */} + {(['n','s','e','w','ne','nw','se','sw'] as const).map(dir => ( +
startResize(e, widget, dir)} + /> + ))} +
+ )} +
+ ); + })} +
+ + {picker.visible && ( + setPicker(p => ({ ...p, visible: false }))} + /> + )} +
+ ); +} diff --git a/web/src/EditMode.tsx b/web/src/EditMode.tsx new file mode 100644 index 0000000..93dd058 --- /dev/null +++ b/web/src/EditMode.tsx @@ -0,0 +1,177 @@ +import { h } from 'preact'; +import { useState, useCallback } from 'preact/hooks'; +import type { Interface, Widget } from './lib/types'; +import { serializeInterface, parseInterface } from './lib/xml'; +import SignalTree from './SignalTree'; +import EditCanvas from './EditCanvas'; +import PropertiesPane from './PropertiesPane'; + +interface Props { + initial: Interface | null; + onDone: () => void; +} + +let _newId = Date.now(); +function newIfaceId() { return `iface-${_newId++}`; } + +function blankInterface(): Interface { + return { + id: newIfaceId(), + name: 'New Interface', + version: 1, + w: 1200, + h: 800, + widgets: [], + }; +} + +export default function EditMode({ initial, onDone }: Props) { + const [iface, setIface] = useState(initial ?? blankInterface()); + const [selectedId, setSelectedId] = useState(null); + const [dirty, setDirty] = useState(false); + const [saving, setSaving] = useState(false); + const [error, setError] = useState(null); + + const selectedWidget = iface.widgets.find(w => w.id === selectedId) ?? null; + + const handleWidgetsChange = useCallback((widgets: Widget[]) => { + setIface(f => ({ ...f, widgets })); + setDirty(true); + }, []); + + const handleWidgetChange = useCallback((updated: Widget) => { + setIface(f => ({ ...f, widgets: f.widgets.map(w => w.id === updated.id ? updated : w) })); + setDirty(true); + }, []); + + const handleIfaceChange = useCallback((updated: Interface) => { + setIface(updated); + setDirty(true); + }, []); + + async function handleSave() { + setSaving(true); + setError(null); + try { + const xml = serializeInterface(iface); + const url = iface.id + ? `/api/v1/interfaces/${encodeURIComponent(iface.id)}` + : '/api/v1/interfaces'; + const method = iface.id ? 'PUT' : 'POST'; + const res = await fetch(url, { + method, + headers: { 'Content-Type': 'application/xml' }, + body: xml, + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`Save failed (${res.status}): ${text}`); + } + if (method === 'POST') { + const json = await res.json(); + setIface(f => ({ ...f, id: json.id })); + } + setDirty(false); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setSaving(false); + } + } + + function handleExport() { + const xml = serializeInterface(iface); + const blob = new Blob([xml], { type: 'application/xml' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `${iface.name.replace(/[^a-z0-9]/gi, '_')}.xml`; + a.click(); + URL.revokeObjectURL(url); + } + + function handleImport() { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = '.xml,application/xml,text/xml'; + input.onchange = async () => { + const file = input.files?.[0]; + if (!file) return; + try { + const xml = await file.text(); + const parsed = parseInterface(xml); + setIface(parsed); + setSelectedId(null); + setDirty(true); + } catch (err) { + setError(`Import failed: ${err instanceof Error ? err.message : err}`); + } + }; + input.click(); + } + + function handleLeave() { + if (dirty && !confirm('You have unsaved changes. Leave without saving?')) return; + onDone(); + } + + function handleDeleteSelected() { + if (!selectedId) return; + setIface(f => ({ ...f, widgets: f.widgets.filter(w => w.id !== selectedId) })); + setSelectedId(null); + setDirty(true); + } + + function handleKeyDown(e: KeyboardEvent) { + if ((e.key === 'Delete' || e.key === 'Backspace') && selectedId && + !(e.target instanceof HTMLInputElement) && !(e.target instanceof HTMLTextAreaElement)) { + handleDeleteSelected(); + } + } + + return ( +
+ {/* Toolbar */} +
+
+ uopi + Edit + handleIfaceChange({ ...iface, name: (e.target as HTMLInputElement).value })} + /> + {dirty && } +
+
+ {error && Save error — check console} +
+
+ + + + +
+
+ + {/* Three-panel body */} +
+ + + +
+
+ ); +} diff --git a/web/src/InterfaceList.tsx b/web/src/InterfaceList.tsx new file mode 100644 index 0000000..8ad2ca6 --- /dev/null +++ b/web/src/InterfaceList.tsx @@ -0,0 +1,116 @@ +import { h } from 'preact'; +import { useState, useEffect, useRef } from 'preact/hooks'; +import type { Interface } from './lib/types'; + +interface ServerInterface { + id: string; + name: string; + version: number; +} + +interface Props { + onLoad: (xml: string) => void; + onSelect?: (id: string) => void; + onEdit?: (iface?: Interface) => void; +} + +export default function InterfaceList({ onLoad, onSelect, onEdit }: Props) { + const [collapsed, setCollapsed] = useState(false); + const [interfaces, setInterfaces] = useState([]); + const [loading, setLoading] = useState(true); + const fileInputRef = useRef(null); + + function refresh() { + setLoading(true); + fetch('/api/v1/interfaces') + .then(r => r.ok ? r.json() : []) + .then(data => setInterfaces(data)) + .catch(() => {}) + .finally(() => setLoading(false)); + } + + useEffect(() => { refresh(); }, []); + + function triggerImport() { + fileInputRef.current?.click(); + } + + async function handleFileChange(ev: Event) { + const input = ev.target as HTMLInputElement; + const file = input.files?.[0]; + if (!file) return; + try { + const xml = await file.text(); + onLoad(xml); + } catch (err) { + console.error('Failed to read interface file:', err); + } finally { + input.value = ''; + } + } + + async function handleDelete(id: string, name: string) { + if (!confirm(`Delete interface "${name}"?`)) return; + const res = await fetch(`/api/v1/interfaces/${encodeURIComponent(id)}`, { method: 'DELETE' }); + if (res.ok) refresh(); + } + + async function handleClone(id: string) { + const res = await fetch(`/api/v1/interfaces/${encodeURIComponent(id)}/clone`, { method: 'POST' }); + if (res.ok) refresh(); + } + + return ( + + ); +} diff --git a/web/src/PropertiesPane.tsx b/web/src/PropertiesPane.tsx new file mode 100644 index 0000000..592accf --- /dev/null +++ b/web/src/PropertiesPane.tsx @@ -0,0 +1,199 @@ +import { h } from 'preact'; +import { useState } from 'preact/hooks'; +import type { Widget, Interface } from './lib/types'; + +interface Props { + selected: Widget | null; + iface: Interface; + onChange: (updated: Widget) => void; + onIfaceChange: (updated: Interface) => void; +} + +function Field({ label, children }: { label: string; children: any }) { + return ( +
+ + {children} +
+ ); +} + +function TextInput({ value, onCommit }: { value: string; onCommit: (v: string) => void }) { + const [local, setLocal] = useState(value); + return ( + setLocal((e.target as HTMLInputElement).value)} + onChange={(e) => onCommit((e.target as HTMLInputElement).value)} + /> + ); +} + +export default function PropertiesPane({ selected, iface, onChange, onIfaceChange }: Props) { + const [collapsed, setCollapsed] = useState(false); + + function setOpt(key: string, value: string) { + if (!selected) return; + onChange({ ...selected, options: { ...selected.options, [key]: value } }); + } + + function setProp(key: keyof Widget, value: any) { + if (!selected) return; + onChange({ ...selected, [key]: value } as Widget); + } + + return ( + + ); +} diff --git a/web/src/SignalTree.tsx b/web/src/SignalTree.tsx new file mode 100644 index 0000000..73e384e --- /dev/null +++ b/web/src/SignalTree.tsx @@ -0,0 +1,127 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import type { SignalRef } from './lib/types'; + +interface SignalInfo { + name: string; + type: string; + unit?: string; + description?: string; + writable: boolean; +} + +interface DsGroup { + ds: string; + signals: SignalInfo[]; + expanded: boolean; +} + +interface Props { + onDragStart?: (sig: SignalRef) => void; +} + +export default function SignalTree({ onDragStart }: Props) { + const [collapsed, setCollapsed] = useState(false); + const [groups, setGroups] = useState([]); + const [filter, setFilter] = useState(''); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function load() { + try { + const res = await fetch('/api/v1/datasources'); + if (!res.ok) return; + const dsList: { name: string }[] = await res.json(); + const loaded: DsGroup[] = await Promise.all( + dsList.map(async ({ name }) => { + try { + const r = await fetch(`/api/v1/signals?ds=${encodeURIComponent(name)}`); + const sigs: SignalInfo[] = r.ok ? await r.json() : []; + return { ds: name, signals: sigs, expanded: true }; + } catch { + return { ds: name, signals: [], expanded: true }; + } + }) + ); + setGroups(loaded); + } catch (e) { + console.error('Failed to load signals:', e); + } finally { + setLoading(false); + } + } + load(); + }, []); + + function toggleGroup(ds: string) { + setGroups(gs => gs.map(g => g.ds === ds ? { ...g, expanded: !g.expanded } : g)); + } + + const lf = filter.toLowerCase(); + const filtered = groups.map(g => ({ + ...g, + signals: lf ? g.signals.filter(s => s.name.toLowerCase().includes(lf) || (s.description ?? '').toLowerCase().includes(lf)) : g.signals, + })).filter(g => g.signals.length > 0 || !lf); + + return ( + + ); +} diff --git a/web/src/ViewMode.tsx b/web/src/ViewMode.tsx new file mode 100644 index 0000000..1bfd5a9 --- /dev/null +++ b/web/src/ViewMode.tsx @@ -0,0 +1,91 @@ +import { h } from 'preact'; +import { useState } from 'preact/hooks'; +import InterfaceList from './InterfaceList'; +import Canvas from './Canvas'; +import { wsClient } from './lib/ws'; +import { parseInterface } from './lib/xml'; +import type { Interface } from './lib/types'; +import { useEffect } from 'preact/hooks'; + +interface Props { + onEdit?: (iface?: Interface) => void; +} + +export default function ViewMode({ onEdit }: Props) { + const [currentInterface, setCurrentInterface] = useState(null); + const [parseError, setParseError] = useState(null); + const [wsStatus, setWsStatus] = useState('connecting'); + + useEffect(() => { + const unsub = wsClient.status.subscribe(setWsStatus); + return unsub; + }, []); + + function handleLoad(xml: string) { + try { + setParseError(null); + setCurrentInterface(parseInterface(xml)); + } catch (err) { + setParseError(err instanceof Error ? err.message : 'Failed to parse interface file.'); + } + } + + async function handleNavigate(interfaceId: string) { + try { + const res = await fetch(`/api/v1/interfaces/${encodeURIComponent(interfaceId)}`); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const xml = await res.text(); + handleLoad(xml); + } catch (err) { + setParseError(`Failed to load interface "${interfaceId}": ${err instanceof Error ? err.message : err}`); + } + } + + return ( +
+
+
+ uopi + {currentInterface && ( + {currentInterface.name} + )} +
+
+ {parseError && ( + Parse error — check console + )} +
+
+
+ + {wsStatus} +
+ +
+
+ +
+ { + try { + const res = await fetch(`/api/v1/interfaces/${encodeURIComponent(id)}`); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + handleLoad(await res.text()); + } catch (err) { + setParseError(`Failed to load interface "${id}": ${err instanceof Error ? err.message : err}`); + } + }} + /> + +
+
+ ); +} diff --git a/web/src/WidgetTypePicker.tsx b/web/src/WidgetTypePicker.tsx new file mode 100644 index 0000000..0c9398f --- /dev/null +++ b/web/src/WidgetTypePicker.tsx @@ -0,0 +1,55 @@ +import { h } from 'preact'; + +interface Props { + x: number; + y: number; + onPick: (type: string) => void; + onCancel: () => void; +} + +const WIDGET_TYPES = [ + { type: 'textview', label: 'Text View', desc: 'Live value display' }, + { type: 'gauge', label: 'Gauge', desc: 'Circular arc gauge' }, + { type: 'barh', label: 'Bar (H)', desc: 'Horizontal bar' }, + { type: 'barv', label: 'Bar (V)', desc: 'Vertical bar' }, + { type: 'led', label: 'LED', desc: 'State indicator' }, + { type: 'multiled', label: 'Multi-LED', desc: 'Bitset indicator' }, + { type: 'setvalue', label: 'Set Value', desc: 'Input + write control' }, + { type: 'button', label: 'Button', desc: 'Send command on click' }, + { type: 'plot', label: 'Plot', desc: 'Time-series / charts' }, + { type: 'textlabel', label: 'Label', desc: 'Static text label' }, + { type: 'image', label: 'Image', desc: 'Image from URL' }, + { type: 'link', label: 'Link', desc: 'Navigate to interface' }, +]; + +export default function WidgetTypePicker({ x, y, onPick, onCancel }: Props) { + return ( +
+
e.stopPropagation()} + > +
+ Choose widget type + +
+
+ {WIDGET_TYPES.map(wt => ( + + ))} +
+
+
+ ); +} diff --git a/web/src/app.css b/web/src/app.css deleted file mode 100644 index 527d4fb..0000000 --- a/web/src/app.css +++ /dev/null @@ -1,296 +0,0 @@ -:root { - --text: #6b6375; - --text-h: #08060d; - --bg: #fff; - --border: #e5e4e7; - --code-bg: #f4f3ec; - --accent: #aa3bff; - --accent-bg: rgba(170, 59, 255, 0.1); - --accent-border: rgba(170, 59, 255, 0.5); - --social-bg: rgba(244, 243, 236, 0.5); - --shadow: - rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - - --sans: system-ui, 'Segoe UI', Roboto, sans-serif; - --heading: system-ui, 'Segoe UI', Roboto, sans-serif; - --mono: ui-monospace, Consolas, monospace; - - font: 18px/145% var(--sans); - letter-spacing: 0.18px; - color-scheme: light dark; - color: var(--text); - background: var(--bg); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - @media (max-width: 1024px) { - font-size: 16px; - } -} - -@media (prefers-color-scheme: dark) { - :root { - --text: #9ca3af; - --text-h: #f3f4f6; - --bg: #16171d; - --border: #2e303a; - --code-bg: #1f2028; - --accent: #c084fc; - --accent-bg: rgba(192, 132, 252, 0.15); - --accent-border: rgba(192, 132, 252, 0.5); - --social-bg: rgba(47, 48, 58, 0.5); - --shadow: - rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; - } - - #social .button-icon { - filter: invert(1) brightness(2); - } -} - -body { - margin: 0; -} - -h1, -h2 { - font-family: var(--heading); - font-weight: 500; - color: var(--text-h); -} - -h1 { - font-size: 56px; - letter-spacing: -1.68px; - margin: 32px 0; - @media (max-width: 1024px) { - font-size: 36px; - margin: 20px 0; - } -} -h2 { - font-size: 24px; - line-height: 118%; - letter-spacing: -0.24px; - margin: 0 0 8px; - @media (max-width: 1024px) { - font-size: 20px; - } -} -p { - margin: 0; -} - -code, -.counter { - font-family: var(--mono); - display: inline-flex; - border-radius: 4px; - color: var(--text-h); -} - -code { - font-size: 15px; - line-height: 135%; - padding: 4px 8px; - background: var(--code-bg); -} - -.counter { - font-size: 16px; - padding: 5px 10px; - border-radius: 5px; - color: var(--accent); - background: var(--accent-bg); - border: 2px solid transparent; - transition: border-color 0.3s; - margin-bottom: 24px; - - &:hover { - border-color: var(--accent-border); - } - &:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; - } -} - -.hero { - position: relative; - - .base, - .framework, - .vite { - inset-inline: 0; - margin: 0 auto; - } - - .base { - width: 170px; - position: relative; - z-index: 0; - } - - .framework, - .vite { - position: absolute; - } - - .framework { - z-index: 1; - top: 34px; - height: 28px; - transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) - scale(1.4); - } - - .vite { - z-index: 0; - top: 107px; - height: 26px; - width: auto; - transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) - scale(0.8); - } -} - -#app { - width: 1126px; - max-width: 100%; - margin: 0 auto; - text-align: center; - border-inline: 1px solid var(--border); - min-height: 100svh; - display: flex; - flex-direction: column; - box-sizing: border-box; -} - -#center { - display: flex; - flex-direction: column; - gap: 25px; - place-content: center; - place-items: center; - flex-grow: 1; - - @media (max-width: 1024px) { - padding: 32px 20px 24px; - gap: 18px; - } -} - -#next-steps { - display: flex; - border-top: 1px solid var(--border); - text-align: left; - - & > div { - flex: 1 1 0; - padding: 32px; - @media (max-width: 1024px) { - padding: 24px 20px; - } - } - - .icon { - margin-bottom: 16px; - width: 22px; - height: 22px; - } - - @media (max-width: 1024px) { - flex-direction: column; - text-align: center; - } -} - -#docs { - border-right: 1px solid var(--border); - - @media (max-width: 1024px) { - border-right: none; - border-bottom: 1px solid var(--border); - } -} - -#next-steps ul { - list-style: none; - padding: 0; - display: flex; - gap: 8px; - margin: 32px 0 0; - - .logo { - height: 18px; - } - - a { - color: var(--text-h); - font-size: 16px; - border-radius: 6px; - background: var(--social-bg); - display: flex; - padding: 6px 12px; - align-items: center; - gap: 8px; - text-decoration: none; - transition: box-shadow 0.3s; - - &:hover { - box-shadow: var(--shadow); - } - .button-icon { - height: 18px; - width: 18px; - } - } - - @media (max-width: 1024px) { - margin-top: 20px; - flex-wrap: wrap; - justify-content: center; - - li { - flex: 1 1 calc(50% - 8px); - } - - a { - width: 100%; - justify-content: center; - box-sizing: border-box; - } - } -} - -#spacer { - height: 88px; - border-top: 1px solid var(--border); - @media (max-width: 1024px) { - height: 48px; - } -} - -.ticks { - position: relative; - width: 100%; - - &::before, - &::after { - content: ''; - position: absolute; - top: -4.5px; - border: 5px solid transparent; - } - - &::before { - left: 0; - border-left-color: var(--border); - } - &::after { - right: 0; - border-right-color: var(--border); - } -} diff --git a/web/src/assets/hero.png b/web/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/web/src/assets/hero.png and /dev/null differ diff --git a/web/src/assets/svelte.svg b/web/src/assets/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/web/src/assets/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/src/assets/vite.svg b/web/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/web/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/web/src/lib/Canvas.svelte b/web/src/lib/Canvas.svelte deleted file mode 100644 index 48e35a5..0000000 --- a/web/src/lib/Canvas.svelte +++ /dev/null @@ -1,98 +0,0 @@ - - -
- {#if iface === null} -
-

Select an interface from the left panel, or import one.

-
- {:else} -
- {#each iface.widgets as widget (widget.id)} - {#if componentForType(widget.type) !== null} - {@const Comp = componentForType(widget.type)} - - {:else} - -
- {widget.type} -
- {/if} - {/each} -
- {/if} -
- - diff --git a/web/src/lib/Counter.svelte b/web/src/lib/Counter.svelte deleted file mode 100644 index 5f046bd..0000000 --- a/web/src/lib/Counter.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/web/src/lib/EditMode.svelte b/web/src/lib/EditMode.svelte deleted file mode 100644 index 2894eba..0000000 --- a/web/src/lib/EditMode.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - -
-

Edit mode — coming in Phase 6

-
- - diff --git a/web/src/lib/InterfaceList.svelte b/web/src/lib/InterfaceList.svelte deleted file mode 100644 index aa44016..0000000 --- a/web/src/lib/InterfaceList.svelte +++ /dev/null @@ -1,214 +0,0 @@ - - - - - diff --git a/web/src/lib/ViewMode.svelte b/web/src/lib/ViewMode.svelte deleted file mode 100644 index 1ddf05b..0000000 --- a/web/src/lib/ViewMode.svelte +++ /dev/null @@ -1,175 +0,0 @@ - - -
- -
-
- uopi - {#if currentInterface} - {currentInterface.name} - {/if} -
-
- {#if parseError} - Parse error — check console - {/if} -
-
-
- - {$wsStatus} -
- -
-
- - -
- - -
-
- - diff --git a/web/src/lib/store.ts b/web/src/lib/store.ts new file mode 100644 index 0000000..8363ea1 --- /dev/null +++ b/web/src/lib/store.ts @@ -0,0 +1,41 @@ +// Minimal reactive store — Svelte-compatible interface, no Svelte dependency. +export interface Readable { + subscribe(run: (value: T) => void): () => void; +} +export interface Writable extends Readable { + set(value: T): void; + update(fn: (value: T) => T): void; + get(): T; +} + +export function writable(initial: T): Writable { + let value = initial; + const subs = new Set<(v: T) => void>(); + return { + subscribe(fn) { subs.add(fn); fn(value); return () => subs.delete(fn); }, + set(v) { value = v; subs.forEach(fn => fn(v)); }, + update(fn) { this.set(fn(value)); }, + get() { return value; }, + }; +} + +export function readable(initial: T, start?: (set: (v: T) => void) => () => void): Readable { + const w = writable(initial); + if (start) { + let stop: (() => void) | null = null; + let subscribers = 0; + return { + subscribe(fn) { + subscribers++; + if (subscribers === 1) stop = start(w.set.bind(w)); + const unsub = w.subscribe(fn); + return () => { + unsub(); + subscribers--; + if (subscribers === 0 && stop) { stop(); stop = null; } + }; + } + }; + } + return w; +} diff --git a/web/src/lib/stores.ts b/web/src/lib/stores.ts index 27bf7ce..2873a6f 100644 --- a/web/src/lib/stores.ts +++ b/web/src/lib/stores.ts @@ -1,4 +1,4 @@ -import { readable, writable, type Readable } from 'svelte/store'; +import { readable, writable, type Readable } from './store'; import { wsClient } from './ws'; import type { SignalRef, SignalValue, SignalMeta } from './types'; diff --git a/web/src/lib/types.ts b/web/src/lib/types.ts index 61bc364..b0bc84f 100644 --- a/web/src/lib/types.ts +++ b/web/src/lib/types.ts @@ -36,7 +36,10 @@ export interface Widget { // A complete HMI interface definition export interface Interface { + id: string; name: string; version: number; + w: number; + h: number; widgets: Widget[]; } diff --git a/web/src/lib/widgets/BarH.svelte b/web/src/lib/widgets/BarH.svelte deleted file mode 100644 index c2e8ca9..0000000 --- a/web/src/lib/widgets/BarH.svelte +++ /dev/null @@ -1,132 +0,0 @@ - - -
- - {#if label} -
{label}
- {/if} -
-
-
-
- {displayValue()} - {#if unit}{unit}{/if} -
-
- - diff --git a/web/src/lib/widgets/BarV.svelte b/web/src/lib/widgets/BarV.svelte deleted file mode 100644 index 2cba3e6..0000000 --- a/web/src/lib/widgets/BarV.svelte +++ /dev/null @@ -1,136 +0,0 @@ - - -
- - {#if label} -
{label}
- {/if} -
- {displayValue()} - {#if unit}{unit}{/if} -
-
-
-
-
- - diff --git a/web/src/lib/widgets/Button.svelte b/web/src/lib/widgets/Button.svelte deleted file mode 100644 index 7045d97..0000000 --- a/web/src/lib/widgets/Button.svelte +++ /dev/null @@ -1,66 +0,0 @@ - - -
- -
- - diff --git a/web/src/lib/widgets/Gauge.svelte b/web/src/lib/widgets/Gauge.svelte deleted file mode 100644 index b0e8cb4..0000000 --- a/web/src/lib/widgets/Gauge.svelte +++ /dev/null @@ -1,187 +0,0 @@ - - -
- - - - - - {#if fillArcPath()} - - {/if} - - - - {displayValue()} - {#if unit} - {unit} - {/if} - - {minVal} - {maxVal} - - {#if label} -
{label}
- {/if} -
- - diff --git a/web/src/lib/widgets/Led.svelte b/web/src/lib/widgets/Led.svelte deleted file mode 100644 index d68f764..0000000 --- a/web/src/lib/widgets/Led.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - -
-
- {#if label} -
{label}
- {/if} -
- - diff --git a/web/src/lib/widgets/MultiLed.svelte b/web/src/lib/widgets/MultiLed.svelte deleted file mode 100644 index a8cc17b..0000000 --- a/web/src/lib/widgets/MultiLed.svelte +++ /dev/null @@ -1,108 +0,0 @@ - - -
- {#each bitStates() as on, i} - {@const trueColor = colorsTrueArr[i] ?? '#22c55e'} - {@const falseColor = colorsFalseArr[i] ?? '#ef4444'} - {@const color = on ? trueColor : falseColor} - {@const bitLabel = labelArr[i] ?? String(i)} -
-
-
{bitLabel}
-
- {/each} -
- - diff --git a/web/src/lib/widgets/PlotWidget.svelte b/web/src/lib/widgets/PlotWidget.svelte deleted file mode 100644 index 54783ec..0000000 --- a/web/src/lib/widgets/PlotWidget.svelte +++ /dev/null @@ -1,378 +0,0 @@ - - - - {#if plotType === 'timeseries'} - - {/if} - - -
-
-
- - diff --git a/web/src/lib/widgets/SetValue.svelte b/web/src/lib/widgets/SetValue.svelte deleted file mode 100644 index 1eaa1d1..0000000 --- a/web/src/lib/widgets/SetValue.svelte +++ /dev/null @@ -1,170 +0,0 @@ - - -
- - {label}: - {#if isNumeric} - - {:else} - - {/if} - {displayValue()} - {#if unit}{unit}{/if} - -
- - diff --git a/web/src/lib/widgets/TextView.svelte b/web/src/lib/widgets/TextView.svelte deleted file mode 100644 index 18fd359..0000000 --- a/web/src/lib/widgets/TextView.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - -
- - {label}: - {displayValue()} - {#if unit} - {unit} - {/if} -
- - diff --git a/web/src/lib/ws.ts b/web/src/lib/ws.ts index a895932..62635ae 100644 --- a/web/src/lib/ws.ts +++ b/web/src/lib/ws.ts @@ -1,4 +1,4 @@ -import { readable, writable, type Readable } from 'svelte/store'; +import { readable, writable, type Readable } from './store'; import type { SignalRef, SignalValue, SignalMeta } from './types'; // ── Types ──────────────────────────────────────────────────────────────────── diff --git a/web/src/lib/xml.ts b/web/src/lib/xml.ts index 08aeb6e..9aa0312 100644 --- a/web/src/lib/xml.ts +++ b/web/src/lib/xml.ts @@ -1,5 +1,40 @@ import type { Interface, Widget, SignalRef } from './types'; +/** Escape a string for use as an XML attribute value. */ +function xmlEsc(s: string): string { + return s + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +} + +/** Serialize an Interface object to an XML string. */ +export function serializeInterface(iface: Interface): string { + const lines: string[] = []; + lines.push(``); + lines.push( + `` + ); + for (const w of iface.widgets) { + lines.push( + ` ` + ); + for (const sig of w.signals) { + const colorAttr = sig.color ? ` color="${xmlEsc(sig.color)}"` : ''; + lines.push(` `); + } + for (const [key, value] of Object.entries(w.options)) { + lines.push(` `); + } + lines.push(``); + return lines.join('\n'); +} + /** * Parse an interface XML string into an Interface object. * @@ -26,8 +61,11 @@ export function parseInterface(xml: string): Interface { throw new Error(`Expected root element , got <${root.tagName}>`); } + const ifaceId = root.getAttribute('id') ?? ''; const name = root.getAttribute('name') ?? 'Untitled'; const version = parseInt(root.getAttribute('version') ?? '1', 10); + const w = parseInt(root.getAttribute('width') ?? '1200', 10); + const h = parseInt(root.getAttribute('height') ?? '800', 10); const widgets: Widget[] = []; @@ -62,5 +100,5 @@ export function parseInterface(xml: string): Interface { widgets.push({ id, type, x, y, w, h, signals, options }); } - return { name, version, widgets }; + return { id: ifaceId, name, version, w, h, widgets }; } diff --git a/web/src/main.ts b/web/src/main.ts deleted file mode 100644 index 664a057..0000000 --- a/web/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from 'svelte' -import './app.css' -import App from './App.svelte' - -const app = mount(App, { - target: document.getElementById('app')!, -}) - -export default app diff --git a/web/src/main.tsx b/web/src/main.tsx new file mode 100644 index 0000000..ab15969 --- /dev/null +++ b/web/src/main.tsx @@ -0,0 +1,5 @@ +import { h, render, Fragment } from 'preact'; +import App from './App'; +import './styles.css'; + +render(, document.getElementById('app')!); diff --git a/web/src/preact.d.ts b/web/src/preact.d.ts new file mode 100644 index 0000000..8838d12 --- /dev/null +++ b/web/src/preact.d.ts @@ -0,0 +1,97 @@ +// Minimal type declarations for vendored Preact — no npm required. + +// Global JSX namespace — required for "jsx": "react" + jsxFactory: "h" +declare namespace JSX { + type Element = import('preact').VNode; + interface ElementClass { render(): import('preact').ComponentChild; } + interface ElementAttributesProperty { props: {}; } + interface ElementChildrenAttribute { children: {}; } + type IntrinsicElements = { + [K in keyof HTMLElementTagNameMap]: any; + } & { + [K in keyof SVGElementTagNameMap]: any; + } & { [key: string]: any }; +} + +declare module 'preact' { + export type Key = string | number; + export type Ref = { current: T | null }; + export type VNode

= { type: any; props: P; key: Key | null }; + export type ComponentType

= (props: P) => VNode | null; + export type ComponentChild = VNode | string | number | boolean | null | undefined; + export type ComponentChildren = ComponentChild | ComponentChild[]; + + export interface Attributes { + key?: Key; + ref?: Ref; + children?: ComponentChildren; + } + + export function h(type: any, props: any, ...children: any[]): VNode; + export const Fragment: unique symbol; + export function render(vnode: ComponentChild, parent: Element | ShadowRoot): void; + export function cloneElement(vnode: VNode, props?: any, ...children: any[]): VNode; + + namespace JSX { + type Element = VNode; + interface ElementClass { render(): ComponentChild; } + interface ElementAttributesProperty { props: {}; } + interface ElementChildrenAttribute { children: {}; } + // Allow any HTML/SVG attributes on intrinsic elements + type IntrinsicElements = { + [K in keyof HTMLElementTagNameMap]: any; + } & { + [K in keyof SVGElementTagNameMap]: any; + } & { [key: string]: any }; + } +} + +declare module 'preact/hooks' { + import type { Ref, VNode } from 'preact'; + + export type StateUpdater = S | ((prevState: S) => S); + export function useState(initialState: S | (() => S)): [S, (update: StateUpdater) => void]; + export function useReducer(reducer: (state: S, action: A) => S, initialState: S): [S, (action: A) => void]; + export function useEffect(effect: () => void | (() => void), inputs?: readonly any[]): void; + export function useLayoutEffect(effect: () => void | (() => void), inputs?: readonly any[]): void; + export function useRef(initialValue: T): { current: T }; + export function useRef(initialValue: T | null): Ref; + export function useMemo(factory: () => T, inputs: readonly any[]): T; + export function useCallback any>(callback: T, inputs: readonly any[]): T; + export function useContext(context: import('preact').Context): T; +} + +declare module 'uplot' { + namespace uPlot { + type AlignedData = (number | null | undefined)[][]; + interface Series { label?: string; stroke?: string; width?: number; [k: string]: any; } + interface Scale { min?: number; max?: number; time?: boolean; [k: string]: any; } + interface Axis { stroke?: string; grid?: any; ticks?: any; [k: string]: any; } + interface Options { + width: number; + height: number; + series: Series[]; + legend?: { show?: boolean }; + axes?: Axis[]; + scales?: { [key: string]: Scale }; + [k: string]: any; + } + } + class uPlot { + constructor(opts: uPlot.Options, data: uPlot.AlignedData, target: HTMLElement); + setData(data: uPlot.AlignedData): void; + setSize(size: { width: number; height: number }): void; + destroy(): void; + } + export default uPlot; +} + +declare module 'echarts' { + interface EChartsType { + setOption(option: any, opts?: any): void; + resize(): void; + dispose(): void; + } + export function init(el: HTMLElement, theme?: string | null): EChartsType; + export type { EChartsType }; +} diff --git a/web/src/styles.css b/web/src/styles.css new file mode 100644 index 0000000..14da99d --- /dev/null +++ b/web/src/styles.css @@ -0,0 +1,1312 @@ +/* Global reset and base */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background: #0f1117; + color: #e2e8f0; + font-family: system-ui, 'Segoe UI', Roboto, sans-serif; + overflow: hidden; +} + +#app { + width: 100%; + max-width: none; + margin: 0; + text-align: left; + border: none; + min-height: 100vh; +} + +/* ── Connection banner ─────────────────────────────────────────────────── */ + +.connection-banner { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + background: #7f1d1d; + color: #fca5a5; + text-align: center; + font-size: 0.8rem; + padding: 0.3rem 1rem; +} + +/* ── ViewMode ──────────────────────────────────────────────────────────── */ + +.view-mode { + display: flex; + flex-direction: column; + height: 100vh; + width: 100%; + overflow: hidden; + background: #0f1117; +} + +.toolbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1rem; + height: 44px; + background: #1a1f2e; + border-bottom: 1px solid #2d3748; + flex-shrink: 0; + gap: 1rem; +} + +.toolbar-left { + display: flex; + align-items: center; + gap: 0.75rem; + min-width: 0; + flex: 1; +} + +.toolbar-center { + flex: 1; + text-align: center; +} + +.toolbar-right { + display: flex; + align-items: center; + gap: 0.6rem; + flex: 1; + justify-content: flex-end; +} + +.app-name { + font-size: 1rem; + font-weight: 800; + color: #60a5fa; + letter-spacing: -0.5px; +} + +.iface-name { + font-size: 0.85rem; + color: #94a3b8; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.parse-error { + font-size: 0.78rem; + color: #f87171; + background: rgba(248, 113, 113, 0.1); + border: 1px solid rgba(248, 113, 113, 0.3); + border-radius: 4px; + padding: 0.15rem 0.5rem; +} + +.status-chip { + display: flex; + align-items: center; + gap: 0.35rem; + font-size: 0.75rem; + padding: 0.2rem 0.6rem; + border-radius: 9999px; + background: #1e293b; + color: #94a3b8; + border: 1px solid #334155; + text-transform: capitalize; +} + +.status-chip.connected { + background: #14532d; + color: #86efac; + border-color: #166534; +} + +.status-chip.disconnected { + background: #7f1d1d; + color: #fca5a5; + border-color: #991b1b; +} + +.status-chip.connecting { + background: #1e293b; + color: #fbbf24; + border-color: #92400e; +} + +.status-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: currentColor; +} + +.btn-edit { + background: #2d3748; + border: none; + color: #e2e8f0; + font-size: 0.8rem; + padding: 0.25rem 0.7rem; + border-radius: 4px; + cursor: pointer; +} + +.btn-edit:hover { + background: #374151; +} + +.content { + display: flex; + flex: 1; + overflow: hidden; + min-height: 0; +} + +/* ── EditMode ──────────────────────────────────────────────────────────── */ + +.edit-mode { + display: flex; + align-items: center; + justify-content: center; + height: 100vh; + width: 100%; + background: #0f1117; + color: #475569; + font-size: 1.1rem; +} + +/* ── InterfaceList panel ───────────────────────────────────────────────── */ + +.panel { + width: 260px; + min-width: 260px; + background: #1a1f2e; + border-right: 1px solid #2d3748; + display: flex; + flex-direction: column; + transition: width 0.2s ease, min-width 0.2s ease; + overflow: hidden; +} + +.panel.collapsed { + width: 40px; + min-width: 40px; +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.5rem 0.5rem 0.75rem; + border-bottom: 1px solid #2d3748; + min-height: 40px; + flex-shrink: 0; +} + +.panel.collapsed .panel-header { + justify-content: center; + padding: 0.5rem; +} + +.panel-title { + font-size: 0.8rem; + font-weight: 600; + color: #94a3b8; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.icon-btn { + background: none; + border: none; + color: #64748b; + cursor: pointer; + font-size: 0.75rem; + padding: 0.2rem 0.4rem; + border-radius: 3px; + line-height: 1; +} + +.icon-btn:hover { + background: #2d3748; + color: #e2e8f0; +} + +.panel-actions { + display: flex; + gap: 0.4rem; + padding: 0.5rem 0.6rem; + border-bottom: 1px solid #2d3748; + flex-shrink: 0; +} + +.panel-btn { + flex: 1; + background: #2d3748; + border: none; + color: #e2e8f0; + font-size: 0.78rem; + padding: 0.3rem 0.5rem; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; +} + +.panel-btn:hover { + background: #374151; +} + +.panel-list { + flex: 1; + overflow-y: auto; + padding: 0.5rem 0; +} + +.hint { + color: #475569; + font-size: 0.8rem; + padding: 0.75rem 0.75rem; + line-height: 1.5; +} + +.iface-list { + list-style: none; + margin: 0; + padding: 0; +} + +.iface-item { + padding: 0.5rem 0.75rem; + color: #cbd5e1; + font-size: 0.85rem; + cursor: pointer; + border-radius: 3px; + margin: 1px 4px; +} + +.iface-item:hover { + background: #2d3748; + color: #e2e8f0; +} + +/* ── Canvas ────────────────────────────────────────────────────────────── */ + +.canvas-container { + flex: 1; + position: relative; + overflow: auto; + background: #0f1117; + min-width: 0; +} + +.placeholder { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + color: #475569; + font-size: 0.95rem; + text-align: center; + padding: 2rem; +} + +.canvas-area { + position: relative; + /* width/height set inline from interface dimensions */ +} + +/* ── TextLabel widget ──────────────────────────────────────────────────────── */ + +.textlabel { + position: absolute; + display: flex; + align-items: center; + overflow: hidden; + box-sizing: border-box; + font-size: 0.9rem; + color: #e2e8f0; + font-family: system-ui, sans-serif; + white-space: nowrap; +} + +/* ── Unknown widget ────────────────────────────────────────────────────────── */ + +.unknown-widget { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + background: #1e2535; + border: 1px dashed #3d4f6e; + border-radius: 4px; + box-sizing: border-box; +} + +.unknown-label { + color: #475569; + font-size: 0.75rem; + font-family: ui-monospace, monospace; +} + +/* ── Context Menu ──────────────────────────────────────────────────────── */ + +.ctx-menu { + position: fixed; + z-index: 9000; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5); + min-width: 180px; + padding: 4px 0; + font-family: system-ui, sans-serif; +} + +.ctx-item { + display: block; + width: 100%; + background: none; + border: none; + color: #cbd5e1; + font-size: 0.85rem; + padding: 0.4rem 0.9rem; + text-align: left; + cursor: pointer; + white-space: nowrap; +} + +.ctx-item:hover { + background: #2d3748; + color: #e2e8f0; +} + +.ctx-divider { + height: 1px; + background: #2d3748; + margin: 4px 0; +} + +.ctx-signal-info { + padding: 0.3rem 0.9rem; + font-size: 0.75rem; + color: #475569; + font-family: ui-monospace, monospace; +} + +/* ── Widgets — shared ──────────────────────────────────────────────────── */ + +.quality-dot { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + flex-shrink: 0; +} + +/* ── TextView widget ───────────────────────────────────────────────────── */ + +.textview { + position: absolute; + display: flex; + align-items: center; + gap: 0.4em; + padding: 0 0.6em; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 4px; + overflow: hidden; + box-sizing: border-box; + white-space: nowrap; +} + +.textview .label { + color: #94a3b8; + font-size: 0.8rem; + flex-shrink: 0; +} + +.textview .value { + font-family: ui-monospace, Consolas, monospace; + font-size: 0.9rem; + color: #e2e8f0; + min-width: 4ch; +} + +.textview .unit { + color: #64748b; + font-size: 0.75rem; + flex-shrink: 0; +} + +/* ── Gauge widget ──────────────────────────────────────────────────────── */ + +.gauge { + position: absolute; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + overflow: hidden; + font-family: system-ui, sans-serif; + padding: 4px; +} + +.gauge .quality-dot { + position: absolute; + top: 5px; + right: 5px; + width: 6px; + height: 6px; + border-radius: 50%; +} + +.gauge-svg { + width: 100%; + flex: 1; + overflow: visible; +} + +.gauge-value { + fill: #e2e8f0; + font-size: 14px; + font-family: ui-monospace, monospace; +} + +.gauge-unit { + fill: #64748b; + font-size: 6px; + font-family: system-ui, sans-serif; +} + +.gauge-range { + fill: #475569; + font-size: 6px; + font-family: system-ui, sans-serif; +} + +.gauge-label { + font-size: 0.75rem; + color: #94a3b8; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + padding: 0 4px; + box-sizing: border-box; +} + +/* ── BarH widget ───────────────────────────────────────────────────────── */ + +.barh { + position: absolute; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; + gap: 3px; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + padding: 6px 10px; + font-family: system-ui, sans-serif; + overflow: hidden; +} + +.barh .quality-dot { + position: absolute; + top: 5px; + right: 5px; + width: 6px; + height: 6px; + border-radius: 50%; +} + +.barh .bar-label { + font-size: 0.75rem; + color: #94a3b8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.barh .bar-track { + width: 100%; + height: 12px; + background: #2d3748; + border-radius: 3px; + overflow: hidden; +} + +.barh .bar-fill { + height: 100%; + background: #4a9eff; + border-radius: 3px; + transition: width 0.15s ease; +} + +.barh .bar-value { + display: flex; + gap: 4px; + align-items: baseline; + justify-content: flex-end; +} + +.barh .value { + font-family: ui-monospace, monospace; + font-size: 0.85rem; + color: #e2e8f0; +} + +.barh .unit { + font-size: 0.7rem; + color: #64748b; +} + +/* ── BarV widget ───────────────────────────────────────────────────────── */ + +.barv { + position: absolute; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; + gap: 3px; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + padding: 6px 8px; + font-family: system-ui, sans-serif; + overflow: hidden; +} + +.barv .quality-dot { + position: absolute; + top: 5px; + right: 5px; + width: 6px; + height: 6px; + border-radius: 50%; +} + +.barv .bar-label { + font-size: 0.75rem; + color: #94a3b8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + text-align: center; +} + +.barv .bar-value { + display: flex; + gap: 3px; + align-items: baseline; +} + +.barv .value { + font-family: ui-monospace, monospace; + font-size: 0.85rem; + color: #e2e8f0; +} + +.barv .unit { + font-size: 0.7rem; + color: #64748b; +} + +.barv .bar-track { + width: 24px; + flex: 1; + background: #2d3748; + border-radius: 3px; + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +.barv .bar-fill { + width: 100%; + background: #4a9eff; + border-radius: 3px; + transition: height 0.15s ease; +} + +/* ── LED widget ────────────────────────────────────────────────────────── */ + +.led-widget { + position: absolute; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 4px; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + padding: 4px; + font-family: system-ui, sans-serif; + overflow: hidden; +} + +.led-circle { + width: 20px; + height: 20px; + border-radius: 50%; + flex-shrink: 0; + transition: background 0.2s; +} + +.led-circle.blink { + animation: blink-slow 1.8s ease-in-out infinite; +} + +@keyframes blink-slow { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +.led-label { + font-size: 0.75rem; + color: #94a3b8; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; +} + +/* ── MultiLed widget ───────────────────────────────────────────────────── */ + +.multiled-widget { + position: absolute; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-start; + justify-content: flex-start; + gap: 4px; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + padding: 6px; + font-family: system-ui, sans-serif; + overflow: hidden; +} + +.bit-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 2px; + min-width: 20px; +} + +.multiled-widget .led-circle { + width: 14px; + height: 14px; +} + +.bit-label { + font-size: 0.6rem; + color: #64748b; + text-align: center; + white-space: nowrap; +} + +/* ── SetValue widget ───────────────────────────────────────────────────── */ + +.setvalue { + position: absolute; + display: flex; + align-items: center; + gap: 5px; + padding: 0 8px; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + overflow: hidden; + font-family: system-ui, sans-serif; + white-space: nowrap; +} + +.setvalue .quality-dot { + width: 6px; + height: 6px; + border-radius: 50%; + flex-shrink: 0; +} + +.sv-label { + color: #94a3b8; + font-size: 0.8rem; + flex-shrink: 0; +} + +.sv-input { + width: 80px; + background: #0f1117; + border: 1px solid #3d4f6e; + border-radius: 4px; + color: #e2e8f0; + font-size: 0.85rem; + padding: 2px 5px; + flex-shrink: 0; + font-family: ui-monospace, monospace; +} + +.sv-input:focus { + outline: none; + border-color: #4a9eff; +} + +.sv-current { + font-family: ui-monospace, monospace; + font-size: 0.85rem; + color: #e2e8f0; + flex-shrink: 0; +} + +.sv-unit { + font-size: 0.7rem; + color: #64748b; + flex-shrink: 0; +} + +.sv-btn { + background: #2563eb; + color: #fff; + border: none; + border-radius: 4px; + padding: 3px 10px; + font-size: 0.8rem; + cursor: pointer; + flex-shrink: 0; + font-family: system-ui, sans-serif; +} + +.sv-btn:hover { + background: #1d4ed8; +} + +.sv-btn:active { + background: #1e40af; +} + +/* ── Button widget ─────────────────────────────────────────────────────── */ + +.button-widget { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 4px; +} + +.button-widget .btn { + width: 100%; + height: 100%; + background: #1e3a5f; + color: #e2e8f0; + border: 1px solid #2d5a9e; + border-radius: 6px; + font-size: 0.9rem; + font-family: system-ui, sans-serif; + cursor: pointer; + transition: background 0.15s; +} + +.button-widget .btn:hover { + background: #2563eb; + border-color: #3b82f6; +} + +.button-widget .btn:active { + background: #1d4ed8; + transform: scale(0.97); +} + +/* ── ImageWidget ───────────────────────────────────────────────────────── */ + +.image-widget { + position: absolute; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 4px; + box-sizing: border-box; + overflow: hidden; +} + +.image-placeholder { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + color: #475569; + font-size: 0.8rem; +} + +/* ── LinkWidget ────────────────────────────────────────────────────────── */ + +.link-widget { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; +} + +.link-btn { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + height: 100%; + background: #1e293b; + color: #60a5fa; + border: 1px solid #334155; + border-radius: 6px; + font-size: 0.85rem; + font-family: system-ui, sans-serif; + cursor: pointer; + padding: 0 10px; + justify-content: center; + transition: background 0.15s, border-color 0.15s; +} + +.link-btn:hover { + background: #1e3a5f; + border-color: #3b82f6; + color: #93c5fd; +} + +.link-icon { font-size: 1rem; flex-shrink: 0; } +.link-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +/* ── PlotWidget ────────────────────────────────────────────────────────── */ + +.plot-widget { + position: absolute; + background: #1a1f2e; + border: 1px solid #2d3748; + border-radius: 6px; + box-sizing: border-box; + overflow: hidden; + font-family: system-ui, sans-serif; +} + +.chart-area { + overflow: hidden; +} + +/* uPlot dark overrides */ +.chart-area .u-wrap { background: transparent; } +.chart-area .u-legend { color: #94a3b8; font-size: 0.75rem; } +.chart-area .u-value { color: #e2e8f0; } + +/* ── Edit Mode layout ──────────────────────────────────────────────────── */ + +.edit-mode-layout { + display: flex; + flex-direction: column; + height: 100vh; + width: 100%; + overflow: hidden; + background: #0f1117; + outline: none; +} + +.edit-badge { + font-size: 0.7rem; + font-weight: 700; + background: #7c3aed; + color: #e9d5ff; + padding: 0.1rem 0.45rem; + border-radius: 3px; + letter-spacing: 0.05em; + text-transform: uppercase; +} + +.iface-name-input { + background: transparent; + border: none; + border-bottom: 1px solid #3d4f6e; + color: #e2e8f0; + font-size: 0.9rem; + padding: 0 4px; + width: 200px; + outline: none; + font-family: system-ui, sans-serif; +} + +.iface-name-input:focus { + border-bottom-color: #60a5fa; +} + +.dirty-dot { + color: #f59e0b; + font-size: 0.9rem; + line-height: 1; +} + +.toolbar-btn { + background: #2d3748; + border: none; + color: #e2e8f0; + font-size: 0.8rem; + padding: 0.25rem 0.75rem; + border-radius: 4px; + cursor: pointer; + font-family: system-ui, sans-serif; +} + +.toolbar-btn:hover { background: #374151; } + +.toolbar-btn-primary { + background: #2563eb; + color: #fff; +} + +.toolbar-btn-primary:hover:not(:disabled) { background: #1d4ed8; } +.toolbar-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } + +.edit-body { + display: flex; + flex: 1; + overflow: hidden; + min-height: 0; +} + +/* ── Edit Canvas ────────────────────────────────────────────────────────── */ + +.edit-canvas-container { + flex: 1; + position: relative; + overflow: auto; + background: #0a0d14; + background-image: + linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px); + background-size: 20px 20px; + min-width: 0; +} + +/* Widget overlays */ +.widget-overlay { + position: absolute; + box-sizing: border-box; + cursor: move; + border: 1px solid transparent; + transition: border-color 0.1s; + z-index: 10; +} + +.widget-overlay:hover { + border-color: rgba(96, 165, 250, 0.4); +} + +.widget-overlay.selected { + border: 2px solid #60a5fa; + border-radius: 2px; +} + +.overlay-delete { + position: absolute; + top: -10px; + right: -10px; + width: 18px; + height: 18px; + border-radius: 50%; + background: #ef4444; + color: #fff; + border: none; + font-size: 0.65rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + line-height: 1; + z-index: 20; + padding: 0; +} + +.overlay-delete:hover { background: #dc2626; } + +/* Resize handles */ +.resize-handle { + position: absolute; + width: 8px; + height: 8px; + background: #60a5fa; + border: 1px solid #1e40af; + border-radius: 1px; + z-index: 20; +} + +.resize-n { top: -4px; left: 50%; transform: translateX(-50%); cursor: n-resize; } +.resize-s { bottom: -4px; left: 50%; transform: translateX(-50%); cursor: s-resize; } +.resize-e { right: -4px; top: 50%; transform: translateY(-50%); cursor: e-resize; } +.resize-w { left: -4px; top: 50%; transform: translateY(-50%); cursor: w-resize; } +.resize-ne { top: -4px; right: -4px; cursor: ne-resize; } +.resize-nw { top: -4px; left: -4px; cursor: nw-resize; } +.resize-se { bottom: -4px; right: -4px; cursor: se-resize; } +.resize-sw { bottom: -4px; left: -4px; cursor: sw-resize; } + +/* ── Widget Type Picker ──────────────────────────────────────────────────── */ + +.widget-picker-backdrop { + position: fixed; + inset: 0; + z-index: 8000; +} + +.widget-picker { + position: fixed; + background: #1a1f2e; + border: 1px solid #3d4f6e; + border-radius: 8px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6); + min-width: 220px; + max-height: 420px; + overflow-y: auto; + z-index: 8001; +} + +.widget-picker-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + font-size: 0.8rem; + font-weight: 600; + color: #94a3b8; + border-bottom: 1px solid #2d3748; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.widget-picker-list { padding: 4px 0; } + +.widget-picker-item { + display: flex; + align-items: baseline; + gap: 0.5rem; + width: 100%; + background: none; + border: none; + color: #e2e8f0; + padding: 0.4rem 0.75rem; + text-align: left; + cursor: pointer; + font-family: system-ui, sans-serif; +} + +.widget-picker-item:hover { background: #2d3748; } + +.wpt-label { font-size: 0.85rem; font-weight: 500; } +.wpt-desc { font-size: 0.75rem; color: #64748b; } + +/* ── Signal Tree ─────────────────────────────────────────────────────────── */ + +.signal-tree-panel { + border-right: 1px solid #2d3748; +} + +.signal-tree-body { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; + min-height: 0; +} + +.signal-tree-search { + padding: 0.4rem 0.5rem; + border-bottom: 1px solid #2d3748; + flex-shrink: 0; +} + +.signal-filter { + width: 100%; + background: #0f1117; + border: 1px solid #2d3748; + border-radius: 4px; + color: #e2e8f0; + font-size: 0.8rem; + padding: 0.25rem 0.5rem; + outline: none; + font-family: system-ui, sans-serif; +} + +.signal-filter:focus { border-color: #4a9eff; } + +.signal-list { overflow-y: auto; flex: 1; } + +.signal-group { margin-bottom: 2px; } + +.signal-group-header { + display: flex; + align-items: center; + gap: 0.35rem; + padding: 0.3rem 0.5rem; + cursor: pointer; + color: #94a3b8; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + user-select: none; +} + +.signal-group-header:hover { color: #cbd5e1; } + +.signal-group-arrow { font-size: 0.7rem; flex-shrink: 0; } +.signal-group-name { flex: 1; } +.signal-group-count { + font-size: 0.7rem; + background: #2d3748; + border-radius: 10px; + padding: 0 5px; + color: #64748b; +} + +.signal-item { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.25rem 0.5rem 0.25rem 1.25rem; + cursor: grab; + border-radius: 3px; + margin: 1px 4px; + user-select: none; +} + +.signal-item:hover { background: #1e2535; } +.signal-item:active { cursor: grabbing; } + +.signal-name { font-size: 0.8rem; color: #cbd5e1; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.signal-unit { font-size: 0.7rem; color: #64748b; flex-shrink: 0; } + +/* ── Properties Pane ─────────────────────────────────────────────────────── */ + +.props-panel { + width: 240px; + min-width: 240px; +} + +.props-body { + overflow-y: auto; + flex: 1; + padding: 0.5rem 0; +} + +.props-section { + padding: 0 0 0.75rem; + border-bottom: 1px solid #2d3748; + margin-bottom: 0.5rem; +} + +.props-section:last-child { border-bottom: none; } + +.props-section-title { + font-size: 0.7rem; + font-weight: 700; + color: #64748b; + text-transform: uppercase; + letter-spacing: 0.06em; + padding: 0.4rem 0.6rem 0.3rem; +} + +.prop-field { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.2rem 0.6rem; +} + +.prop-label { + font-size: 0.75rem; + color: #64748b; + width: 60px; + flex-shrink: 0; +} + +.prop-input { + flex: 1; + background: #0f1117; + border: 1px solid #2d3748; + border-radius: 3px; + color: #e2e8f0; + font-size: 0.8rem; + padding: 0.15rem 0.35rem; + outline: none; + font-family: system-ui, sans-serif; + min-width: 0; +} + +.prop-input:focus { border-color: #4a9eff; } + +.prop-input-num { width: 70px; flex: none; } + +.prop-select { + flex: 1; + background: #0f1117; + border: 1px solid #2d3748; + border-radius: 3px; + color: #e2e8f0; + font-size: 0.8rem; + padding: 0.15rem 0.35rem; + outline: none; + font-family: system-ui, sans-serif; +} + +.prop-sig { + font-size: 0.75rem; + color: #94a3b8; + font-family: ui-monospace, monospace; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* ── InterfaceList item actions ─────────────────────────────────────────── */ + +.iface-item { + display: flex; + align-items: center; + justify-content: space-between; +} + +.iface-item-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; +} + +.iface-item-actions { + display: none; + gap: 2px; + flex-shrink: 0; +} + +.iface-item:hover .iface-item-actions { display: flex; } + +.iface-delete { color: #ef4444 !important; } +.iface-delete:hover { background: rgba(239, 68, 68, 0.15) !important; } + diff --git a/web/src/tsconfig.json b/web/src/tsconfig.json new file mode 100644 index 0000000..1e3a8fc --- /dev/null +++ b/web/src/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react", + "jsxFactory": "h", + "jsxFragmentFactory": "Fragment", + "strict": true, + "noImplicitAny": false, + "noUnusedLocals": true, + "noUnusedParameters": false, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["./**/*.ts", "./**/*.tsx", "./preact.d.ts"] +} diff --git a/web/src/widgets/BarH.tsx b/web/src/widgets/BarH.tsx new file mode 100644 index 0000000..9e92b40 --- /dev/null +++ b/web/src/widgets/BarH.tsx @@ -0,0 +1,69 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore, getMetaStore } from '../lib/stores'; +import type { Widget, SignalValue, SignalMeta } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function qualityColor(q: string): string { + switch (q) { + case 'good': return '#4ade80'; + case 'uncertain': return '#fbbf24'; + case 'bad': return '#f87171'; + default: return '#6b7280'; + } +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function BarH({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + const [meta, setMeta] = useState(null); + + useEffect(() => { + if (!sigRef) return; + const unsubV = getSignalStore(sigRef).subscribe(setSv); + const unsubM = getMetaStore(sigRef).subscribe(setMeta); + return () => { unsubV(); unsubM(); }; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const unit = widget.options['unit'] ?? meta?.unit ?? ''; + const minVal = parseFloat(widget.options['min'] ?? String(meta?.displayLow ?? 0)); + const maxVal = parseFloat(widget.options['max'] ?? String(meta?.displayHigh ?? 100)); + const quality = sv.quality; + + const rawV = sv.value; + const rawValue: number | null = rawV === null || rawV === undefined ? null + : typeof rawV === 'number' ? rawV : parseFloat(String(rawV)); + + function displayValue(): string { + if (rawValue === null || isNaN(rawValue)) return '---'; + return Number.isFinite(rawValue) ? rawValue.toPrecision(4).replace(/\.?0+$/, '') : String(rawValue); + } + + function fillPercent(): number { + if (rawValue === null || isNaN(rawValue)) return 0; + const frac = maxVal === minVal ? 0 : (rawValue - minVal) / (maxVal - minVal); + return Math.max(0, Math.min(100, frac * 100)); + } + + return ( +

+ + {label &&
{label}
} +
+
+
+
+ {displayValue()} + {unit && {unit}} +
+
+ ); +} diff --git a/web/src/widgets/BarV.tsx b/web/src/widgets/BarV.tsx new file mode 100644 index 0000000..045bce7 --- /dev/null +++ b/web/src/widgets/BarV.tsx @@ -0,0 +1,69 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore, getMetaStore } from '../lib/stores'; +import type { Widget, SignalValue, SignalMeta } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function qualityColor(q: string): string { + switch (q) { + case 'good': return '#4ade80'; + case 'uncertain': return '#fbbf24'; + case 'bad': return '#f87171'; + default: return '#6b7280'; + } +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function BarV({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + const [meta, setMeta] = useState(null); + + useEffect(() => { + if (!sigRef) return; + const unsubV = getSignalStore(sigRef).subscribe(setSv); + const unsubM = getMetaStore(sigRef).subscribe(setMeta); + return () => { unsubV(); unsubM(); }; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const unit = widget.options['unit'] ?? meta?.unit ?? ''; + const minVal = parseFloat(widget.options['min'] ?? String(meta?.displayLow ?? 0)); + const maxVal = parseFloat(widget.options['max'] ?? String(meta?.displayHigh ?? 100)); + const quality = sv.quality; + + const rawV = sv.value; + const rawValue: number | null = rawV === null || rawV === undefined ? null + : typeof rawV === 'number' ? rawV : parseFloat(String(rawV)); + + function displayValue(): string { + if (rawValue === null || isNaN(rawValue)) return '---'; + return Number.isFinite(rawValue) ? rawValue.toPrecision(4).replace(/\.?0+$/, '') : String(rawValue); + } + + function fillPercent(): number { + if (rawValue === null || isNaN(rawValue)) return 0; + const frac = maxVal === minVal ? 0 : (rawValue - minVal) / (maxVal - minVal); + return Math.max(0, Math.min(100, frac * 100)); + } + + return ( +
+ + {label &&
{label}
} +
+ {displayValue()} + {unit && {unit}} +
+
+
+
+
+ ); +} diff --git a/web/src/widgets/Button.tsx b/web/src/widgets/Button.tsx new file mode 100644 index 0000000..4516da2 --- /dev/null +++ b/web/src/widgets/Button.tsx @@ -0,0 +1,34 @@ +import { h } from 'preact'; +import { wsClient } from '../lib/ws'; +import type { Widget } from '../lib/types'; + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function Button({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const label = widget.options['label'] ?? 'Button'; + const valueOpt = widget.options['value'] ?? '1'; + const confirm = widget.options['confirm'] === 'true'; + + function handleClick() { + if (!sigRef) return; + const parsed = parseFloat(valueOpt); + const val = isNaN(parsed) ? valueOpt : parsed; + const doWrite = () => wsClient.write(sigRef, val); + if (confirm) { + if (window.confirm(`Send ${label}?`)) doWrite(); + } else { + doWrite(); + } + } + + return ( +
+ +
+ ); +} diff --git a/web/src/widgets/Gauge.tsx b/web/src/widgets/Gauge.tsx new file mode 100644 index 0000000..0e994f3 --- /dev/null +++ b/web/src/widgets/Gauge.tsx @@ -0,0 +1,105 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore, getMetaStore } from '../lib/stores'; +import type { Widget, SignalValue, SignalMeta } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function qualityColor(q: string): string { + switch (q) { + case 'good': return '#4ade80'; + case 'uncertain': return '#fbbf24'; + case 'bad': return '#f87171'; + default: return '#6b7280'; + } +} + +// Arc: -135deg to +135deg (270deg total) +const START_DEG = -135; +const END_DEG = 135; +const TOTAL_DEG = 270; +const cx = 50, cy = 54, r = 38; + +function degToRad(deg: number) { return (deg * Math.PI) / 180; } +function polarToXY(deg: number, radius: number) { + const rad = degToRad(deg); + return { x: cx + radius * Math.cos(rad), y: cy + radius * Math.sin(rad) }; +} +function arcPath(startDeg: number, endDeg: number, radius: number): string { + const s = polarToXY(startDeg, radius); + const e = polarToXY(endDeg, radius); + const largeArc = endDeg - startDeg > 180 ? 1 : 0; + return `M ${s.x} ${s.y} A ${radius} ${radius} 0 ${largeArc} 1 ${e.x} ${e.y}`; +} +function valueToDeg(v: number, minVal: number, maxVal: number): number { + const clamped = Math.max(minVal, Math.min(maxVal, v)); + const frac = maxVal === minVal ? 0 : (clamped - minVal) / (maxVal - minVal); + return START_DEG + frac * TOTAL_DEG; +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function Gauge({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + const [meta, setMeta] = useState(null); + + useEffect(() => { + if (!sigRef) return; + const unsubV = getSignalStore(sigRef).subscribe(setSv); + const unsubM = getMetaStore(sigRef).subscribe(setMeta); + return () => { unsubV(); unsubM(); }; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const unit = widget.options['unit'] ?? meta?.unit ?? ''; + const minVal = parseFloat(widget.options['min'] ?? String(meta?.displayLow ?? 0)); + const maxVal = parseFloat(widget.options['max'] ?? String(meta?.displayHigh ?? 100)); + const thresholdLow = widget.options['thresholdLow'] ? parseFloat(widget.options['thresholdLow']) : null; + const thresholdHigh = widget.options['thresholdHigh'] ? parseFloat(widget.options['thresholdHigh']) : null; + + const quality = sv.quality; + const rawV = sv.value; + const rawValue: number | null = rawV === null || rawV === undefined ? null + : typeof rawV === 'number' ? rawV : parseFloat(String(rawV)); + + function displayValue(): string { + if (rawValue === null || isNaN(rawValue)) return '---'; + return Number.isFinite(rawValue) ? rawValue.toPrecision(4).replace(/\.?0+$/, '') : String(rawValue); + } + + function fillColor(): string { + if (rawValue === null) return '#4a9eff'; + if (thresholdHigh !== null && rawValue >= thresholdHigh) return '#ef4444'; + if (thresholdLow !== null && rawValue <= thresholdLow) return '#f59e0b'; + return '#4a9eff'; + } + + const needleDeg = rawValue === null ? START_DEG : valueToDeg(rawValue, minVal, maxVal); + const bgPath = arcPath(START_DEG, END_DEG, r); + const fillPath = needleDeg > START_DEG ? arcPath(START_DEG, needleDeg, r) : ''; + const needlePos = polarToXY(needleDeg, r - 4); + const fc = fillColor(); + + return ( +
+ + + + {fillPath && ( + + )} + + {displayValue()} + {unit && {unit}} + {minVal} + {maxVal} + + {label &&
{label}
} +
+ ); +} diff --git a/web/src/widgets/ImageWidget.tsx b/web/src/widgets/ImageWidget.tsx new file mode 100644 index 0000000..bb8f136 --- /dev/null +++ b/web/src/widgets/ImageWidget.tsx @@ -0,0 +1,24 @@ +import { h } from 'preact'; +import type { Widget } from '../lib/types'; + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function ImageWidget({ widget, onContextMenu }: Props) { + const url = widget.options['url'] ?? ''; + const fit = widget.options['fit'] ?? 'contain'; // contain | cover | fill + const alt = widget.options['alt'] ?? ''; + const border = widget.options['border'] !== 'false'; + + return ( +
+ {url + ? {alt} + : No URL + } +
+ ); +} diff --git a/web/src/widgets/Led.tsx b/web/src/widgets/Led.tsx new file mode 100644 index 0000000..5ca1dc4 --- /dev/null +++ b/web/src/widgets/Led.tsx @@ -0,0 +1,53 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore } from '../lib/stores'; +import type { Widget, SignalValue } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function evaluateCondition(expr: string, v: any): boolean { + if (/backtick|`|import|fetch|eval|Function|window|document/.test(expr)) return false; + try { + // eslint-disable-next-line no-new-func + return new Function('value', 'return ' + expr)(v); + } catch { + return false; + } +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function Led({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + + useEffect(() => { + if (!sigRef) return; + const unsub = getSignalStore(sigRef).subscribe(setSv); + return unsub; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const condition = widget.options['condition'] ?? 'value > 0'; + const colorTrue = widget.options['colorTrue'] ?? '#22c55e'; + const colorFalse = widget.options['colorFalse'] ?? '#ef4444'; + + const quality = sv.quality; + const isUncertain = quality === 'uncertain' || quality === 'unknown'; + const ledOn = sv.value !== null && sv.value !== undefined ? evaluateCondition(condition, sv.value) : false; + const ledColor = ledOn ? colorTrue : colorFalse; + + return ( +
+
+ {label &&
{label}
} +
+ ); +} diff --git a/web/src/widgets/LinkWidget.tsx b/web/src/widgets/LinkWidget.tsx new file mode 100644 index 0000000..4798642 --- /dev/null +++ b/web/src/widgets/LinkWidget.tsx @@ -0,0 +1,32 @@ +import { h } from 'preact'; +import type { Widget } from '../lib/types'; + +interface Props { + widget: Widget; + onContextMenu?: (e: MouseEvent) => void; + onNavigate?: (interfaceId: string) => void; +} + +export default function LinkWidget({ widget, onContextMenu, onNavigate }: Props) { + const target = widget.options['target'] ?? ''; + const label = widget.options['label'] ?? target ?? 'Open'; + const icon = widget.options['icon'] ?? '↗'; + + function handleClick(e: MouseEvent) { + e.preventDefault(); + if (target && onNavigate) onNavigate(target); + } + + return ( + + ); +} diff --git a/web/src/widgets/MultiLed.tsx b/web/src/widgets/MultiLed.tsx new file mode 100644 index 0000000..2a858ce --- /dev/null +++ b/web/src/widgets/MultiLed.tsx @@ -0,0 +1,65 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore } from '../lib/stores'; +import type { Widget, SignalValue } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function getBit(val: number, bit: number): boolean { + return (val & (1 << bit)) !== 0; +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function MultiLed({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + + useEffect(() => { + if (!sigRef) return; + const unsub = getSignalStore(sigRef).subscribe(setSv); + return unsub; + }, [sigRef?.ds, sigRef?.name]); + + const bits = parseInt(widget.options['bits'] ?? '8', 10); + const labelsRaw = widget.options['labels'] ?? ''; + const colorsTrueRaw = widget.options['colorsTrue'] ?? ''; + const colorsFalseRaw = widget.options['colorsFalse'] ?? ''; + + const labelArr = labelsRaw ? labelsRaw.split(',') : []; + const colorsTrueArr = colorsTrueRaw ? colorsTrueRaw.split(',') : []; + const colorsFalseArr = colorsFalseRaw ? colorsFalseRaw.split(',') : []; + + const quality = sv.quality; + const isUncertain = quality === 'uncertain' || quality === 'unknown'; + + const rawV = sv.value; + const intValue = rawV === null || rawV === undefined ? 0 + : typeof rawV === 'number' ? Math.floor(rawV) : parseInt(String(rawV), 10); + + const bitStates = Array.from({ length: bits }, (_, i) => getBit(intValue, i)); + + return ( +
+ {bitStates.map((on, i) => { + const trueColor = colorsTrueArr[i] ?? '#22c55e'; + const falseColor = colorsFalseArr[i] ?? '#ef4444'; + const color = on ? trueColor : falseColor; + const bitLabel = labelArr[i] ?? String(i); + return ( +
+
+
{bitLabel}
+
+ ); + })} +
+ ); +} diff --git a/web/src/widgets/PlotWidget.tsx b/web/src/widgets/PlotWidget.tsx new file mode 100644 index 0000000..cc7245c --- /dev/null +++ b/web/src/widgets/PlotWidget.tsx @@ -0,0 +1,286 @@ +import { h } from 'preact'; +import { useEffect, useRef } from 'preact/hooks'; +import uPlot from 'uplot'; +import * as echarts from 'echarts'; +import { getSignalStore } from '../lib/stores'; +import type { Widget, SignalRef } from '../lib/types'; + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +interface SeriesBuffer { + timestamps: number[]; + values: number[]; +} + +const RING_MAX = 4000; +const COLORS = ['#4a9eff', '#22c55e', '#f59e0b', '#ef4444', '#a78bfa', '#f472b6', '#34d399', '#fb923c']; + +const ECHARTS_DARK = { + backgroundColor: '#1a1f2e', + textStyle: { color: '#94a3b8' }, + axisLineStyle: { color: '#475569' }, + axisLabelStyle: { color: '#64748b' }, + splitLineStyle: { color: '#2d3748' }, +}; + +function pushSample(buf: SeriesBuffer, ts: number, val: number) { + buf.timestamps.push(ts); + buf.values.push(val); + if (buf.timestamps.length > RING_MAX) { + buf.timestamps.splice(0, buf.timestamps.length - RING_MAX); + buf.values.splice(0, buf.values.length - RING_MAX); + } +} + +function windowedSlice(buf: SeriesBuffer, windowSec: number) { + const cutoff = Date.now() / 1000 - windowSec; + const start = buf.timestamps.findIndex(t => t >= cutoff); + if (start === -1) return { ts: [] as number[], vals: [] as number[] }; + return { ts: buf.timestamps.slice(start), vals: buf.values.slice(start) }; +} + +function buildHistogram(allVals: number[][]): { labels: string[]; counts: number[][] } { + const BUCKETS = 20; + let lo = Infinity, hi = -Infinity; + for (const vals of allVals) for (const v of vals) { if (v < lo) lo = v; if (v > hi) hi = v; } + if (!isFinite(lo) || lo === hi) return { labels: [], counts: allVals.map(() => []) }; + const size = (hi - lo) / BUCKETS; + const counts = allVals.map(vals => { + const bins = new Array(BUCKETS).fill(0); + for (const v of vals) bins[Math.min(BUCKETS - 1, Math.floor((v - lo) / size))]++; + return bins; + }); + const labels = Array.from({ length: BUCKETS }, (_, i) => (lo + i * size).toPrecision(3)); + return { labels, counts }; +} + +export default function PlotWidget({ widget, onContextMenu }: Props) { + const outerRef = useRef(null); + const chartRef = useRef(null); + + useEffect(() => { + if (!chartRef.current) return; + + const signals = widget.signals; + const plotType = widget.options['plotType'] ?? 'timeseries'; + const timeWindow = parseFloat(widget.options['timeWindow'] ?? '60'); + const yMin = widget.options['yMin']; + const yMax = widget.options['yMax']; + const legendPos = widget.options['legend'] ?? 'bottom'; + const showLegend = legendPos !== 'none'; + + const buffers: SeriesBuffer[] = signals.map(() => ({ timestamps: [], values: [] })); + const histValues: number[][] = signals.map(() => []); + const unsubs: (() => void)[] = []; + + // ── uPlot (timeseries) ────────────────────────────────────────────────── + let uplot: uPlot | null = null; + + function uplotData(): uPlot.AlignedData { + if (signals.length === 0) return [[]]; + const allTs = new Set(); + buffers.forEach(b => windowedSlice(b, timeWindow).ts.forEach(t => allTs.add(t))); + const tsSorted = Array.from(allTs).sort((a, b) => a - b); + if (tsSorted.length === 0) { + // Return proper empty structure: [timestamps, ...series] + return [[], ...signals.map(() => [])] as uPlot.AlignedData; + } + const tsMap = buffers.map(b => { + const m = new Map(); + const { ts, vals } = windowedSlice(b, timeWindow); + ts.forEach((t, i) => m.set(t, vals[i])); + return m; + }); + return [ + tsSorted, + ...tsMap.map(m => tsSorted.map(t => m.get(t) ?? null)), + ] as uPlot.AlignedData; + } + + // ── ECharts ──────────────────────────────────────────────────────────── + let echart: echarts.EChartsType | null = null; + + function echartsOption(): any { + const axisLine = { lineStyle: { color: '#475569' } }; + const axisLabel = { color: '#64748b' }; + const splitLine = { lineStyle: { color: '#2d3748' } }; + const legendOpt = showLegend + ? { top: legendPos === 'top' ? 0 : 'bottom', textStyle: { color: '#94a3b8' } } + : undefined; + + switch (plotType) { + case 'histogram': { + const { labels, counts } = buildHistogram(histValues); + return { + backgroundColor: ECHARTS_DARK.backgroundColor, + legend: legendOpt, + xAxis: { type: 'category', data: labels, axisLine, axisLabel, splitLine }, + yAxis: { type: 'value', axisLine, axisLabel, splitLine }, + series: counts.map((d, i) => ({ + name: signals[i]?.name ?? `S${i}`, + type: 'bar', + data: d, + itemStyle: { color: signals[i]?.color ?? COLORS[i % COLORS.length] }, + })), + }; + } + case 'bar': { + return { + backgroundColor: ECHARTS_DARK.backgroundColor, + legend: legendOpt, + xAxis: { type: 'category', data: signals.map(s => s.name), axisLine, axisLabel }, + yAxis: { type: 'value', axisLine, axisLabel, splitLine }, + series: [{ + type: 'bar', + data: buffers.map((b, i) => ({ + value: b.values.length ? b.values[b.values.length - 1] : 0, + itemStyle: { color: signals[i]?.color ?? COLORS[i % COLORS.length] }, + })), + }], + }; + } + case 'fft': { + return { + backgroundColor: ECHARTS_DARK.backgroundColor, + legend: legendOpt, + xAxis: { type: 'category', name: 'Freq Index', axisLine, axisLabel }, + yAxis: { type: 'value', axisLine, axisLabel, splitLine }, + series: buffers.map((b, i) => ({ + name: signals[i]?.name ?? `S${i}`, + type: 'line', + data: b.values.length ? b.values[b.values.length - 1] : [], + lineStyle: { color: signals[i]?.color ?? COLORS[i % COLORS.length] }, + showSymbol: false, + })), + }; + } + case 'logic': { + return { + backgroundColor: ECHARTS_DARK.backgroundColor, + legend: legendOpt, + xAxis: { type: 'value', min: 'dataMin', max: 'dataMax', axisLine, axisLabel }, + yAxis: { type: 'value', min: -0.1, max: 1.1, axisLine, axisLabel, splitLine }, + series: buffers.map((b, i) => { + const { ts, vals } = windowedSlice(b, timeWindow); + return { + name: signals[i]?.name ?? `S${i}`, + type: 'line', step: 'end', + data: ts.map((t, j) => [t, vals[j] > 0 ? 1 : 0]), + lineStyle: { color: signals[i]?.color ?? COLORS[i % COLORS.length] }, + showSymbol: false, + }; + }), + }; + } + case 'waterfall': { + const ROWS = 32; + const b = buffers[0]; + const step = Math.max(1, Math.floor(b.values.length / ROWS)); + const flatData: [number, number, number][] = []; + for (let ri = 0; ri < ROWS; ri++) { + const idx = b.values.length - 1 - (ROWS - 1 - ri) * step; + if (idx < 0) continue; + const row = b.values[idx]; + const arr = Array.isArray(row) ? row : [row]; + arr.forEach((val, ci) => flatData.push([ci, ri, val])); + } + return { + backgroundColor: ECHARTS_DARK.backgroundColor, + visualMap: { min: 0, max: 1, show: false, inRange: { color: ['#0f1117', '#4a9eff'] } }, + xAxis: { type: 'value', axisLabel }, + yAxis: { type: 'value', axisLabel }, + series: [{ type: 'heatmap', data: flatData }], + }; + } + default: + return { backgroundColor: ECHARTS_DARK.backgroundColor }; + } + } + + // ── Init chart ───────────────────────────────────────────────────────── + const el = chartRef.current; + const w = el.clientWidth || widget.w; + const h = el.clientHeight || widget.h; + + if (plotType === 'timeseries') { + const seriesConf: uPlot.Series[] = [ + {}, + ...signals.map((s, i) => ({ + label: s.name, + stroke: s.color ?? COLORS[i % COLORS.length], + width: 1.5, + })), + ]; + + const scaleY: uPlot.Scale = {}; + if (yMin !== undefined && yMin !== 'auto') scaleY.min = parseFloat(yMin); + if (yMax !== undefined && yMax !== 'auto') scaleY.max = parseFloat(yMax); + + uplot = new uPlot( + { + width: w, + height: h, + series: seriesConf, + legend: { show: showLegend }, + axes: [ + { stroke: '#64748b', grid: { stroke: '#2d3748' }, ticks: { stroke: '#475569' } }, + { stroke: '#64748b', grid: { stroke: '#2d3748' }, ticks: { stroke: '#475569' } }, + ], + scales: { x: { time: true }, y: scaleY }, + }, + uplotData(), + el, + ); + } else { + echart = echarts.init(el); + echart.setOption(echartsOption()); + } + + // ── Subscribe to signals ─────────────────────────────────────────────── + signals.forEach((sig: SignalRef & { color?: string }, i) => { + const unsub = getSignalStore(sig).subscribe(sv => { + if (sv.value === null || sv.value === undefined || sv.ts === null) return; + const ts = new Date(sv.ts).getTime() / 1000; + const v = typeof sv.value === 'number' ? sv.value : parseFloat(String(sv.value)); + if (isNaN(v)) return; + + pushSample(buffers[i], ts, v); + if (plotType === 'histogram') histValues[i].push(v); + + if (uplot) uplot.setData(uplotData()); + else if (echart) echart.setOption(echartsOption(), { notMerge: true }); + }); + unsubs.push(unsub); + }); + + // ── Resize ───────────────────────────────────────────────────────────── + const ro = new ResizeObserver(() => { + if (!chartRef.current) return; + const nw = chartRef.current.clientWidth; + const nh = chartRef.current.clientHeight; + if (nw > 0 && nh > 0) { + if (uplot) uplot.setSize({ width: nw, height: nh }); + if (echart) echart.resize(); + } + }); + if (outerRef.current) ro.observe(outerRef.current); + + return () => { + ro.disconnect(); + unsubs.forEach(u => u()); + if (uplot) uplot.destroy(); + if (echart) echart.dispose(); + }; + }, [widget.id]); + + return ( +
+
+
+ ); +} diff --git a/web/src/widgets/SetValue.tsx b/web/src/widgets/SetValue.tsx new file mode 100644 index 0000000..c962e48 --- /dev/null +++ b/web/src/widgets/SetValue.tsx @@ -0,0 +1,91 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore, getMetaStore } from '../lib/stores'; +import { wsClient } from '../lib/ws'; +import type { Widget, SignalValue, SignalMeta } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function qualityColor(q: string): string { + switch (q) { + case 'good': return '#4ade80'; + case 'uncertain': return '#fbbf24'; + case 'bad': return '#f87171'; + default: return '#6b7280'; + } +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function SetValue({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + const [meta, setMeta] = useState(null); + const [inputValue, setInputValue] = useState(''); + + useEffect(() => { + if (!sigRef) return; + const unsubV = getSignalStore(sigRef).subscribe(setSv); + const unsubM = getMetaStore(sigRef).subscribe(setMeta); + return () => { unsubV(); unsubM(); }; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const unit = widget.options['unit'] ?? meta?.unit ?? ''; + const confirm = widget.options['confirm'] === 'true'; + const isNumeric = meta ? meta.type !== 'TypeString' : true; + const quality = sv.quality; + + function displayValue(): string { + const v = sv.value; + if (v === null || v === undefined) return '---'; + if (typeof v === 'number') { + return Number.isFinite(v) ? v.toPrecision(4).replace(/\.?0+$/, '') : String(v); + } + return String(v); + } + + function handleSet() { + if (!sigRef) return; + const raw = inputValue.trim(); + if (!raw) return; + + const doWrite = () => { + const val = isNumeric ? parseFloat(raw) : raw; + wsClient.write(sigRef, val); + setInputValue(''); + }; + + if (confirm) { + if (window.confirm(`Set ${label} to ${raw}?`)) doWrite(); + } else { + doWrite(); + } + } + + function handleKeydown(e: KeyboardEvent) { + if (e.key === 'Enter') handleSet(); + } + + return ( +
+ + {label}: + setInputValue((e.target as HTMLInputElement).value)} + onKeyDown={handleKeydown} + placeholder="value" + /> + {displayValue()} + {unit && {unit}} + +
+ ); +} diff --git a/web/src/widgets/TextLabel.tsx b/web/src/widgets/TextLabel.tsx new file mode 100644 index 0000000..6b29714 --- /dev/null +++ b/web/src/widgets/TextLabel.tsx @@ -0,0 +1,21 @@ +import { h } from 'preact'; +import type { Widget } from '../lib/types'; + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function TextLabel({ widget, onContextMenu }: Props) { + const text = widget.options['text'] ?? ''; + const fontSize = widget.options['fontSize'] ?? '1rem'; + const color = widget.options['color'] ?? '#e2e8f0'; + const align = widget.options['align'] ?? 'left'; + + return ( +
+ {text} +
+ ); +} diff --git a/web/src/widgets/TextView.tsx b/web/src/widgets/TextView.tsx new file mode 100644 index 0000000..ae835f3 --- /dev/null +++ b/web/src/widgets/TextView.tsx @@ -0,0 +1,56 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; +import { getSignalStore, getMetaStore } from '../lib/stores'; +import type { Widget, SignalValue, SignalMeta } from '../lib/types'; + +const DEFAULT_VALUE: SignalValue = { value: null, quality: 'unknown', ts: null }; + +function qualityColor(q: string): string { + switch (q) { + case 'good': return '#4ade80'; + case 'uncertain': return '#fbbf24'; + case 'bad': return '#f87171'; + default: return '#6b7280'; + } +} + +interface Props { widget: Widget; onContextMenu?: (e: MouseEvent) => void; } + +export default function TextView({ widget, onContextMenu }: Props) { + const sigRef = widget.signals[0]; + const [sv, setSv] = useState(DEFAULT_VALUE); + const [meta, setMeta] = useState(null); + + useEffect(() => { + if (!sigRef) return; + const unsubV = getSignalStore(sigRef).subscribe(setSv); + const unsubM = getMetaStore(sigRef).subscribe(setMeta); + return () => { unsubV(); unsubM(); }; + }, [sigRef?.ds, sigRef?.name]); + + const label = widget.options['label'] ?? sigRef?.name ?? ''; + const unit = widget.options['unit'] ?? meta?.unit ?? ''; + const quality = sv.quality; + + function displayValue(): string { + if (!sv || sv.value === null || sv.value === undefined) return '---'; + const v = sv.value; + if (typeof v === 'number') { + return Number.isFinite(v) ? v.toPrecision(6).replace(/\.?0+$/, '') : String(v); + } + return String(v); + } + + return ( +
+ + {label}: + {displayValue()} + {unit && {unit}} +
+ ); +} diff --git a/web/svelte.config.js b/web/svelte.config.js deleted file mode 100644 index 0cf7db3..0000000 --- a/web/svelte.config.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ -export default {} diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json deleted file mode 100644 index d774b20..0000000 --- a/web/tsconfig.app.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "es2023", - "module": "esnext", - "types": ["svelte", "vite/client"], - "noEmit": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ - "allowJs": true, - "checkJs": true, - "moduleDetection": "force" - }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] -} diff --git a/web/tsconfig.json b/web/tsconfig.json index 1ffef60..e8389fb 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,7 +1,4 @@ { - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "extends": "./src/tsconfig.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/preact.d.ts"] } diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json deleted file mode 100644 index d3c52ea..0000000 --- a/web/tsconfig.node.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "es2023", - "lib": ["ES2023"], - "module": "esnext", - "types": ["node"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["vite.config.ts"] -} diff --git a/web/vendor/echarts.esm.js b/web/vendor/echarts.esm.js new file mode 100644 index 0000000..943a706 --- /dev/null +++ b/web/vendor/echarts.esm.js @@ -0,0 +1,45 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};function e(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var n=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},i=new function(){this.browser=new n,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(i.wxa=!0,i.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?i.worker=!0:"undefined"==typeof navigator||0===navigator.userAgent.indexOf("Node.js")?(i.node=!0,i.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,i);var r="sans-serif",o="12px "+r;var a,s,l=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n=0)h=r*t.length;else for(var c=0;c>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),l=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,d=h.top;a.push(p,d),l=l&&o&&p===o[c]&&d===o[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?Kt(s,a):Kt(a,s))}(s,a,o);if(l)return l(t,n,r),!0}return!1}function te(t){return"CANVAS"===t.nodeName.toUpperCase()}var ee=/([&<>"'])/g,ne={"&":"&","<":"<",">":">",'"':""","'":"'"};function ie(t){return null==t?"":(t+"").replace(ee,(function(t,e){return ne[e]}))}var re=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,oe=[],ae=i.browser.firefox&&+i.browser.version.split(".")[0]<39;function se(t,e,n,i){return n=n||{},i?le(t,e,n):ae&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):le(t,e,n),n}function le(t,e,n){if(i.domSupported&&t.getBoundingClientRect){var r=e.clientX,o=e.clientY;if(te(t)){var a=t.getBoundingClientRect();return n.zrX=r-a.left,void(n.zrY=o-a.top)}if(Qt(oe,t,r,o))return n.zrX=oe[0],void(n.zrY=oe[1])}n.zrX=n.zrY=0}function ue(t){return t||window.event}function he(t,e,n){if(null!=(e=ue(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&se(t,r,e,n)}else{se(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&re.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ce(t,e,n,i){t.addEventListener(e,n,i)}var pe=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function de(t){return 2===t.which||3===t.which}var fe=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=ge(r)/ge(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}};function ve(){return[1,0,0,1,0,0]}function me(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function xe(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function _e(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function be(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function we(t,e,n,i){void 0===i&&(i=[0,0]);var r=e[0],o=e[2],a=e[4],s=e[1],l=e[3],u=e[5],h=Math.sin(n),c=Math.cos(n);return t[0]=r*c+s*h,t[1]=-r*h+s*c,t[2]=o*c+l*h,t[3]=-o*h+c*l,t[4]=c*(a-i[0])+h*(u-i[1])+i[0],t[5]=c*(u-i[1])-h*(a-i[0])+i[1],t}function Se(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Me(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Ie(t){var e=[1,0,0,1,0,0];return xe(e,t),e}var Te=Object.freeze({__proto__:null,create:ve,identity:me,copy:xe,mul:_e,translate:be,rotate:we,scale:Se,invert:Me,clone:Ie}),Ce=function(){function t(t,e){this.x=t||0,this.y=e||0}return t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.scale=function(t){this.x*=t,this.y*=t},t.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.dot=function(t){return this.x*t.x+this.y*t.y},t.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},t.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},t.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},t.prototype.distanceSquare=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},t.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},t.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},t.set=function(t,e,n){t.x=e,t.y=n},t.copy=function(t,e){t.x=e.x,t.y=e.y},t.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.lenSquare=function(t){return t.x*t.x+t.y*t.y},t.dot=function(t,e){return t.x*e.x+t.y*e.y},t.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},t.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},t.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},t.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},t.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},t}(),De=Math.min,Ae=Math.max,ke=new Ce,Le=new Ce,Pe=new Ce,Oe=new Ce,Re=new Ce,Ne=new Ce,Ee=function(){function t(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}return t.prototype.union=function(t){var e=De(t.x,this.x),n=De(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=Ae(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=Ae(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},t.prototype.applyTransform=function(e){t.applyTransform(this,this,e)},t.prototype.calculateTransform=function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=[1,0,0,1,0,0];return be(r,r,[-e.x,-e.y]),Se(r,r,[n,i]),be(r,r,[t.x,t.y]),r},t.prototype.intersect=function(e,n){if(!e)return!1;e instanceof t||(e=t.create(e));var i=this,r=i.x,o=i.x+i.width,a=i.y,s=i.y+i.height,l=e.x,u=e.x+e.width,h=e.y,c=e.y+e.height,p=!(of&&(f=x,gf&&(f=_,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}ke.x=Pe.x=n.x,ke.y=Oe.y=n.y,Le.x=Oe.x=n.x+n.width,Le.y=Pe.y=n.y+n.height,ke.transform(i),Oe.transform(i),Le.transform(i),Pe.transform(i),e.x=De(ke.x,Le.x,Pe.x,Oe.x),e.y=De(ke.y,Le.y,Pe.y,Oe.y);var l=Ae(ke.x,Le.x,Pe.x,Oe.x),u=Ae(ke.y,Le.y,Pe.y,Oe.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),ze="silent";function Ve(){pe(this.event)}var Be=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return e(n,t),n.prototype.dispose=function(){},n.prototype.setCursor=function(){},n}(Zt),Fe=function(t,e){this.x=t,this.y=e},Ge=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],We=new Ee(0,0,0,0),He=function(t){function n(e,n,i,r,o){var a=t.call(this)||this;return a._hovered=new Fe(0,0),a.storage=e,a.painter=n,a.painterRoot=r,a._pointerSize=o,i=i||new Be,a.proxy=null,a.setHandlerProxy(i),a._draggingMgr=new Ut(a),a}return e(n,t),n.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(N(Ge,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},n.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=Ue(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new Fe(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},n.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},n.prototype.resize=function(){this._hovered=new Fe(0,0)},n.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},n.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},n.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},n.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:Ve}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},n.prototype.findHover=function(t,e,n){var i=this.storage.getDisplayList(),r=new Fe(t,e);if(Xe(i,r,t,e,n),this._pointerSize&&!r.target){for(var o=[],a=this._pointerSize,s=a/2,l=new Ee(t-s,e-s,a,a),u=i.length-1;u>=0;u--){var h=i[u];h===n||h.ignore||h.ignoreCoarsePointer||h.parent&&h.parent.ignoreCoarsePointer||(We.copy(h.getBoundingRect()),h.transform&&We.applyTransform(h.transform),We.intersect(l)&&o.push(h))}if(o.length)for(var c=Math.PI/12,p=2*Math.PI,d=0;d=0;o--){var a=t[o],s=void 0;if(a!==r&&!a.ignore&&(s=Ye(a,n,i))&&(!e.topTarget&&(e.topTarget=a),s!==ze)){e.target=a;break}}}function Ue(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}N(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){He.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=Ue(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||zt(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function Ze(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function je(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function qe(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Ke(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function $e(t,e){var n,i,r=7,o=0,a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Ke(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=qe(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-qe(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=Ze(t,n,i,e))s&&(l=s),je(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var Qe=!1;function tn(){Qe||(Qe=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function en(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var nn=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=en}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(tn(),u.z=0),isNaN(u.z2)&&(tn(),u.z2=0),isNaN(u.zlevel)&&(tn(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),rn=i.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},on={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-on.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*on.bounceIn(2*t):.5*on.bounceOut(2*t-1)+.5}},an=Math.pow,sn=Math.sqrt,ln=1e-8,un=1e-4,hn=sn(3),cn=1/3,pn=St(),dn=St(),fn=St();function gn(t){return t>-1e-8&&tln||t<-1e-8}function vn(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function mn(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function xn(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(gn(h)&&gn(c)){if(gn(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(gn(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=sn(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-an(-m,cn):an(m,cn))+(x=x<0?-an(-x,cn):an(x,cn))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*sn(h*h*h)),b=Math.acos(_)/3,w=sn(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+hn*Math.sin(b)))/(3*a),(-s+w*(S-hn*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function _n(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(gn(a)){if(yn(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(gn(u))r[0]=-o/(2*a);else if(u>0){var h,c=sn(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function bn(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function wn(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;pn[0]=l,pn[1]=u;for(var m=0;m<1;m+=.05)dn[0]=vn(t,n,r,a,m),dn[1]=vn(e,i,o,s,m),(f=Bt(pn,dn))=0&&f=0&&y=1?1:xn(0,i,o,1,t,s)&&vn(0,r,a,1,s[0])}}}var Pn=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||_t,this.ondestroy=t.ondestroy||_t,this.onrestart=t.onrestart||_t,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=Y(t)?t:on[t]||Ln(t)},t}(),On=function(t){this.value=t},Rn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new On(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),Nn=function(){function t(t){this._list=new Rn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new On(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),En={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function zn(t){return(t=Math.round(t))<0?0:t>255?255:t}function Vn(t){return t<0?0:t>1?1:t}function Bn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?zn(parseFloat(e)/100*255):zn(parseInt(e,10))}function Fn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?Vn(parseFloat(e)/100):Vn(parseFloat(e))}function Gn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Wn(t,e,n){return t+(e-t)*n}function Hn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function Yn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var Xn=new Nn(20),Un=null;function Zn(t,e){Un&&Yn(Un,e),Un=Xn.put(t,Un||e.slice())}function jn(t,e){if(t){e=e||[];var n=Xn.get(t);if(n)return Yn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in En)return Yn(e,En[i]),Zn(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(Hn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),Zn(t,e),e):void Hn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(Hn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),Zn(t,e),e):void Hn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?Hn(e,+u[0],+u[1],+u[2],1):Hn(e,0,0,0,1);h=Fn(u.pop());case"rgb":return u.length>=3?(Hn(e,Bn(u[0]),Bn(u[1]),Bn(u[2]),3===u.length?h:Fn(u[3])),Zn(t,e),e):void Hn(e,0,0,0,1);case"hsla":return 4!==u.length?void Hn(e,0,0,0,1):(u[3]=Fn(u[3]),qn(u,e),Zn(t,e),e);case"hsl":return 3!==u.length?void Hn(e,0,0,0,1):(qn(u,e),Zn(t,e),e);default:return}}Hn(e,0,0,0,1)}}function qn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Fn(t[1]),r=Fn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return Hn(e=e||[],zn(255*Gn(a,o,n+1/3)),zn(255*Gn(a,o,n)),zn(255*Gn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Kn(t,e){var n=jn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return ii(n,4===n.length?"rgba":"rgb")}}function $n(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=zn(Wn(a[0],s[0],l)),n[1]=zn(Wn(a[1],s[1],l)),n[2]=zn(Wn(a[2],s[2],l)),n[3]=Vn(Wn(a[3],s[3],l)),n}}var Jn=$n;function Qn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=jn(e[r]),s=jn(e[o]),l=i-r,u=ii([zn(Wn(a[0],s[0],l)),zn(Wn(a[1],s[1],l)),zn(Wn(a[2],s[2],l)),Vn(Wn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var ti=Qn;function ei(t,e,n,i){var r=jn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=Fn(n)),null!=i&&(r[2]=Fn(i)),ii(qn(r),"rgba")}function ni(t,e){var n=jn(t);if(n&&null!=e)return n[3]=Vn(e),ii(n,"rgba")}function ii(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function ri(t,e){var n=jn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var oi=new Nn(100);function ai(t){if(X(t)){var e=oi.get(t);return e||(e=Kn(t,-.1),oi.put(t,e)),e}if(J(t)){var n=D({},t);return n.colorStops=E(t.colorStops,(function(t){return{offset:t.offset,color:Kn(t.color,-.1)}})),n}return t}var si=Object.freeze({__proto__:null,parse:jn,lift:Kn,toHex:function(t){var e=jn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:$n,fastMapToColor:Jn,lerp:Qn,mapToColor:ti,modifyHSL:ei,modifyAlpha:ni,stringify:ii,lum:ri,random:function(){return ii([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")},liftColor:ai}),li=Math.round;function ui(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=jn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var hi=1e-4;function ci(t){return t-1e-4}function pi(t){return li(1e3*t)/1e3}function di(t){return li(1e4*t)/1e4}var fi={left:"start",right:"end",center:"middle",middle:"middle"};function gi(t){return t&&!!t.image}function yi(t){return gi(t)||function(t){return t&&!!t.svgElement}(t)}function vi(t){return"linear"===t.type}function mi(t){return"radial"===t.type}function xi(t){return t&&("linear"===t.type||"radial"===t.type)}function _i(t){return"url(#"+t+")"}function bi(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function wi(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*bt,r=it(t.scaleX,1),o=it(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+li(a*bt)+"deg, "+li(s*bt)+"deg)"),l.join(" ")}var Si=i.hasGlobalWindow&&Y(window.btoa)?function(t){return window.btoa(unescape(encodeURIComponent(t)))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Mi=Array.prototype.slice;function Ii(t,e,n){return(e-t)*n+t}function Ti(t,e,n,i){for(var r=e.length,o=0;oi?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;sa)i.length=a;else for(var s=o;s=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(R(e)){var l=function(t){return R(t&&t[0])?2:1}(e);a=l,(1===l&&!Z(e[0])||2===l&&!Z(e[0][0]))&&(o=!0)}else if(Z(e)&&!et(e))a=0;else if(X(e))if(isNaN(+e)){var u=jn(e);u&&(s=u,a=3)}else a=0;else if(J(e)){var h=D({},s);h.colorStops=E(e.colorStops,(function(t){return{offset:t.offset,color:jn(t.color)}})),vi(e)?a=4:mi(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=Y(n)?n:on[n]||Ln(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=Ri(i),l=Oi(i),u=0;u=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;ne);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?Ni:t[h];if(!Ri(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(Ri(s))1===s?Ti(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a0&&s.addKeyframe(0,Li(l),i),this._trackKeys.push(a)}s.addKeyframe(t,Li(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function Vi(){return(new Date).getTime()}var Bi,Fi,Gi=function(t){function n(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return e(n,t),n.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},n.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},n.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},n.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},n.prototype.update=function(t){for(var e=Vi()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},n.prototype._startLoop=function(){var t=this;this._running=!0,rn((function e(){t._running&&(rn(e),!t._paused&&t.update())}))},n.prototype.start=function(){this._running||(this._time=Vi(),this._pausedTime=0,this._startLoop())},n.prototype.stop=function(){this._running=!1},n.prototype.pause=function(){this._paused||(this._pauseStart=Vi(),this._paused=!0)},n.prototype.resume=function(){this._paused&&(this._pausedTime+=Vi()-this._pauseStart,this._paused=!1)},n.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},n.prototype.isFinished=function(){return null==this._head},n.prototype.animate=function(t,e){e=e||{},this.start();var n=new zi(t,e.loop);return this.addAnimator(n),n},n}(Zt),Wi=i.domSupported,Hi=(Fi={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:Bi=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:E(Bi,(function(t){var e=t.replace("mouse","pointer");return Fi.hasOwnProperty(e)?e:t}))}),Yi=["mousemove","mouseup"],Xi=["pointermove","pointerup"],Ui=!1;function Zi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function ji(t){t&&(t.zrByTouch=!0)}function qi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var Ki=function(t,e){this.stopPropagation=_t,this.stopImmediatePropagation=_t,this.preventDefault=_t,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},$i={mousedown:function(t){t=he(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=he(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=he(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){qi(this,(t=he(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){Ui=!0,t=he(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){Ui||(t=he(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){ji(t=he(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),$i.mousemove.call(this,t),$i.mousedown.call(this,t)},touchmove:function(t){ji(t=he(this.dom,t)),this.handler.processGesture(t,"change"),$i.mousemove.call(this,t)},touchend:function(t){ji(t=he(this.dom,t)),this.handler.processGesture(t,"end"),$i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&$i.click.call(this,t)},pointerdown:function(t){$i.mousedown.call(this,t)},pointermove:function(t){Zi(t)||$i.mousemove.call(this,t)},pointerup:function(t){$i.mouseup.call(this,t)},pointerout:function(t){Zi(t)||$i.mouseout.call(this,t)}};N(["click","dblclick","contextmenu"],(function(t){$i[t]=function(e){e=he(this.dom,e),this.trigger(t,e)}}));var Ji={pointermove:function(t){Zi(t)||Ji.mousemove.call(this,t)},pointerup:function(t){Ji.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function Qi(t,e){var n=e.domHandlers;i.pointerEventsSupported?N(Hi.pointer,(function(i){er(e,i,(function(e){n[i].call(t,e)}))})):(i.touchEventsSupported&&N(Hi.touch,(function(i){er(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),N(Hi.mouse,(function(i){er(e,i,(function(r){r=ue(r),e.touching||n[i].call(t,r)}))})))}function tr(t,e){function n(n){er(e,n,(function(i){i=ue(i),qi(t,i.target)||(i=function(t,e){return he(t.dom,new Ki(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}i.pointerEventsSupported?N(Xi,n):i.touchEventsSupported||N(Yi,n)}function er(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ce(t.domTarget,e,n,i)}function nr(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var ir=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},rr=function(t){function n(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new ir(e,$i),Wi&&(i._globalHandlerScope=new ir(document,Ji)),Qi(i,i._localHandlerScope),i}return e(n,t),n.prototype.dispose=function(){nr(this._localHandlerScope),Wi&&nr(this._globalHandlerScope)},n.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},n.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,Wi&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?tr(this,e):nr(e)}},n}(Zt),or=1;i.hasGlobalWindow&&(or=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var ar=or,sr="#333",lr="#ccc",ur=me,hr=5e-5;function cr(t){return t>hr||t<-5e-5}var pr=[],dr=[],fr=[1,0,0,1,0,0],gr=Math.abs,yr=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return cr(this.rotation)||cr(this.x)||cr(this.y)||cr(this.scaleX-1)||cr(this.scaleY-1)||cr(this.skewX)||cr(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):ur(n),t&&(e?_e(n,t,n):xe(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&(ur(n),this.invTransform=null)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(pr);var n=pr[0]<0?-1:1,i=pr[1]<0?-1:1,r=((pr[0]-n)*e+n)/pr[0]||0,o=((pr[1]-i)*e+i)/pr[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Me(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(t.invTransform=t.invTransform||[1,0,0,1,0,0],_e(dr,t.invTransform,e),e=dr);var n=this.originX,i=this.originY;(n||i)&&(fr[4]=n,fr[5]=i,_e(dr,e,fr),dr[4]-=n,dr[5]-=i,e=dr),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Gt(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Gt(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&gr(t[0]-1)>1e-10&&gr(t[3]-1)>1e-10?Math.sqrt(gr(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){mr(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&we(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),vr=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function mr(t,e){for(var n=0;n=0?parseFloat(t)/100*e:parseFloat(t):t}function Cr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=Tr(i[0],n.width),u+=Tr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var Dr="__zr_normal__",Ar=vr.concat(["ignore"]),kr=z(vr,(function(t,e){return t[e]=!0,t}),{ignore:!1}),Lr={},Pr=new Ee(0,0,0,0),Or=function(){function t(t){this.id=S(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=Pr;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Lr,n,u):Cr(Lr,n,u),r.x=Lr.x,r.y=Lr.y,o=Lr.align,a=Lr.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=Tr(h[0],u.width),p=Tr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?lr:sr},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&jn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,ii(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},D(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(j(t))for(var n=F(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(Dr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===Dr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(L(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}M("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype.isSilent=function(){for(var t=this.silent,e=this.parent;!t&&e;){if(e.silent){t=!0;break}e=e.parent}return t},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=L(i,t),o=L(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_=0&&(n.splice(i,0,t),this._doAdd(t))}return this},n.prototype.replace=function(t,e){var n=L(this._children,t);return n>=0&&this.replaceAt(e,n),this},n.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},n.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},n.prototype.remove=function(t){var e=this.__zr,n=this._children,i=L(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},n.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this._disposed||(this.animation.start(),this._stillFrameAccum=0)},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._disposed||(this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover())},t.prototype.resize=function(t){this._disposed||(t=t||{},this.painter.resize(t.width,t.height),this.handler.resize())},t.prototype.clearAnimation=function(){this._disposed||this.animation.clear()},t.prototype.getWidth=function(){if(!this._disposed)return this.painter.getWidth()},t.prototype.getHeight=function(){if(!this._disposed)return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this._disposed||this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){if(!this._disposed)return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this._disposed||this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this._disposed||this.handler.off(t,e)},t.prototype.trigger=function(t,e){this._disposed||this.handler.trigger(t,e)},t.prototype.clear=function(){if(!this._disposed){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Kr(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function $r(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Jr(t){return t.sort((function(t,e){return t-e})),t}function Qr(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return to(t)}function to(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function eo(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function no(t,e){var n=z(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===n)return[];for(var i=Math.pow(10,e),r=E(t,(function(t){return(isNaN(t)?0:t)/n*i*100})),o=100*i,a=E(r,(function(t){return Math.floor(t)})),s=z(a,(function(t,e){return t+e}),0),l=E(r,(function(t,e){return t-a[e]}));su&&(u=l[c],h=c);++a[h],l[h]=0,++s}return E(a,(function(t){return t/i}))}function io(t,e){var n=Math.max(Qr(t),Qr(e)),i=t+e;return n>20?i:$r(i,n)}var ro=9007199254740991;function oo(t){var e=2*Math.PI;return(t%e+e)%e}function ao(t){return t>-1e-4&&t=10&&e++,e}function co(t,e){var n=ho(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function po(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function fo(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&L(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var ia=na([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),ra=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return ia(this,t,e)},t}(),oa=new Nn(50);function aa(t){if("string"==typeof t){var e=oa.get(t);return e&&e.image}return t}function sa(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=oa.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!ua(e=o.image)&&o.pending.push(a):((e=u.loadImage(t,la,la)).__zrImageSrc=t,oa.put(t,e.__cachedImgObj={image:e,pending:[a]})),e}return t}return e}function la(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=_r(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function da(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=_r(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?fa(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=_r(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function fa(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=ba(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=32&&e<=591||e>=880&&e<=4351||e>=4608&&e<=5119||e>=7680&&e<=8303}(t)||!!xa[t]}function ba(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var wa="__zr_style_"+Math.round(10*Math.random()),Sa={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},Ma={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};Sa[wa]=!0;var Ia=["z","z2","invisible"],Ta=["invisible"],Ca=function(t){function n(e){return t.call(this,e)||this}var i;return e(n,t),n.prototype._init=function(e){for(var n=F(e),i=0;i1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(Na[0]=Oa(r)*n+t,Na[1]=Pa(r)*i+e,Ea[0]=Oa(o)*n+t,Ea[1]=Pa(o)*i+e,u(s,Na,Ea),h(l,Na,Ea),(r%=Ra)<0&&(r+=Ra),(o%=Ra)<0&&(o+=Ra),r>o&&!a?o+=Ra:rr&&(za[0]=Oa(d)*n+t,za[1]=Pa(d)*i+e,u(s,za,s),h(l,za,l))}var Xa={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Ua=[],Za=[],ja=[],qa=[],Ka=[],$a=[],Ja=Math.min,Qa=Math.max,ts=Math.cos,es=Math.sin,ns=Math.abs,is=Math.PI,rs=2*is,os="undefined"!=typeof Float32Array,as=[];function ss(t){return Math.round(t/is*1e8)/1e8%2*is}function ls(t,e){var n=ss(t[0]);n<0&&(n+=rs);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=rs?r=n+rs:e&&n-r>=rs?r=n-rs:!e&&n>r?r=n+(rs-ss(n-r)):e&&n0&&(this._ux=ns(n/ar/t)||0,this._uy=ns(n/ar/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(Xa.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=ns(t-this._xi),i=ns(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(Xa.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(Xa.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(Xa.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),as[0]=i,as[1]=r,ls(as,o),i=as[0];var a=(r=as[1])-i;return this.addData(Xa.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=ts(r)*n+t,this._yi=es(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Xa.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(Xa.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!os||(this.data=new Float32Array(e));for(var n=0;nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){ja[0]=ja[1]=Ka[0]=Ka[1]=Number.MAX_VALUE,qa[0]=qa[1]=$a[0]=$a[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||ns(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case Xa.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=Sn(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case Xa.Q:f=An(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case Xa.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1,d&&(a=ts(T)*M+w,s=es(T)*I+S),f=Qa(M,I)*Ja(rs,Math.abs(C)),r=ts(D)*M+w,o=es(D)*I+S;break;case Xa.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case Xa.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_0&&(t.lineTo(h,c),x=0),b){case Xa.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case Xa.L:a=p[_++],s=p[_++];var S=ns(a-r),M=ns(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case Xa.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){bn(r,C,A,L,I=(u-v)/j,Ua),bn(o,D,k,P,I,Za),t.bezierCurveTo(Ua[1],Za[1],Ua[2],Za[2],Ua[3],Za[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case Xa.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){Cn(r,C,A,I=(u-v)/j,Ua),Cn(o,D,k,I,Za),t.quadraticCurveTo(Ua[1],Za[1],Ua[2],Za[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case Xa.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=ns(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=ts(z)*N+O,i=es(z)*E+R),r=ts(H)*N+O,o=es(H)*E+R;break;case Xa.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var X=p[_++],U=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Ja(Z,X),s),(Z-=X)>0&&t.lineTo(a+X,s+Ja(Z,U)),(Z-=U)>0&&t.lineTo(a+Qa(X-Z,0),s+U),(Z-=X)>0&&t.lineTo(a,s+Qa(U-Z,0));break t}v+=j}t.rect(a,s,X,U);break;case Xa.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=Xa,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function hs(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=gs);var p=Math.atan2(l,s);return p<0&&(p+=gs),p>=i&&p<=r||p+gs>=i&&p+gs<=r}function vs(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var ms=us.CMD,xs=2*Math.PI;var _s=[-1,-1,-1],bs=[-1,-1];function ws(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(h=void 0,h=bs[0],bs[0]=bs[1],bs[1]=h),f=vn(e,i,o,s,bs[0]),d>1&&(g=vn(e,i,o,s,bs[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(gn(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=sn(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,_s);if(0===l)return 0;var u=Tn(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Mn(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);_s[0]=-l,_s[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=xs-1e-4){i=0,r=xs;var h=o?1:-1;return a>=_s[0]+t&&a<=_s[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=xs,r+=xs);for(var p=0,d=0;d<2;d++){var f=_s[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=xs+g),(g>=i&&g<=r||g+xs>=i&&g+xs<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function Is(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=vs(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case ms.M:p=f=u[y++],d=g=u[y++];break;case ms.L:if(n){if(hs(p,d,u[y],u[y+1],e,i,r))return!0}else c+=vs(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case ms.C:if(n){if(cs(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ws(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case ms.Q:if(n){if(ps(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=Ss(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case ms.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=vs(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(ys(x,_,w,S,S+M,I,e,T,r))return!0}else c+=Ms(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case ms.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(hs(f,g,o,g,e,i,r)||hs(o,g,o,a,e,i,r)||hs(o,a,f,a,e,i,r)||hs(f,a,f,g,e,i,r))return!0}else c+=vs(o,g,o,a,i,r),c+=vs(f,a,f,g,i,r);break;case ms.Z:if(n){if(hs(p,d,f,g,e,i,r))return!0}else c+=vs(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=vs(p,d,f,g,i,r)||0),0!==c}var Ts=A({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},Sa),Cs={style:A({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},Ma.style)},Ds=vr.concat(["invisible","culling","z","z2","zlevel","parent"]),As=function(t){function n(e){return t.call(this,e)||this}var i;return e(n,t),n.prototype.update=function(){var e=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new n;r.buildPath===n.prototype.buildPath&&(r.buildPath=function(t){e.buildPath(t,e.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?sr:e>.2?"#eee":lr}if(t)return lr}return sr},n.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===ri(t,0)<.4)return e}},n.prototype.buildPath=function(t,e,n){},n.prototype.pathUpdated=function(){this.__dirty&=-5},n.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},n.prototype.createPathProxy=function(){this.path=new us(!1)},n.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},n.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},n.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},n.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return Is(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return Is(t,0,!1,e,n)}(o,t,e)}return!1},n.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},n.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},n.prototype.animateShape=function(t){return this.animate("shape",t)},n.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},n.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},n.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:D(n,t),this.dirtyShape(),this},n.prototype.shapeChanged=function(){return!!(4&this.__dirty)},n.prototype.createStyle=function(t){return vt(Ts,t)},n.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=D({},this.shape))},n.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=D({},i.shape),D(s,n.shape)):(s=D({},r?this.shape:i.shape),D(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=D({},this.shape);for(var u={},h=F(s),c=0;c0},n.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},n.prototype.createStyle=function(t){return vt(ks,t)},n.prototype.setBoundingRect=function(t){this._rect=t},n.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=wr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},n.initDefaultProps=void(n.prototype.dirtyRectTolerance=10),n}(Ca);Ls.prototype.type="tspan";var Ps=A({x:0,y:0},Sa),Os={style:A({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},Ma.style)};var Rs=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.createStyle=function(t){return vt(Ps,t)},n.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},n.prototype.getWidth=function(){return this._getSize("width")},n.prototype.getHeight=function(){return this._getSize("height")},n.prototype.getAnimationStyleProps=function(){return Os},n.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new Ee(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},n}(Ca);Rs.prototype.type="image";var Ns=Math.round;function Es(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(Ns(2*i)===Ns(2*r)&&(t.x1=t.x2=Vs(i,s,!0)),Ns(2*o)===Ns(2*a)&&(t.y1=t.y2=Vs(o,s,!0)),t):t}}function zs(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Vs(i,s,!0),t.y=Vs(r,s,!0),t.width=Math.max(Vs(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Vs(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Vs(t,e,n){if(!e)return t;var i=Ns(2*t);return(i+Ns(e))%2==0?i/2:(i+(n?1:-1))/2}var Bs=function(){this.x=0,this.y=0,this.width=0,this.height=0},Fs={},Gs=function(t){function n(e){return t.call(this,e)||this}return e(n,t),n.prototype.getDefaultShape=function(){return new Bs},n.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=zs(Fs,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},n.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},n}(As);Gs.prototype.type="rect";var Ws={fill:"#000"},Hs={style:A({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},Ma.style)},Ys=function(t){function n(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Ws,n.attr(e),n}return e(n,t),n.prototype.childrenRef=function(){return this._children},n.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ed&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=pa(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;Dl&&ma(n,t.substring(l,u),e,s),ma(n,i[2],e,s,i[1]),l=ha.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=_r(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&ua(k=aa(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},n.prototype._placeToken=function(t,e,n,i,r,a,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&nl(l)&&this._renderBackground(l,e,"right"===a?r-t.width:"center"===a?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=tl(r,a,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(Ls),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Qs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=Js("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=a,f.textBaseline="middle",f.font=t.font||o,f.opacity=rt(l.opacity,e.opacity,1),qs(f,l),x&&(f.lineWidth=rt(l.lineWidth,e.lineWidth,v),f.lineDash=it(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new Ee(Sr(f.x,b,f.textAlign),Mr(f.y,w,f.textBaseline),b,w))},n.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Gs)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=it(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(Rs)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=it(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=rt(t.opacity,e.opacity,1)},n.makeFont=function(t){var e="";return Ks(t)&&(e=[t.fontStyle,t.fontWeight,js(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&<(e)||t.textFont||t.font},n}(Ca),Xs={left:!0,right:1,center:1},Us={top:1,bottom:1,middle:1},Zs=["fontStyle","fontWeight","fontSize","fontFamily"];function js(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function qs(t,e){for(var n=0;n=0,o=!1;if(t instanceof As){var a=sl(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(vl(s)||vl(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=D({},i),(u=D({},u)).fill=s):!vl(u.fill)&&vl(s)?(o=!0,i=D({},i),(u=D({},u)).fill=ai(s)):!vl(u.stroke)&&vl(l)&&(o||(i=D({},i),u=D({},u)),u.stroke=ai(l)),i.style=u}}if(i&&null==i.z2){o||(i=D({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:cl)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=L(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Xl(t,e,n){$l(t,!0),Tl(t,Al),Zl(t,e,n)}function Ul(t,e,n,i){i?function(t){$l(t,!1)}(t):Xl(t,e,n)}function Zl(t,e,n){var i=il(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var jl=["emphasis","blur","select"],ql={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Kl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=au(f),s*=au(f));var g=(r===o?-1:1)*au((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+lu(c)*y-su(c)*v,x=(e+i)/2+su(c)*y+lu(c)*v,_=pu([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=pu(b,w);if(cu(b,w)<=-1&&(S=uu),cu(b,w)>=1&&(S=0),S<0){var M=Math.round(S/uu*1e6)/1e6;S=2*uu+M%2*uu}h.addData(u,m,x,a,s,_,S,c,o)}var fu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,gu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var yu=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.applyTransform=function(t){},n}(As);function vu(t){return null!=t.setData}function mu(t,e){var n=function(t){var e=new us;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=us.CMD,l=t.match(fu);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function zu(t,e){var n,i=Ou(e.r,0),r=Ou(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=Lu(l-s),d=p>Tu&&p%Tu;if(d>Nu&&(p=d),i>Nu)if(p>Tu-Nu)t.moveTo(u+i*Du(s),h+i*Cu(s)),t.arc(u,h,i,s,l,!c),r>Nu&&(t.moveTo(u+r*Du(l),h+r*Cu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*Du(s),L=i*Cu(s),P=r*Du(l),O=r*Cu(l),R=p>Nu;if(R){var N=e.cornerRadius;N&&(n=function(t){var e;if(H(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N),f=n[0],g=n[1],y=n[2],v=n[3]);var E=Lu(i-r)/2;if(m=Ru(E,y),x=Ru(E,v),_=Ru(E,f),b=Ru(E,g),M=w=Ou(m,x),I=S=Ou(_,b),(w>Nu||S>Nu)&&(T=i*Du(l),C=i*Cu(l),D=r*Du(s),A=r*Cu(s),pNu){var X=Ru(y,M),U=Ru(v,M),Z=Eu(D,A,k,L,i,X,c),j=Eu(T,C,P,O,i,U,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M0&&t.arc(u+Z.cx,h+Z.cy,X,ku(Z.y0,Z.x0),ku(Z.y1,Z.x1),!c),t.arc(u,h,i,ku(Z.cy+Z.y1,Z.cx+Z.x1),ku(j.cy+j.y1,j.cx+j.x1),!c),U>0&&t.arc(u+j.cx,h+j.cy,U,ku(j.y1,j.x1),ku(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>Nu&&R)if(I>Nu){X=Ru(f,I),Z=Eu(P,O,T,C,r,-(U=Ru(g,I)),c),j=Eu(k,L,D,A,r,-X,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I0&&t.arc(u+Z.cx,h+Z.cy,U,ku(Z.y0,Z.x0),ku(Z.y1,Z.x1),!c),t.arc(u,h,r,ku(Z.cy+Z.y1,Z.cx+Z.x1),ku(j.cy+j.y1,j.cx+j.x1),c),X>0&&t.arc(u+j.cx,h+j.cy,X,ku(j.y1,j.x1),ku(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Vu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Bu=function(t){function n(e){return t.call(this,e)||this}return e(n,t),n.prototype.getDefaultShape=function(){return new Vu},n.prototype.buildPath=function(t,e){zu(t,e)},n.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},n}(As);Bu.prototype.type="sector";var Fu=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Gu=function(t){function n(e){return t.call(this,e)||this}return e(n,t),n.prototype.getDefaultShape=function(){return new Fu},n.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},n}(As);function Wu(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;psh[1]){if(a=!1,r)return a;var u=Math.abs(sh[0]-ah[1]),h=Math.abs(ah[0]-sh[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function yh(t,e,n,i,r,o){gh("update",t,e,n,i,r,o)}function vh(t,e,n,i,r,o){gh("enter",t,e,n,i,r,o)}function mh(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Gh(t){return!t.isGroup}function Wh(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Gh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Gh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),yh(t,i,n,il(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=D({},t.shape)),e}}function Hh(t,e){return E(t,(function(t){var n=t[0];n=Sh(n,e.x),n=Mh(n,e.x+e.width);var i=t[1];return i=Sh(i,e.y),[n,i=Mh(i,e.y+e.height)]}))}function Yh(t,e){var n=Sh(t.x,e.x),i=Mh(t.x+t.width,e.x+e.width),r=Sh(t.y,e.y),o=Mh(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Xh(t,e,n){var i=D({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),A(r,n),new Rs(i)):Lh(t.replace("path://",""),i,n,"center")}function Uh(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=jh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=jh(f,g,c,p)/d;return!(v<0||v>1)}function jh(t,e,n,i){return t*i-n*e}function qh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&N(F(l),(function(t){xt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=il(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:A({content:i,encodeHTMLContent:!0,formatterParams:s},r)}}function Kh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function $h(t,e){if(t)if(H(t))for(var n=0;n-1?kc:Pc;function Ec(t,e){t=t.toUpperCase(),Rc[t]=new Tc(e),Oc[t]=e}function zc(t){return Rc[t]}Ec(Lc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst",custom:"Custom chart",chart:"Chart"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Ec(kc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图",custom:"自定义图表",chart:"图表"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Vc=1e3,Bc=6e4,Fc=36e5,Gc=864e5,Wc=31536e6,Hc={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},Yc="{yyyy}-{MM}-{dd}",Xc={year:"{yyyy}",month:"{yyyy}-{MM}",day:Yc,hour:Yc+" "+Hc.hour,minute:Yc+" "+Hc.minute,second:Yc+" "+Hc.second,millisecond:Hc.none},Uc=["year","month","day","hour","minute","second","millisecond"],Zc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function jc(t,e){return"0000".substr(0,e-(t+="").length)+t}function qc(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function Kc(t){return t===qc(t)}function $c(t,e,n,i){var r=lo(t),o=r[tp(n)](),a=r[ep(n)]()+1,s=Math.floor((a-1)/3)+1,l=r[np(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[ip(n)](),c=(h-1)%12+1,p=r[rp(n)](),d=r[op(n)](),f=r[ap(n)](),g=h>=12?"pm":"am",y=g.toUpperCase(),v=(i instanceof Tc?i:zc(i||Nc)||Rc[Pc]).getModel("time"),m=v.get("month"),x=v.get("monthAbbr"),_=v.get("dayOfWeek"),b=v.get("dayOfWeekAbbr");return(e||"").replace(/{a}/g,g+"").replace(/{A}/g,y+"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,jc(o%100+"",2)).replace(/{Q}/g,s+"").replace(/{MMMM}/g,m[a-1]).replace(/{MMM}/g,x[a-1]).replace(/{MM}/g,jc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,jc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,_[u]).replace(/{ee}/g,b[u]).replace(/{e}/g,u+"").replace(/{HH}/g,jc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,jc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,jc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,jc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,jc(f,3)).replace(/{S}/g,f+"")}function Jc(t,e){var n=lo(t),i=n[ep(e)]()+1,r=n[np(e)](),o=n[ip(e)](),a=n[rp(e)](),s=n[op(e)](),l=0===n[ap(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Qc(t,e,n){var i=Z(t)?lo(t):t;switch(e=e||Jc(t,n)){case"year":return i[tp(n)]();case"half-year":return i[ep(n)]()>=6?1:0;case"quarter":return Math.floor((i[ep(n)]()+1)/4);case"month":return i[ep(n)]();case"day":return i[np(n)]();case"half-day":return i[ip(n)]()/24;case"hour":return i[ip(n)]();case"minute":return i[rp(n)]();case"second":return i[op(n)]();case"millisecond":return i[ap(n)]()}}function tp(t){return t?"getUTCFullYear":"getFullYear"}function ep(t){return t?"getUTCMonth":"getMonth"}function np(t){return t?"getUTCDate":"getDate"}function ip(t){return t?"getUTCHours":"getHours"}function rp(t){return t?"getUTCMinutes":"getMinutes"}function op(t){return t?"getUTCSeconds":"getSeconds"}function ap(t){return t?"getUTCMilliseconds":"getMilliseconds"}function sp(t){return t?"setUTCFullYear":"setFullYear"}function lp(t){return t?"setUTCMonth":"setMonth"}function up(t){return t?"setUTCDate":"setDate"}function hp(t){return t?"setUTCHours":"setHours"}function cp(t){return t?"setUTCMinutes":"setMinutes"}function pp(t){return t?"setUTCSeconds":"setSeconds"}function dp(t){return t?"setUTCMilliseconds":"setMilliseconds"}function fp(t){if(!yo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function gp(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var yp=at;function vp(t,e,n){function i(t){return t&<(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?lo(t):t;if(!isNaN(+s))return $c(s,"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return U(t)?i(t):Z(t)&&r(t)?t+"":"-";var l=go(t);return r(l)?fp(l):U(t)?i(t):"boolean"==typeof t?t+"":"-"}var mp=["a","b","c","d","e","f","g"],xp=function(t,e){return"{"+t+(null==e?"":e)+"}"};function _p(t,e,n){H(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function wp(t,e){return e=e||"transparent",X(t)?t:j(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function Sp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var Mp=N,Ip=["left","right","top","bottom","width","height"],Tp=[["width","left","right"],["height","top","bottom"]];function Cp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var Dp=Cp;W(Cp,"vertical"),W(Cp,"horizontal");function Ap(t,e,n){n=yp(n||0);var i=e.width,r=e.height,o=Kr(t.left,i),a=Kr(t.top,r),s=Kr(t.right,i),l=Kr(t.bottom,r),u=Kr(t.width,i),h=Kr(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new Ee(o+n[3],a+n[0],u,h);return f.margin=n,f}function kp(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new Ee(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=Ap(A({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function Lp(t){var e=t.layoutMode||t.constructor.layoutMode;return j(e)?e:e?{type:e}:null}function Pp(t,e,n){var i=n&&n.ignoreSize;!H(i)&&(i=[i,i]);var r=a(Tp[0],0),o=a(Tp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(Mp(n,(function(e){u[e]=t[e]})),Mp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=T(o,n[a],!0);e.defaultOption=o}return e.defaultOption},n.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ho(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},n.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},n.prototype.getZLevelKey=function(){return""},n.prototype.setZLevel=function(t){this.option.zlevel=t},n.protoInitialize=function(){var t=n.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),n}(Tc);$o(Ep,Tc),ea(Ep),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=qo(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=qo(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Ep),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return N(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return N(t,(function(t){L(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),N(s,(function(t){L(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);L(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(N(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),N(c.successor,p?f:d)}N(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Ep,(function(t){var e=[];N(Ep.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=E(e,(function(t){return qo(t).main})),"dataset"!==t&&L(e,"dataset")<=0&&e.unshift("dataset");return e}));var zp="";"undefined"!=typeof navigator&&(zp=navigator.platform||"");var Vp="rgba(0, 0, 0, 0.2)",Bp={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Vp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Vp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Vp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Vp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Vp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Vp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:zp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Fp=gt(["tooltip","label","itemName","itemId","itemGroupId","itemChildGroupId","seriesName"]),Gp="original",Wp="arrayRows",Hp="objectRows",Yp="keyedColumns",Xp="typedArray",Up="unknown",Zp="column",jp="row",qp=1,Kp=2,$p=3,Jp=zo();function Qp(t,e,n){var i={},r=ed(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Jp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;N(t=t.slice(),(function(e,n){var r=j(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var dd="\0_ec_inner";var fd=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new Tc(i),this._locale=new Tc(r),this._optionManager=o},n.prototype.setOption=function(t,e,n){var i=vd(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},n.prototype.resetOption=function(t,e){return this._resetOption(t,vd(e))},n.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):sd(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&N(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},n.prototype.mergeOption=function(t){this._mergeOption(t,null)},n.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=gt(),s=e&&e.replaceMergeMainTypeMap;Jp(this).datasetMap=gt(),N(t,(function(t,e){null!=t&&(Ep.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?I(t):T(n[e],t,!0))})),s&&s.each((function(t,e){Ep.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Ep.topologicalTravel(o,Ep.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=rd.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,Io(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=ko(a,o,l);(function(t,e,n){N(t,(function(t){var i=t.newOption;j(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Ep),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;N(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Ep.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=D({componentIndex:n},t.keyInfo);D(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&od(this)}),this),this._seriesIndices||od(this)},n.prototype.getOption=function(){var t=I(this.option);return N(t,(function(e,n){if(Ep.hasClass(n)){for(var i=Io(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!No(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t[dd],t},n.prototype.getTheme=function(){return this._theme},n.prototype.getLocaleModel=function(){return this._locale},n.prototype.setUpdatePayload=function(t){this._payload=t},n.prototype.getUpdatePayload=function(){return this._payload},n.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var Id=N,Td=j,Cd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Dd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Cd.length;n=0;g--){var y=t[g];if(s||(p=y.data.rawIndexOf(y.stackedByDimension,c)),p>=0){var v=y.data.getByRawIndex(y.stackResultDimension,p);if("all"===l||"positive"===l&&v>0||"negative"===l&&v<0||"samesign"===l&&d>=0&&v>0||"samesign"===l&&d<=0&&v<0){d=io(d,v),f=v;break}}}return i[0]=d,i[1]=f,i}))}))}var Ud,Zd,jd,qd,Kd,$d=function(t){this.data=t.data||(t.sourceFormat===Yp?{}:[]),this.sourceFormat=t.sourceFormat||Up,this.seriesLayoutBy=t.seriesLayoutBy||Zp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return vf(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function _f(t){var e,n;return j(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function bf(t){return new wf(t)}var wf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},Df=function(){function t(t,e){if(!Z(e)){var n="";0,bo(n)}this._opFn=Cf[t],this._rvalFloat=go(e)}return t.prototype.evaluate=function(t){return Z(t)?this._opFn(t,this._rvalFloat):this._opFn(go(t),this._rvalFloat)},t}(),Af=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=Z(t)?t:go(t),i=Z(e)?e:go(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return ni?-this._resultLT:0},t}(),kf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=go(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=go(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function Lf(t,e){return"eq"===t||"ne"===t?new kf("eq"===t,e):xt(Cf,t)?new Df(t,e):null}var Pf=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return Mf(t,e)},t}();function Of(t){var e=t.sourceFormat;if(!Bf(e)){var n="";0,bo(n)}return t.data}function Rf(t){var e=t.sourceFormat,n=t.data;if(!Bf(e)){var i="";0,bo(i)}if(e===Wp){for(var r=[],o=0,a=n.length;o65535?Wf:Hf}function jf(t,e,n,i,r){var o=Uf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=E(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Zf(this._rawCount))(Math.min(2*(Math.ceil(s/u)+2),s));c[l++]=h;for(var p=1;pn&&(n=i,r=I)}M>0&&M<_-x&&(c[l++]=Math.min(S,r),r=Math.max(S,r)),c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Zf(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return Mf(t[i],this._dimensions[i])}Ff={arrayRows:t,objectRows:function(t,e,n,i){return Mf(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return Mf(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Kf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Jf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=K(a=o.get("data",!0))?Xp:Gp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=it(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=it(h.sourceHeader,c.sourceHeader),f=it(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Qd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Qd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Qf(o)}var a,s=[],l=[];return N(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Qf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=Io(t),r=i.length,o="";r||bo(o);for(var a=0,s=r;a1||n>0&&!t.noHeader;return N(t.blocks,(function(t){var n=sg(t);n>=e&&(e=n+ +(i&&(!n||og(t)&&!t.noHeader)))})),e}return 0}function lg(t,e,n,i){var r,o=e.noHeader,a=(r=sg(e),{html:ng[r],richText:ig[r]}),s=[],l=e.blocks||[];st(!l||H(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(xt(h,u)){var c=new Af(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}N(l,(function(n,r){var o=e.valueFormatter,l=ag(n)(o?D(D({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):cg(s.join(""),o?n:a.html);if(o)return p;var d=vp(e.header,"ordinal",t.useUTC),f=eg(i,t.renderMode).nameStyle;return"richText"===t.renderMode?pg(t,d,f)+a.richText+p:cg('
'+ie(d)+"
"+p,n)}function ug(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return E(t=H(t)?t:[t],(function(t,e){return vp(t,H(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":vp(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value,e.dataIndex),g=!s||!o,y=!s&&o,v=eg(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":pg(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(H(e)?e.join(" "):e,o)}(t,f,g,y,x)):cg((s?"":c)+(o?"":function(t,e,n){return''+ie(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=H(t)?t:[t],''+E(t,(function(t){return ie(t)})).join("  ")+""}(f,g,y,x)),n)}}function hg(t,e,n,i,r,o){if(t)return ag(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function cg(t,e){return'
'+t+'
'}function pg(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function dg(t,e){return wp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function fg(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var gg=function(){function t(){this.richTextStyles={},this._nextStyleNameId=vo()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=bp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};H(e)?N(e,(function(t){return D(n,t)})):D(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function yg(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=H(c),d=dg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=z(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(rg("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?N(i,(function(t){h(vf(o,n,t),t)})):N(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=vf(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=Ro(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return rg("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[rg("nameValue",{markerType:"item",markerColor:d,name:x,noName:!lt(x),value:e,valueType:n,dataIndex:a})].concat(i||[])})}var vg=zo();function mg(t,e){return t.getName(e)||t.getId(e)}var xg="__universalTransitionEnabled",_g=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return e(n,t),n.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=bf({count:wg,reset:Sg}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(vg(this).sourceManager=new Kf(this)).prepareSource();var i=this.getInitialData(t,n);Ig(i,this),this.dataTask.context.data=i,vg(this).dataBeforeProcessed=i,bg(this),this._initSelectedMapFromData(i)},n.prototype.mergeDefaultAndTheme=function(t,e){var n=Lp(this),i=n?Op(t):{},r=this.subType;Ep.hasClass(r)&&(r+="Series"),T(t,e.getTheme().get(this.subType)),T(t,this.getDefaultOption()),To(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Pp(t,i,n)},n.prototype.mergeOption=function(t,e){t=T(this.option,t,!0),this.fillDataTextStyle(t.data);var n=Lp(this);n&&Pp(this.option,t,n);var i=vg(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);Ig(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,vg(this).dataBeforeProcessed=r,bg(this),this._initSelectedMapFromData(r)},n.prototype.fillDataTextStyle=function(t){if(t&&!K(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(e=!1),!!e},n.prototype.restoreData=function(){this.dataTask.dirty()},n.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=hd.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},n.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},n.prototype.getProgressive=function(){return this.get("progressive")},n.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},n.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},n.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o=0&&n.push(r)}return n},n.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[mg(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},n.prototype.isUniversalTransitionEnabled=function(){if(this[xg])return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},n.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){j(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l0&&this._innerSelect(t,e)}},n.registerClass=function(t){return Ep.registerClass(t)},n.protoInitialize=function(){var t=n.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),n}(Ep);function bg(t){var e=t.name;Ro(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return N(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function wg(t){return t.model.getRawData().count()}function Sg(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Mg}function Mg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Ig(t,e){N(yt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,W(Tg,e))}))}function Tg(t,e){var n=Cg(t);return n&&n.setOutputEnd((e||this).count()),e}function Cg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}O(_g,xf),O(_g,hd),$o(_g,Ep);var Dg=function(){function t(){this.group=new Vr,this.uid=Dc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.toggleBlurSeries=function(t,e,n){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function Ag(){var t=zo();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Ko(Dg),ea(Dg);var kg=zo(),Lg=Ag(),Pg=function(){function t(){this.group=new Vr,this.uid=Dc("viewChart"),this.renderTask=bf({plan:Ng,reset:Eg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&Rg(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&Rg(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){$h(this.group,t)},t.markUpdateMethod=function(t,e){kg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function Og(t,e,n){t&&Jl(t)&&("emphasis"===e?Pl:Ol)(t,n)}function Rg(t,e,n){var i=Eo(t,e),r=e&&null!=e.highlightKey?function(t){var e=al[t];return null==e&&ol<=32&&(e=al[t]=ol++),e}(e.highlightKey):null;null!=i?N(Io(i),(function(e){Og(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){Og(t,n,r)}))}function Ng(t){return Lg(t.model)}function Eg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&kg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),zg[l]}Ko(Pg),ea(Pg);var zg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Vg="\0__throttleOriginMethod",Bg="\0__throttleRate",Fg="\0__throttleType";function Gg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Wg(t,e,n,i){var r=t[e];if(r){var o=r[Vg]||r,a=r[Fg];if(r[Bg]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Gg(o,n,"debounce"===i))[Vg]=o,r[Fg]=i,r[Bg]=n}return r}}function Hg(t,e){var n=t[e];n&&n[Vg]&&(n.clear&&n.clear(),t[e]=n[Vg])}var Yg=zo(),Xg={itemStyle:na(Sc,!0),lineStyle:na(_c,!0)},Ug={lineStyle:"stroke",itemStyle:"fill"};function Zg(t,e){var n=t.visualStyleMapper||Xg[e];return n||(console.warn("Unknown style type '"+e+"'."),Xg.itemStyle)}function jg(t,e){var n=t.visualDrawType||Ug[e];return n||(console.warn("Unknown style type '"+e+"'."),"fill")}var qg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Zg(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=jg(t,i),l=o[s],u=Y(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||Y(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||Y(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=D({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},Kg=new Tc,$g={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Zg(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){Kg.option=n[i];var a=r(Kg);D(t.ensureUniqueItemVisual(e,"style"),a),Kg.option.decal&&(t.setItemVisual(e,"decal",Kg.option.decal),Kg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Jg={performRawSeries:!0,overallReset:function(t){var e=gt();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),Yg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=Yg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=jg(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Qg=Math.PI;var ty=function(){function t(t,e,n,i){this._stageTaskMap=gt(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=gt();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;N(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";st(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}N(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=gt(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||bf({plan:oy,reset:ay,count:uy}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||bf({reset:ey});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=gt(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,bf({reset:ny,onDirty:ry})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}st(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,N(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return Y(t)&&(t={overallReset:t,seriesType:hy(t)}),t.uid=Dc("stageHandler"),e&&(t.visualType=e),t},t}();function ey(t){t.overallReset(t.ecModel,t.api,t.payload)}function ny(t){return t.overallProgress&&iy}function iy(){this.agent.dirty(),this.getDownstream().dirty()}function ry(){this.agent&&this.agent.dirty()}function oy(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function ay(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Io(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?E(e,(function(t,e){return ly(e)})):sy}var sy=ly(0);function ly(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),Sy=["symbol","symbolSize","symbolRotate","symbolOffset"],My=Sy.concat(["symbolKeepAspect"]),Iy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a=0&&Zy(l)?l:.5,t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=Zy(i)?i:0,r=Zy(r)?r:1,o=Zy(o)?o:0,a=Zy(a)?a:0,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:Z(e)?[e]:H(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=E(r,(function(t){return t/a})),o/=a)}return[r,o]}var Jy=new us(!0);function Qy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function tv(t){return"string"==typeof t&&"none"!==t}function ev(t){var e=t.fill;return null!=e&&"none"!==e}function nv(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function iv(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function rv(t,e,n){var i=sa(e.image,e.__image,n);if(ua(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*bt),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var ov=["shadowBlur","shadowOffsetX","shadowOffsetY"],av=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function sv(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){hv(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?Sa.opacity:a}(i||e.blend!==n.blend)&&(o||(hv(t,r),o=!0),t.globalCompositeOperation=e.blend||Sa.blend);for(var s=0;s0&&t.unfinished);t.unfinished||this._zr.flush()}}},n.prototype.getDom=function(){return this._dom},n.prototype.getId=function(){return this.id},n.prototype.getZr=function(){return this._zr},n.prototype.isSSR=function(){return this._ssr},n.prototype.setOption=function(t,e,n){if(!this[Av])if(this._disposed)am(this.id);else{var i,r,o;if(j(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this[Av]=!0,!this._model||e){var a=new Sd(this._api),s=this._theme,l=this._model=new fd;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},hm);var u={seriesTransition:o,optionChanged:!0};if(n)this[kv]={silent:i,updateParams:u},this[Av]=!1,this.getZr().wakeUp();else{try{zv(this),Fv.update.call(this,null,u)}catch(t){throw this[kv]=null,this[Av]=!1,t}this._ssr||this._zr.flush(),this[kv]=null,this[Av]=!1,Yv.call(this,i),Xv.call(this,i)}}},n.prototype.setTheme=function(){_o()},n.prototype.getModel=function(){return this._model},n.prototype.getOption=function(){return this._model&&this._model.getOption()},n.prototype.getWidth=function(){return this._zr.getWidth()},n.prototype.getHeight=function(){return this._zr.getHeight()},n.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||i.hasGlobalWindow&&window.devicePixelRatio||1},n.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},n.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},n.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},n.prototype.getSvgDataURL=function(){if(i.svgSupported){var t=this._zr;return N(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},n.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;N(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return N(i,(function(t){t.group.ignore=!1})),o}am(this.id)},n.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(gm[n]){var a=o,s=o,l=-1/0,h=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();N(fm,(function(o,u){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(I(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),h=r(d.bottom,h),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(h*=p)-(s*=p),g=u.createCanvas(),y=Hr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return N(c,(function(t){var e=t.left-a,n=t.top-s;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Gs({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),N(c,(function(t){var e=new Rs({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}am(this.id)},n.prototype.convertToPixel=function(t,e){return Gv(this,"convertToPixel",t,e)},n.prototype.convertFromPixel=function(t,e){return Gv(this,"convertFromPixel",t,e)},n.prototype.containPixel=function(t,e){var n;if(!this._disposed)return N(Bo(this._model,t),(function(t,i){i.indexOf("Models")>=0&&N(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;am(this.id)},n.prototype.getVisual=function(t,e){var n=Bo(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?Cy(r,o,e):Dy(r,e)},n.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},n.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},n.prototype._initEvents=function(){var t,e,n,i=this;N(om,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&Py(o,(function(t){var e=il(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType,o)||{},!0}if(e.eventData)return n=D({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),N(lm,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),N(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(Ly("map","selectchanged",e,i,t),Ly("pie","selectchanged",e,i,t)):"select"===t.fromAction?(Ly("map","selected",e,i,t),Ly("pie","selected",e,i,t)):"unselect"===t.fromAction&&(Ly("map","unselected",e,i,t),Ly("pie","unselected",e,i,t))}))},n.prototype.isDisposed=function(){return this._disposed},n.prototype.clear=function(){this._disposed?am(this.id):this.setOption({series:[]},!0)},n.prototype.dispose=function(){if(this._disposed)am(this.id);else{this._disposed=!0,this.getDom()&&Yo(this.getDom(),mm,"");var t=this,e=t._api,n=t._model;N(t._componentsViews,(function(t){t.dispose(n,e)})),N(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete fm[t.id]}},n.prototype.resize=function(t){if(!this[Av])if(this._disposed)am(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this[kv]&&(null==i&&(i=this[kv].silent),n=!0,this[kv]=null),this[Av]=!0;try{n&&zv(this),Fv.update.call(this,{type:"resize",animation:D({duration:0},t&&t.animation)})}catch(t){throw this[Av]=!1,t}this[Av]=!1,Yv.call(this,i),Xv.call(this,i)}}},n.prototype.showLoading=function(t,e){if(this._disposed)am(this.id);else if(j(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),dm[t]){var n=dm[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},n.prototype.hideLoading=function(){this._disposed?am(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},n.prototype.makeActionFromEvent=function(t){var e=D({},t);return e.type=lm[t.type],e},n.prototype.dispatchAction=function(t,e){if(this._disposed)am(this.id);else if(j(e)||(e={silent:!!e}),sm[t.type]&&this._model)if(this[Av])this._pendingActions.push(t);else{var n=e.silent;Hv.call(this,t,n);var r=e.flush;r?this._zr.flush():!1!==r&&i.browser.weChat&&this._throttledZrFlush(),Yv.call(this,n),Xv.call(this,n)}},n.prototype.updateLabelLayout=function(){bv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},n.prototype.appendData=function(t){if(this._disposed)am(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},n.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function n(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;e.eachRendered((function(t){if(t.states&&t.states.emphasis){if(mh(t))return;if(t instanceof As&&function(t){var e=sl(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var e=t.prevStates;e&&t.useStates(e)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&n(t)}}))}zv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),Vv(t,!0),Vv(t,!1),e.plan()},Vv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!i.node&&!i.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),bv.trigger("series:afterupdate",e,n,l)},Qv=function(t){t[Lv]=!0,t.getZr().wakeUp()},tm=function(t){t[Lv]&&(t.getZr().storage.traverse((function(t){mh(t)||n(t)})),t[Lv]=!1)},$v=function(t){return new(function(n){function i(){return null!==n&&n.apply(this,arguments)||this}return e(i,n),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){Pl(e,n),Qv(t)},i.prototype.leaveEmphasis=function(e,n){Ol(e,n),Qv(t)},i.prototype.enterBlur=function(e){Rl(e),Qv(t)},i.prototype.leaveBlur=function(e){Nl(e),Qv(t)},i.prototype.enterSelect=function(e){El(e),Qv(t)},i.prototype.leaveSelect=function(e){zl(e),Qv(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(xd))(t)},Jv=function(t){function e(t,e){for(var n=0;n=0)){zm.push(n);var o=ty.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function Bm(t,e){dm[t]=e}function Fm(t){h({createCanvas:t})}function Gm(t,e,n){var i=Sv("registerMap");i&&i(t,e,n)}function Wm(t){var e=Sv("getMap");return e&&e(t)}var Hm=function(t){var e=(t=I(t)).type,n="";e||bo(n);var i=e.split(":");2!==i.length&&bo(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,zf.set(e,t)};Em(Tv,qg),Em(Cv,$g),Em(Cv,Jg),Em(Tv,Iy),Em(Cv,Ty),Em(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=vv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=vv(r,e)}}))})),Cm(Yd),Dm(900,(function(t){var e=gt();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Xd)})),Bm("default",(function(t,e){A(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Vr,i=new Gs({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new Ys({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Gs({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new eh({shape:{startAngle:-Qg/2,endAngle:-Qg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Qg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Qg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),Pm({type:pl,event:pl,update:pl},_t),Pm({type:dl,event:dl,update:dl},_t),Pm({type:fl,event:fl,update:fl},_t),Pm({type:gl,event:gl,update:gl},_t),Pm({type:yl,event:yl,update:yl},_t),Tm("light",yy),Tm("dark",by);var Ym={},Xm=[],Um={registerPreprocessor:Cm,registerProcessor:Dm,registerPostInit:Am,registerPostUpdate:km,registerUpdateLifecycle:Lm,registerAction:Pm,registerCoordinateSystem:Om,registerLayout:Nm,registerVisual:Em,registerTransform:Hm,registerLoading:Bm,registerMap:Gm,registerImpl:function(t,e){wv[t]=e},PRIORITY:Dv,ComponentModel:Ep,ComponentView:Dg,SeriesModel:_g,ChartView:Pg,registerComponentModel:function(t){Ep.registerClass(t)},registerComponentView:function(t){Dg.registerClass(t)},registerSeriesModel:function(t){_g.registerClass(t)},registerChartView:function(t){Pg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Ep.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Yr(t,e)}};function Zm(t){H(t)?N(t,(function(t){Zm(t)})):L(Xm,t)>=0||(Xm.push(t),Y(t)&&(t={install:t}),t.install(Um))}function jm(t){return null==t?0:t.length||1}function qm(t){return t}var Km=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||qm,this._newKeyGetter=i||qm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var lx,ux,hx,cx,px,dx,fx,gx=j,yx=E,vx="undefined"==typeof Int32Array?Array:Int32Array,mx=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],xx=["_approximateExtent"],_x=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;rx(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===Gp&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(H(r=this.getVisual(e))?r=r.slice():gx(r)&&(r=D({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,gx(e)?D(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){gx(t)?D(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?D(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;rl(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){N(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:yx(this.dimensions,this._getDimInfo,this),this.hostModel)),px(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];Y(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(ot(arguments)))})},t.internalField=(lx=function(t){var e=t._invertedIndicesMap;N(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new vx(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function bx(t,e){Jd(t)||(t=tf(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=gt(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return N(e,(function(t){var e;j(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&sx(a),l=i===t.dimensionsDefine,u=l?ax(t):ox(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=gt(h),p=new Yf(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new ix({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function Sx(t,e,n){if(n||e.hasKey(t)){for(var i=0;e.hasKey(t+i);)i++;t+=i}return e.set(t,!0),t}var Mx=function(t){this.coordSysDims=[],this.axisMap=gt(),this.categoryAxisMap=gt(),this.coordSysName=t};var Ix={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Go).models[0],o=t.getReferringComponents("yAxis",Go).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),Tx(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),Tx(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Go).models[0];e.coordSysDims=["single"],n.set("single",r),Tx(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Go).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),Tx(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),Tx(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();N(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),Tx(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function Tx(t){return"category"===t.get("type")}function Cx(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!rx(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(N(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;N(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function Dx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function Ax(t,e){return Dx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function kx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=tf(t)):o=(i=r.getSource()).sourceFormat===Gp;var a=function(t){var e=t.get("coordinateSystem"),n=new Mx(e),i=Ix[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=bd.get(i);return e&&e.coordSysDims&&(n=E(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Qm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=Y(l)?l:l?W(Qp,s,e):null,h=bx(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&N(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=Cx(e,{schema:h,store:p}),f=new _x(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===Gp){var e=function(t){var e=0;for(;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();ea(Lx);var Px=0,Ox=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++Px}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&E(i,Rx);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=gt(this.categories))},t}();function Rx(t){return j(t)&&null!=t.value?t.value:t+""}function Nx(t){return"interval"===t.type||"log"===t.type}function Ex(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=co(o/e,!0);null!=n&&ai&&(a=r.interval=i);var s=r.intervalPrecision=Vx(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),Bx(t,0,e),Bx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[$r(Math.ceil(t[0]/a)*a,s),$r(Math.floor(t[1]/a)*a,s)],t),r}function zx(t){var e=Math.pow(10,ho(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,$r(n*e)}function Vx(t){return Qr(t)+2}function Bx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function Fx(t,e){return t>=e[0]&&t<=e[1]}function Gx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function Wx(t,e){return t*(e[1]-e[0])+e[0]}var Hx=function(t){function n(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new Ox({})),H(i)&&(i=new Ox({categories:E(i,(function(t){return j(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return e(n,t),n.prototype.parse=function(t){return null==t?NaN:X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},n.prototype.contain=function(t){return Fx(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},n.prototype.normalize=function(t){return Gx(t=this._getTickNumber(this.parse(t)),this._extent)},n.prototype.scale=function(t){return t=Math.round(Wx(t,this._extent)),this.getRawOrdinalNumber(t)},n.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},n.prototype.getMinorTicks=function(t){},n.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},n.prototype.getOrdinalMeta=function(){return this._ordinalMeta},n.prototype.calcNiceTicks=function(){},n.prototype.calcNiceExtent=function(){},n.type="ordinal",n}(Lx);Lx.registerClass(Hx);var Yx=$r,Xx=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return e(n,t),n.prototype.parse=function(t){return t},n.prototype.contain=function(t){return Fx(t,this._extent)},n.prototype.normalize=function(t){return Gx(t,this._extent)},n.prototype.scale=function(t){return Wx(t,this._extent)},n.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},n.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},n.prototype.getInterval=function(){return this._interval},n.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Vx(t)},n.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:Yx(s+e,r)}):o.push({value:n[1]})),o},n.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&h0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return N(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Kr(t.get("barWidth"),i),d=Kr(t.get("barMaxWidth"),i),f=Kr(t.get("barMinWidth")||(r_(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:$x(r),stackId:Kx(t)})})),t_(n)}function t_(t){var e={};N(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return N(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=F(i).length;o=Math.max(35-4*a,15)+"%"}var s=Kr(o,r),l=Kr(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),N(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;N(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;N(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function e_(t,e){var n=Jx(t,e),i=Qx(n);N(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Kx(t),o=i[$x(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function n_(t){return{seriesType:t,plan:Ag(),reset:function(t){if(i_(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=Dx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){var n=e.model.get("startValue");n||(n=0);return e.toGlobalCoord(e.dataToCoord("log"===e.type?n>0?n:1:n))}(0,r),d=r_(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&jx(3*r),u=d&&s&&jx(3*r),m=d&&jx(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(H(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return $c(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},n.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Zc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=V(E(u,(function(t){return V(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;dn&&(this._approxInterval=n);var o=a_.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function l_(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function u_(t){return(t/=Fc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function h_(t,e){return(t/=e?Bc:Vc)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function c_(t){return co(t,!0)}function p_(t,e,n){var i=new Date(t);switch(qc(e)){case"year":case"month":i[lp(n)](0);case"day":i[up(n)](1);case"hour":i[hp(n)](0);case"minute":i[cp(n)](0);case"second":i[pp(n)](0),i[dp(n)](0)}return i.getTime()}Lx.registerClass(o_);var d_=Lx.prototype,f_=Xx.prototype,g_=$r,y_=Math.floor,v_=Math.ceil,m_=Math.pow,x_=Math.log,__=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new Xx,e._interval=0,e}return e(n,t),n.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return E(f_.getTicks.call(this,t),(function(t){var e=t.value,r=$r(m_(this.base,e));return r=e===n[0]&&this._fixMin?w_(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?w_(r,i[1]):r}}),this)},n.prototype.setExtent=function(t,e){var n=x_(this.base);t=x_(Math.max(0,t))/n,e=x_(Math.max(0,e))/n,f_.setExtent.call(this,t,e)},n.prototype.getExtent=function(){var t=this.base,e=d_.getExtent.call(this);e[0]=m_(t,e[0]),e[1]=m_(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=w_(e[0],n[0])),this._fixMax&&(e[1]=w_(e[1],n[1])),e},n.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=x_(t[0])/x_(e),t[1]=x_(t[1])/x_(e),d_.unionExtent.call(this,t)},n.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},n.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=uo(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[$r(v_(e[0]/i)*i),$r(y_(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},n.prototype.calcNiceExtent=function(t){f_.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},n.prototype.parse=function(t){return t},n.prototype.contain=function(t){return Fx(t=x_(t)/x_(this.base),this._extent)},n.prototype.normalize=function(t){return Gx(t=x_(t)/x_(this.base),this._extent)},n.prototype.scale=function(t){return t=Wx(t,this._extent),m_(this.base,t)},n.type="log",n}(Lx),b_=__.prototype;function w_(t,e){return g_(t,Qr(e))}b_.getMinorTicks=f_.getMinorTicks,b_.getLabel=f_.getLabel,Lx.registerClass(__);var S_=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[I_[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=M_[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),M_={min:"_determinedMin",max:"_determinedMax"},I_={min:"_dataMin",max:"_dataMax"};function T_(t,e,n){var i=t.rawExtentInfo;return i||(i=new S_(t,e,n),t.rawExtentInfo=i,i)}function C_(t,e){return null==e?null:et(e)?NaN:t.parse(e)}function D_(t,e){var n=t.type,i=T_(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Jx("bar",a),l=!1;if(N(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Qx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[$x(e)];return null!=i&&null!=n?i[Kx(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;N(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;N(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return e+=c*(l/u),t-=c*(s/u),{min:t,max:e}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function A_(t,e){var n=e,i=D_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof __&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function k_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new Hx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new o_({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(Lx.getClass(e)||Xx)}}function L_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):Y(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(P_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function P_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function O_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new Ee(t.x,t.y,o,a)}function R_(t){var e=t.get("interval");return null==e?"auto":e}function N_(t){return"category"===t.type&&0===R_(t.getLabelModel())}function E_(t,e){var n={};return N(t.mapDimensionsAll(e),(function(e){n[Ax(t,e)]=!0})),F(n)}var z_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var V_={isDimensionStacked:Dx,enableDataStack:Cx,getStackedDimension:Ax};var B_=Object.freeze({__proto__:null,createList:function(t){return kx(null,t)},getLayoutRect:Ap,dataStack:V_,createScale:function(t,e){var n=e;e instanceof Tc||(n=new Tc(e));var i=k_(n);return i.setExtent(t[0],t[1]),A_(i,n),i},mixinAxisModelCommonMethods:function(t){O(t,z_)},getECData:il,createTextStyle:function(t,e){return rc(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return bx(t,e).dimensions},createSymbol:Yy,enableHoverEmphasis:Xl});function F_(t,e){return Math.abs(t-e)<1e-8}function G_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;on&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function J_(t,e){return E(V((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),N(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=$_(r,i,n);break;case"Polygon":case"MultiLineString":K_(r,i,n);break;case"MultiPolygon":N(r,(function(t,e){return K_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new U_(o[0],o.slice(1)));break;case"MultiPolygon":N(i.coordinates,(function(t){t[0]&&r.push(new U_(t[0],t.slice(1)))}));break;case"LineString":r.push(new Z_([i.coordinates]));break;case"MultiLineString":r.push(new Z_(i.coordinates))}var a=new j_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var Q_=Object.freeze({__proto__:null,linearMap:qr,round:$r,asc:Jr,getPrecision:Qr,getPrecisionSafe:to,getPixelPrecision:eo,getPercentWithPrecision:function(t,e,n){return t[e]&&no(t,n)[e]||0},MAX_SAFE_INTEGER:ro,remRadian:oo,isRadianAroundZero:ao,parseDate:lo,quantity:uo,quantityExponent:ho,nice:co,quantile:po,reformIntervals:fo,isNumeric:yo,numericToNumber:go}),tb=Object.freeze({__proto__:null,parse:lo,format:$c}),eb=Object.freeze({__proto__:null,extendShape:Th,extendPath:Dh,makePath:Lh,makeImage:Ph,mergePath:Rh,resizePath:Nh,createIcon:Xh,updateProps:yh,initProps:vh,getTransform:Vh,clipPointsByRect:Hh,clipRectByRect:Yh,registerShape:Ah,getShapeClass:kh,Group:Vr,Image:Rs,Text:Ys,Circle:wu,Ellipse:Mu,Sector:Bu,Ring:Gu,Polygon:Yu,Polyline:Uu,Rect:Gs,Line:qu,BezierCurve:Qu,Arc:eh,IncrementalDisplayable:ph,CompoundPath:nh,LinearGradient:rh,RadialGradient:oh,BoundingRect:Ee}),nb=Object.freeze({__proto__:null,addCommas:fp,toCamelCase:gp,normalizeCssArray:yp,encodeHTML:ie,formatTpl:_p,getTooltipMarker:bp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=lo(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",jc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",jc(o%100+"",2)).replace("dd",jc(s,2)).replace("d",s).replace("hh",jc(l,2)).replace("h",l).replace("mm",jc(u,2)).replace("m",u).replace("ss",jc(h,2)).replace("s",h).replace("SSS",jc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:ca,getTextRect:function(t,e,n,i,r,o,a,s){return new Ys({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),ib=Object.freeze({__proto__:null,map:E,each:N,indexOf:L,inherits:P,reduce:z,filter:V,bind:G,curry:W,isArray:H,isString:X,isObject:j,isFunction:Y,extend:D,defaults:A,clone:I,merge:T}),rb=zo();function ob(t,e){var n=E(e,(function(e){return t.scale.parse(e)}));return"time"===t.type&&n.length>0&&(n.sort(),n.unshift(n[0]),n.push(n[n.length-1])),n}function ab(t){var e=t.getLabelModel().get("customValues");if(e){var n=L_(t);return{labels:ob(t,e).map((function(e){var i={value:e};return{formattedLabel:n(i),rawLabel:t.scale.getLabel(i),tickValue:e}}))}}return"category"===t.type?function(t){var e=t.getLabelModel(),n=lb(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=L_(t);return{labels:E(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function sb(t,e){var n=t.getTickModel().get("customValues");return n?{ticks:ob(t,n)}:"category"===t.type?function(t,e){var n,i,r=ub(t,"ticks"),o=R_(e),a=hb(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(Y(o))n=db(t,o,!0);else if("auto"===o){var s=lb(t,t.getLabelModel());i=s.labelCategoryInterval,n=E(s.labels,(function(t){return t.tickValue}))}else n=pb(t,i=o,!0);return cb(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:E(t.scale.getTicks(),(function(t){return t.value}))}}function lb(t,e){var n,i,r=ub(t,"labels"),o=R_(e),a=hb(r,o);return a||(Y(o)?n=db(t,o):(i="auto"===o?function(t){var e=rb(t).autoInterval;return null!=e?e:rb(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=pb(t,i)),cb(r,o,{labels:n,labelCategoryInterval:i}))}function ub(t,e){return rb(t)[e]||(rb(t)[e]=[])}function hb(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=N_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function db(t,e,n){var i=t.scale,r=L_(t),o=[];return N(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var fb=[0,1],gb=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return eo(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&yb(n=n.slice(),i.count()),qr(t,fb,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&yb(n=n.slice(),i.count());var r=qr(t,n,fb,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=E(sb(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[1]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;N(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=$r(t),e=$r(e),h?t>e:t0&&t<100||(t=5),E(this.scale.getMinorTicks(t),(function(t){return E(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return ab(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=L_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=wr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=rb(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function yb(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}function vb(t){var e=Ep.extend(t);return Ep.registerClass(e),e}function mb(t){var e=Dg.extend(t);return Dg.registerClass(e),e}function xb(t){var e=_g.extend(t);return _g.registerClass(e),e}function _b(t){var e=Pg.extend(t);return Pg.registerClass(e),e}var bb=2*Math.PI,wb=us.CMD,Sb=["top","right","bottom","left"];function Mb(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function Ib(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%bb<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=fs(r),r=fs(p)}else i=fs(i),r=fs(r);i>r&&(r+=bb);var d=Math.atan2(s,a);if(d<0&&(d+=bb),d>=i&&d<=r||d+bb>=i&&d+bb<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m0){e=e/180*Math.PI,Lb.fromArray(t[0]),Pb.fromArray(t[1]),Ob.fromArray(t[2]),Ce.sub(Rb,Lb,Pb),Ce.sub(Nb,Ob,Pb);var n=Rb.len(),i=Nb.len();if(!(n<.001||i<.001)){Rb.scale(1/n),Nb.scale(1/i);var r=Rb.dot(Nb);if(Math.cos(e)1&&Ce.copy(Vb,Ob),Vb.toArray(t[1])}}}}function Fb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,Lb.fromArray(t[0]),Pb.fromArray(t[1]),Ob.fromArray(t[2]),Ce.sub(Rb,Pb,Lb),Ce.sub(Nb,Ob,Pb);var i=Rb.len(),r=Nb.len();if(!(i<.001||r<.001))if(Rb.scale(1/i),Nb.scale(1/r),Rb.dot(e)=a)Ce.copy(Vb,Ob);else{Vb.scaleAndAdd(Nb,o/Math.tan(Math.PI/2-s));var l=Ob.x!==Pb.x?(Vb.x-Pb.x)/(Ob.x-Pb.x):(Vb.y-Pb.y)/(Ob.y-Pb.y);if(isNaN(l))return;l<0?Ce.copy(Vb,Pb):l>1&&Ce.copy(Vb,Ob)}Vb.toArray(t[1])}}}function Gb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function Wb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=zt(i[0],i[1]),o=zt(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Ft([],i[1],i[0],a/r),l=Ft([],i[1],i[2],a/o),u=Ft([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function Zb(t,e,n,i){return Ub(t,"y","height",e,n,i)}function jb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new Ee(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),L(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),yh(n,s,e,a)}else if(n.attr(s),!cc(n).valueAnimation){var h=it(n.style.opacity,1);n.style.opacity=0,vh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};ew(c,s,nw),ew(c,n.states.select,nw)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};ew(p,s,nw),ew(p,n.states.emphasis,nw)}dc(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=tw(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),yh(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,vh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),rw=zo();var ow=Math.sin,aw=Math.cos,sw=Math.PI,lw=2*Math.PI,uw=180/sw,hw=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=ci(h-lw)||(u?l>=lw:-l>=lw),p=l>0?l%lw:l%lw+lw,d=!1;d=!!c||!ci(h)&&p>=sw==!!u;var f=t+n*aw(o),g=e+i*ow(o);this._start&&this._add("M",f,g);var y=Math.round(r*uw);if(c){var v=1/this._p,m=(u?1:-1)*(lw-v);this._add("A",n,i,y,1,+u,t+n*aw(o+m),e+i*ow(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*aw(a),_=e+i*ow(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c"}(r,o)+("style"!==r?ie(a):a||"")+(i?""+n+E(i,(function(e){return t(e)})).join(n)+n:"")+("")}(t)}function ww(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssStyleCache:{},cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Sw(t,e,n,i){return _w("svg","root",{width:t,height:e,xmlns:yw,"xmlns:xlink":vw,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Mw=0;function Iw(){return Mw++}var Tw={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},Cw="transform-origin";function Dw(t,e,n){var i=D({},t.shape);D(i,e),t.buildPath(n,i);var r=new hw;return r.reset(bi(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function Aw(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[Cw]=n+"px "+i+"px")}var kw={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Lw(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function Pw(t){return X(t)?Tw[t]?"cubic-bezier("+Tw[t]+")":Ln(t)?t:"":""}function Ow(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof nh){var s=function(t,e,n){var i,r,o=t.shape.paths,a={};if(N(o,(function(t){var e=ww(n.zrId);e.animation=!0,Ow(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=F(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Lw(a,n);return i.replace(r,s)}}(t,e,n);if(s)a.push(s);else if(!o)return}else if(!o)return;for(var l={},u=0;u0})).length)return Lw(h,n)+" "+r[0]+" both"}for(var y in l){(s=g(l[y]))&&a.push(s)}if(a.length){var v=n.zrId+"-cls-"+Iw();n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}function Rw(t,e,n,i){var r=JSON.stringify(t),o=n.cssStyleCache[r];o||(o=n.zrId+"-cls-"+Iw(),n.cssStyleCache[r]=o,n.cssNodes["."+o+(i?":hover":"")]=t),e.class=e.class?e.class+" "+o:o}var Nw=Math.round;function Ew(t){return t&&X(t.src)}function zw(t){return t&&Y(t.toDataURL)}function Vw(t,e,n,i){gw((function(r,o){var a="fill"===r||"stroke"===r;a&&xi(o)?qw(e,t,r,i):a&&yi(o)?Kw(n,t,r,i):t[r]=a&&"none"===o?"transparent":o}),e,n,!1),function(t,e,n){var i=t.style;if(function(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY)}(i)){var r=function(t){var e=t.style,n=t.getGlobalScale();return[e.shadowColor,(e.shadowBlur||0).toFixed(2),(e.shadowOffsetX||0).toFixed(2),(e.shadowOffsetY||0).toFixed(2),n[0],n[1]].join(",")}(t),o=n.shadowCache,a=o[r];if(!a){var s=t.getGlobalScale(),l=s[0],u=s[1];if(!l||!u)return;var h=i.shadowOffsetX||0,c=i.shadowOffsetY||0,p=i.shadowBlur,d=ui(i.shadowColor),f=d.opacity,g=d.color,y=p/2/l+" "+p/2/u;a=n.zrId+"-s"+n.shadowIdx++,n.defs[a]=_w("filter",a,{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},[_w("feDropShadow","",{dx:h/l,dy:c/u,stdDeviation:y,"flood-color":g,"flood-opacity":f})]),o[r]=a}e.filter=_i(a)}}(n,t,i)}function Bw(t,e){var n=Xr(e);n&&(n.each((function(e,n){null!=e&&(t[(mw+n).toLowerCase()]=e+"")})),e.isSilent()&&(t[mw+"silent"]="true"))}function Fw(t){return ci(t[0]-1)&&ci(t[1])&&ci(t[2])&&ci(t[3]-1)}function Gw(t,e,n){if(e&&(!function(t){return ci(t[4])&&ci(t[5])}(e)||!Fw(e))){var i=n?10:1e4;t.transform=Fw(e)?"translate("+Nw(e[4]*i)/i+" "+Nw(e[5]*i)/i+")":function(t){return"matrix("+pi(t[0])+","+pi(t[1])+","+pi(t[2])+","+pi(t[3])+","+di(t[4])+","+di(t[5])+")"}(e)}}function Ww(t,e,n){for(var i=t.points,r=[],o=0;o=0&&a||o;s&&(r=ai(s))}var l=i.lineWidth;l&&(l/=!i.strokeNoScale&&t.transform?t.transform[0]:1);var u={cursor:"pointer"};r&&(u.fill=r),i.stroke&&(u.stroke=i.stroke),l&&(u["stroke-width"]=l),Rw(u,e,n,!0)}}(t,o,e),_w(s,t.id+"",o)}function jw(t,e){return t instanceof As?Zw(t,e):t instanceof Rs?function(t,e){var n=t.style,i=n.image;if(i&&!X(i)&&(Ew(i)?i=i.src:zw(i)&&(i=i.toDataURL())),i){var r=n.x||0,o=n.y||0,a={href:i,width:n.width,height:n.height};return r&&(a.x=r),o&&(a.y=o),Gw(a,t.transform),Vw(a,n,t,e),Bw(a,t),e.animation&&Ow(t,a,e),_w("image",t.id+"",a)}}(t,e):t instanceof Ls?function(t,e){var n=t.style,i=n.text;if(null!=i&&(i+=""),i&&!isNaN(n.x)&&!isNaN(n.y)){var a=n.font||o,s=n.x||0,l=function(t,e,n){return"top"===n?t+=e/2:"bottom"===n&&(t-=e/2),t}(n.y||0,Ir(a),n.textBaseline),u={"dominant-baseline":"central","text-anchor":fi[n.textAlign]||n.textAlign};if(Ks(n)){var h="",c=n.fontStyle,p=js(n.fontSize);if(!parseFloat(p))return;var d=n.fontFamily||r,f=n.fontWeight;h+="font-size:"+p+";font-family:"+d+";",c&&"normal"!==c&&(h+="font-style:"+c+";"),f&&"normal"!==f&&(h+="font-weight:"+f+";"),u.style=h}else u.style="font: "+a;return i.match(/\s/)&&(u["xml:space"]="preserve"),s&&(u.x=s),l&&(u.y=l),Gw(u,t.transform),Vw(u,n,t,e),Bw(u,t),e.animation&&Ow(t,u,e),_w("text",t.id+"",u,void 0,i)}}(t,e):void 0}function qw(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(vi(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!mi(o))return void 0;r="radialGradient",a.cx=it(o.x,.5),a.cy=it(o.y,.5),a.r=it(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;ul?cS(t,null==n[c+1]?null:n[c+1].elm,n,s,c):pS(t,e,a,l))}(n,i,r):sS(r)?(sS(t.text)&&rS(n,""),cS(n,null,r,0,r.length-1)):sS(i)?pS(n,i,0,i.length-1):sS(t.text)&&rS(n,""):t.text!==e.text&&(sS(i)&&pS(n,i,0,i.length-1),rS(n,e.text)))}var gS=0,yS=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=vS("refreshHover"),this.configLayer=vS("configLayer"),this.storage=e,this._opts=n=D({},n),this.root=t,this._id="zr"+gS++,this._oldVNode=Sw(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=xw("svg");dS(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(uS(t,e))fS(t,e);else{var n=t.elm,i=nS(n);hS(e),null!==i&&(Qw(i,e.elm,iS(n)),pS(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return jw(t,ww(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._width,i=this._height,r=ww(this._id);r.animation=t.animation,r.willUpdate=t.willUpdate,r.compress=t.compress,r.emphasis=t.emphasis;var o=[],a=this._bgVNode=function(t,e,n,i){var r;if(n&&"none"!==n)if(r=_w("rect","bg",{width:t,height:e,x:"0",y:"0"}),xi(n))qw({fill:n},r.attrs,"fill",i);else if(yi(n))Kw({style:{fill:n},dirty:_t,getBoundingRect:function(){return{width:t,height:e}}},r.attrs,"fill",i);else{var o=ui(n),a=o.color,s=o.opacity;r.attrs.fill=a,s<1&&(r.attrs["fill-opacity"]=s)}return r}(n,i,this._backgroundColor,r);a&&o.push(a);var s=t.compress?null:this._mainVNode=_w("g","main",{},[]);this._paintList(e,r,s?s.children:o),s&&o.push(s);var l=E(F(r.defs),(function(t){return r.defs[t]}));if(l.length&&o.push(_w("defs","defs",{},l)),t.animation){var u=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=E(F(t),(function(e){return e+r+E(F(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=E(F(e),(function(t){return"@keyframes "+t+r+E(F(e[t]),(function(n){return n+r+E(F(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?[""].join(i):""}(r.cssNodes,r.cssAnims,{newline:!0});if(u){var h=_w("style","stl",{},[],u);o.push(h)}}return Sw(n,i,o,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},bw(this.renderToVNode({animation:it(t.cssAnimation,!0),emphasis:it(t.cssEmphasis,!0),willUpdate:!1,compress:!0,useViewBox:it(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.painter||(e.painter=this)}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?wS:0),this._needsManuallyCompositing),u.__builtin__||M("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,N(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?T(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},n.type="series.line",n.dependencies=["grid","polar"],n.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},n}(_g);function IS(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=vf(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var CS=function(t){function n(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return e(n,t),n.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Yy(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=DS,this._symbolType=t,this.add(o)},n.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},n.prototype.getSymbolType=function(){return this._symbolType},n.prototype.getSymbolPath=function(){return this.childAt(0)},n.prototype.highlight=function(){Pl(this.childAt(0))},n.prototype.downplay=function(){Ol(this.childAt(0))},n.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},n.prototype.setDraggable=function(t,e){var n=this.childAt(0);n.draggable=t,n.cursor=!e&&t?"move":n.cursor},n.prototype.updateData=function(t,e,i,r){this.silent=!1;var o=t.getItemVisual(e,"symbol")||"circle",a=t.hostModel,s=n.getSymbolSize(t,e),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(e,"symbolKeepAspect");this._createSymbol(o,t,e,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):yh(p,c,a,e),wh(p)}if(this._updateCommon(t,e,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,vh(p,c,a,e)}}u&&this.childAt(0).stopAnimation("leave")},n.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=ic(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Uy(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof Rs){var w=f.style;f.useStyle(D({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(D({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;nc(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):IS(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a;var C=null==p||!0===p?Math.max(1.1,3/this._sizeY):isFinite(p)&&p>0?+p:1;T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C,this.setSymbolScale(1),Ul(this,l,u,h)},n.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},n.prototype.fadeOut=function(t,e,n){var i=this.childAt(0),r=il(this).dataIndex,o=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var a=i.getTextContent();a&&xh(a,{style:{opacity:0}},e,{dataIndex:r,removeOpt:o,cb:function(){i.removeTextContent()}})}else i.removeTextContent();xh(i,{style:{opacity:0},scaleX:0,scaleY:0},e,{dataIndex:r,cb:t,removeOpt:o})},n.getSymbolSize=function(t,e){return Xy(t.getItemVisual(e,"symbolSize"))},n}(Vr);function DS(t,e){this.parent.drift(t,e)}function AS(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function kS(t){return null==t||j(t)||(t={isIgnore:t}),t||{}}function LS(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:ic(e),cursorStyle:e.get("cursor")}}var PS=function(){function t(t){this.group=new Vr,this._SymbolCtor=t||CS}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=kS(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=LS(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(AS(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(AS(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):yh(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}),i)})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=LS(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=kS(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=E(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return Dx(e,c[0])&&(p=!0,c[0]=d),Dx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function RS(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var NS=Math.min,ES=Math.max;function zS(t,e){return isNaN(t)||isNaN(e)}function VS(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(zS(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y=i||zS(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=NS(D=v+T*a*I,ES(w,v)),A=NS(A,ES(S,m)),D=ES(D,NS(w,v)),f=m-(C=(A=ES(A,NS(S,m)))-m)*R/N,d=NS(d=v-(T=D-v)*R/N,ES(u,v)),f=NS(f,ES(h,m)),D=v+(T=v-(d=ES(d,NS(u,v))))*N/R,A=m+(C=m-(f=ES(f,NS(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var BS=function(){this.smooth=0,this.smoothConstraint=!0},FS=function(t){function n(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return e(n,t),n.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},n.prototype.getDefaultShape=function(){return new BS},n.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&zS(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?xn(n,u,c,d,t,s):xn(i,h,p,f,t,s);if(v>0)for(var m=0;m=0){y=a?vn(i,h,p,f,x):vn(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},n}(As),GS=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n}(BS),WS=function(t){function n(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return e(n,t),n.prototype.getDefaultShape=function(){return new GS},n.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&zS(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=E(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Qn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";N(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new rh(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function QS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return N(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function tM(t,e){return[t[2*e],t[2*e+1]]}function eM(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);il(d).seriesIndex=t.seriesIndex,Ul(d,L,P,O);var R=KS(t.get("smooth")),N=t.get("smoothMonotone");if(d.setShape({smooth:R,smoothMonotone:N,connectNulls:w}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(A(l.getAreaStyle(),{fill:C,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=KS(E.get("smooth"))),f.setShape({smooth:R,stackedOnSmooth:z,smoothMonotone:N,connectNulls:w}),Kl(f,t,"areaStyle"),il(f).seriesIndex=t.seriesIndex,Ul(f,L,P,O)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=T,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},n.prototype.packEventData=function(t,e){il(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},n.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=Eo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel")||0,c=t.get("z")||0;(s=new CS(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else Pg.prototype.highlight.call(this,t,e,n,i)},n.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=Eo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else Pg.prototype.downplay.call(this,t,e,n,i)},n.prototype._changePolyState=function(t){var e=this._polygon;Cl(this._polyline,t),e&&Cl(e,t)},n.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new FS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},n.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new WS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},n.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");Y(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=Y(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=Y(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},n.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(eM(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new Ys({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(nc(o,ic(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?TS(r,n):IS(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},n.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=tM(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Uo(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=tM(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}if(r){var k=cc(s);"function"==typeof k.setLabelText&&k.setLabelText(I)}}},n.prototype._doUpdateAnimation=function(t,e,n,i,r,o,a){var s=this._polyline,l=this._polygon,u=t.hostModel,h=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=OS(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x3e3||l&&qS(p,f)>3e3)return s.stopAnimation(),s.setShape({points:d}),void(l&&(l.stopAnimation(),l.setShape({points:d,stackedOnPoints:f})));s.shape.__points=h.current,s.shape.points=c;var g={shape:{points:d}};h.current!==c&&(g.shape.__points=h.next),s.stopAnimation(),yh(s,g,u),l&&(l.setShape({points:c,stackedOnPoints:p}),l.stopAnimation(),yh(l,{shape:{stackedOnPoints:f}},u),s.shape.points!==l.shape.points&&(l.shape.points=s.shape.points));for(var y=[],v=h.status,m=0;me&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;ne&&(e=o,n=r)}return isFinite(n)?n:NaN},nearest:function(t){return t[0]}},aM=function(t){return Math.round(t.length/2)};function sM(t){return{seriesType:t,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),o=t.coordinateSystem,a=i.count();if(a>10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(isFinite(p)&&p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=oM[r]:Y(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,aM))}}}}}var lM=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.getInitialData=function(t,e){return kx(null,this,{useEncodeDefaulter:!0})},n.prototype.getMarkerPosition=function(t,e,n){var i=this.coordinateSystem;if(i&&i.clampData){var r=i.clampData(t),o=i.dataToPoint(r);if(n)N(i.getAxes(),(function(t,n){if("category"===t.type&&null!=e){var i=t.getTicksCoords(),a=t.getTickModel().get("alignWithLabel"),s=r[n],l="x1"===e[n]||"y1"===e[n];if(l&&!a&&(s+=1),i.length<2)return;if(2===i.length)return void(o[n]=t.toGlobalCoord(t.getExtent()[l?1:0]));for(var u=void 0,h=void 0,c=1,p=0;ps){h=(d+u)/2;break}1===p&&(c=f-i[0].tickValue)}null==h&&(u?u&&(h=i[i.length-1].coord):h=i[0].coord),o[n]=t.toGlobalCoord(h)}}));else{var a=this.getData(),s=a.getLayout("offset"),l=a.getLayout("size"),u=i.getBaseAxis().isHorizontal()?0:1;o[u]+=s+l/2}return o}return[NaN,NaN]},n.type="series.__base_bar__",n.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},n}(_g);_g.registerClass(lM);var uM=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.getInitialData=function(){return kx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},n.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},n.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},n.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},n.type="series.bar",n.dependencies=["grid","polar"],n.defaultOption=Ac(lM.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),n}(lM),hM=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},cM=function(t){function n(e){var n=t.call(this,e)||this;return n.type="sausage",n}return e(n,t),n.prototype.getDefaultShape=function(){return new hM},n.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-lo)return!0;o=u}return!1},n.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},n.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},n.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},n.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},n.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},n.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},n.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){bh(e,t,il(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},n.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},n.type="bar",n}(Pg),mM={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=gM(e.x,t.x),s=yM(e.x+e.width,r),l=gM(e.y,t.y),u=yM(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=yM(e.r,t.r),o=gM(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},xM={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Gs({shape:D({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?cM:Bu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=TM(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===cM}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return Cr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+pM(f,o+v,!1),b=l+d*x(f)+dM(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+pM(f,-o+v,!1),b=l+d*x(f)+dM(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+pM(g,o+v,!0),b=l+d*x(g)+dM(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+pM(g,-o+v,!0),b=l+d*x(g)+dM(g,-o+v,!0),w="right",S="middle";break;default:return Cr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?i.r0:i.startAngle,g[f]=i[f],(s?yh:vh)(h,{shape:g},o)}return h}};function _M(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?yh:vh)(n,{shape:l},e,r,null),(a?yh:vh)(n,{shape:u},e?t.baseAxis.model:null,r)}function bM(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function TM(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function CM(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");if(s){if(!o.get("roundCap")){var u=t.shape;D(u,fM(i.getModel("itemStyle"),u,!0)),t.setShape(u)}}else{var h=i.get(["itemStyle","borderRadius"])||0;t.setShape("r",h)}t.useStyle(l);var c=i.getShallow("cursor");c&&t.attr("cursor",c);var p=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",d=ic(i);nc(t,d,{labelFetcher:o,labelDataIndex:n,defaultText:IS(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:p});var f=t.getTextContent();if(s&&f){var g=i.get(["label","position"]);t.textConfig.inside="middle"===g||null,function(t,e,n,i){if(Z(i))t.setTextConfig({rotation:i});else if(H(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===g?p:g,TM(a),i.get(["label","rotate"]))}pc(f,d,o.getRawValue(n),(function(t){return TS(e,t)}));var y=i.getModel(["emphasis"]);Ul(t,y.get("focus"),y.get("blurScope"),y.get("disabled")),Kl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",N(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var DM=function(){},AM=function(t){function n(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return e(n,t),n.prototype.getDefaultShape=function(){return new DM},n.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);il(this).dataIndex=e>=0?e:null}),30,!1);function PM(t,e,n){if(US(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var OM=2*Math.PI,RM=Math.PI/180;function NM(t,e){return Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function EM(t,e){var n=NM(t,e),i=t.get("center"),r=t.get("radius");H(r)||(r=[0,r]);var o,a,s=Kr(n.width,e.getWidth()),l=Kr(n.height,e.getHeight()),u=Math.min(s,l),h=Kr(r[0],u/2),c=Kr(r[1],u/2),p=t.coordinateSystem;if(p){var d=p.dataToPoint(i);o=d[0]||0,a=d[1]||0}else H(i)||(i=[i,i]),o=Kr(i[0],s)+n.x,a=Kr(i[1],l)+n.y;return{cx:o,cy:a,r0:h,r:c}}function zM(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=NM(t,n),o=EM(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*RM,c=t.get("endAngle"),p=t.get("padAngle")*RM;c="auto"===c?h-OM:-c*RM;var d=t.get("minAngle")*RM+p,f=0;e.each(i,(function(t){!isNaN(t)&&f++}));var g=e.getSum(i),y=Math.PI/(g||f)*2,v=t.get("clockwise"),m=t.get("roseType"),x=t.get("stillShowZeroSum"),_=e.getDataExtent(i);_[0]=0;var b=v?1:-1,w=[h,c],S=b*p/2;ls(w,!v),h=w[0],c=w[1];var M=VM(t);M.startAngle=h,M.endAngle=c,M.clockwise=v;var I=Math.abs(c-h),T=I,C=0,D=h;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:v,cx:a,cy:s,r0:u,r:m?NaN:l});else{(i="area"!==m?0===g&&x?y:t*y:I/f)i?h=o=D+b*i/2:(o=D+S,h=r-S),e.setItemLayout(n,{angle:i,startAngle:o,endAngle:h,clockwise:v,cx:a,cy:s,r0:u,r:m?qr(t,_,[u,l]):l}),D=r}})),Tn?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function HM(t){return"center"===t.position}function YM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*FM,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Kr(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Kr(S,u);var M=w.get("length2");if(M=Kr(M,u),Math.abs(c.endAngle-c.startAngle)0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(Z(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var X=(p.style.margin||0)+2.1;Y.y-=X/2,Y.height+=X,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ce(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u=n.r0}},n.type="pie",n}(Pg);function ZM(t,e,n){e=H(e)&&{coordDimensions:e}||D({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=bx(i,e).dimensions,o=new _x(r,t);return o.initData(i,n),o}var jM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),qM=zo(),KM=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new jM(G(this.getData,this),G(this.getRawData,this)),this._defaultLabelLine(e)},n.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},n.prototype.getInitialData=function(){return ZM(this,{coordDimensions:["value"],encodeDefaulter:W(td,this)})},n.prototype.getDataParams=function(e){var n=this.getData(),i=qM(n),r=i.seats;if(!r){var o=[];n.each(n.mapDimension("value"),(function(t){o.push(t)})),r=i.seats=no(o,n.hostModel.get("percentPrecision"))}var a=t.prototype.getDataParams.call(this,e);return a.percent=r[e]||0,a.$vars.push("percent"),a},n.prototype._defaultLabelLine=function(t){To(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},n.type="series.pie",n.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,endAngle:"auto",padAngle:0,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},n}(_g);var $M=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.hasSymbolVisual=!0,e}return e(n,t),n.prototype.getInitialData=function(t,e){return kx(null,this,{useEncodeDefaulter:!0})},n.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},n.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},n.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},n.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},n.type="series.scatter",n.dependencies=["grid","polar","geo","singleAxis","calendar"],n.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},n}(_g),JM=function(){},QM=function(t){function n(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return e(n,t),n.prototype.getDefaultShape=function(){return new JM},n.prototype.reset=function(){this.notClear=!1,this._off=0},n.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},n.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},n.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),eI=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},n.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},n.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},n.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=rM("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},n.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},n.prototype._getClipShape=function(t){if(t.get("clip",!0)){var e=t.coordinateSystem;return e&&e.getArea&&e.getArea(.1)}},n.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new tI:new PS,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},n.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},n.prototype.dispose=function(){},n.type="scatter",n}(Pg),nI=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.type="grid",n.dependencies=["xAxis","yAxis"],n.layoutMode="box",n.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},n}(Ep),iI=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Go).models[0]},n.type="cartesian2dAxis",n}(Ep);O(iI,z_);var rI={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},oI=T({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},rI),aI=T({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},rI),sI={category:oI,value:aI,time:T({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},aI),log:A({logBase:10},aI)},lI={value:1,category:1,time:1,log:1};function uI(t,n,i,r){N(lI,(function(o,a){var s=T(T({},sI[a],!0),r,!0),l=function(t){function i(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n+"Axis."+a,e}return e(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=Lp(this),i=n?Op(t):{};T(t,e.getTheme().get(a+"Axis")),T(t,this.getDefaultOption()),t.type=hI(t),n&&Pp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=Ox.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=n+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(n+"Axis",hI)}function hI(t){return t.type||(t.data?"category":"value")}var cI=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return E(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),V(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),pI=["x","y"];function dI(t){return"interval"===t.type||"time"===t.type}var fI=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=pI,e}return e(n,t),n.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(dI(t)&&dI(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Me([],p)}}},n.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},n.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},n.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},n.prototype.containZone=function(t,e){var n=this.dataToPoint(t),i=this.dataToPoint(e),r=this.getArea(),o=new Ee(n[0],n[1],i[0]-n[0],i[1]-n[1]);return r.intersect(o)},n.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Gt(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},n.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},n.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Gt(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},n.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},n.prototype.getArea=function(t){t=t||0;var e=this.getAxis("x").getGlobalExtent(),n=this.getAxis("y").getGlobalExtent(),i=Math.min(e[0],e[1])-t,r=Math.min(n[0],n[1])-t,o=Math.max(e[0],e[1])-i+t,a=Math.max(n[0],n[1])-r+t;return new Ee(i,r,o,a)},n}(cI),gI=function(t){function n(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return e(n,t),n.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},n.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},n.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},n.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},n}(gb);function yI(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),nt(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function vI(t){return"cartesian2d"===t.get("coordinateSystem")}function mI(t){var e={xAxisModel:null,yAxisModel:null};return N(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Go).models[0];e[i]=o})),e}var xI=Math.log;function _I(t,e,n){var i=Xx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=D_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=xI(t.base);u=[xI(u[0])/p,xI(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;yu[0]&&isFinite(g)&&isFinite(u[0]);)f=zx(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=zx(f));var v=f*a;(g=$r((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=$r(v)):y>0&&u[1]<=0&&(y=0,g=-$r(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var bI=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=pI,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=F(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;Nx(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(A_(l,s),Nx(l)&&(e=a))}r.length&&(e||A_((e=r.pop()).scale,e.model),N(r,(function(t){_I(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};N(n.x,(function(t){SI(n,"y",t,r)})),N(n.y,(function(t){SI(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=Ap(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){N(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(N(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof Hx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=L_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var II=Math.PI,TI=function(){function t(t,e){this.group=new Vr,this.opt=e,this.axisModel=t,A(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Vr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!CI[t]},t.prototype.add=function(t){CI[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=oo(e-t);return ao(o)?(r=n>0?"top":"bottom",i="center"):ao(o-II)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),CI={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0],u=s[0]>l[0];a&&(Gt(s,s,a),Gt(l,l,a));var h=D({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),c=new qu({shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:h,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});Eh(c.shape,c.style.lineWidth),c.anid="line",n.add(c);var p=e.get(["axisLine","symbol"]);if(null!=p){var d=e.get(["axisLine","symbolSize"]);X(p)&&(p=[p,p]),(X(d)||Z(d))&&(d=[d,d]);var f=Uy(e.get(["axisLine","symbolOffset"])||0,d),g=d[0],y=d[1];N([{rotate:t.rotation+Math.PI/2,offset:f[0],r:0},{rotate:t.rotation-Math.PI/2,offset:f[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==p[i]&&null!=p[i]){var r=Yy(p[i],-g/2,-y/2,g,y,h.stroke,!0),o=e.r+e.offset,a=u?l:s;r.attr({rotation:e.rotate,x:a[0]+o*Math.cos(t.rotation),y:a[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=LI(r.getTicksCoords(),e.transform,l,A(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,kI(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*II/180),kI(s)?o=TI.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=oo(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;ao(a-II/2)?(o=l?"bottom":"top",r="center"):ao(a-1.5*II)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*II&&a>II/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=nt(t.nameTruncateMaxWidth,y.maxWidth,a),x=new Ys({x:d[0],y:d[1],rotation:o.rotation,silent:TI.isLabelSilent(e),style:rc(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(qh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=TI.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,il(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function DI(t){t&&(t.ignore=!0)}function AI(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=me([]);return we(r,r,-t.rotation),n.applyTransform(_e([],r,t.getLocalTransform())),i.applyTransform(_e([],r,e.getLocalTransform())),n.intersect(i)}}function kI(t){return"middle"===t||"center"===t}function LI(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function RI(t){var e=NI(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=EI(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=A({color:c.color},a));var d=T(I(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else Y(l)&&(d.name=l(d.name,d));var g=new Tc(d,null,this.ecModel);return O(g,z_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},n.prototype.getIndicatorModels=function(){return this._indicatorModels},n.type="radar",n.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:T({lineStyle:{color:"#bbb"}},rT.axisLine),axisLabel:oT(rT.axisLabel,!1),axisTick:oT(rT.axisTick,!1),splitLine:oT(rT.splitLine,!0),splitArea:oT(rT.splitArea,!0),indicator:[]},n}(Ep),sT=["axisLine","axisTickLabel","axisName"],lT=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},n.prototype._buildAxes=function(t){var e=t.coordinateSystem;N(E(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new TI(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){N(sT,t.add,t),this.group.add(t.getGroup())}),this)},n.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=H(h)?h:[h],d=H(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x3?1.4:r>1?1.2:1.1;yT(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);yT(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},n.prototype._pinchHandler=function(t){dT(this._zr,"globalPan")||yT(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},n}(Zt);function yT(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(pe(i.event),vT(t,e,n,i,r))}function vT(t,e,n,i,r){r.isAvailableBehavior=G(mT,null,n,i),t.trigger(e,r)}function mT(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function xT(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function _T(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var bT,wT={axisPointer:1,tooltip:1,brush:1};function ST(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!wT.hasOwnProperty(i.mainType)&&r&&r.model!==n}function MT(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var IT={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},TT=F(IT),CT={"alignment-baseline":"textBaseline","stop-color":"stopColor"},DT=F(CT),AT=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=MT(t);this._defsUsePending=[];var i=new Vr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),NT(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=YT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Vr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Gs({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=bT[s];if(u&&xt(bT,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=kT[s];if(p&&xt(kT,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new Ls({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});OT(e,n),NT(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(bT={g:function(t,e){var n=new Vr;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Gs;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new wu;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new qu;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new Mu;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=RT(i));var r=new Yu({shape:{points:n||[]},silent:!0});return OT(e,r),NT(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=RT(i));var r=new Uu({shape:{points:n||[]},silent:!0});return OT(e,r),NT(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new Rs;return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Vr;return OT(e,a),NT(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Vr;return OT(e,a),NT(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=xu(t.getAttribute("d")||"");return OT(e,n),NT(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),kT={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new rh(e,n,i,r);return LT(t,o),PT(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new oh(e,n,i);return LT(t,r),PT(t,r),r}};function LT(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function PT(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};HT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function OT(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),A(e.__inheritedStyle,t.__inheritedStyle))}function RT(t){for(var e=BT(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=BT(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":be(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Se(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":we(r,r,-parseFloat(l[0])*GT,[parseFloat(l[1]||"0"),parseFloat(l[2]||"0")]);break;case"skewX":_e(r,[1,0,Math.tan(parseFloat(l[0])*GT),1,0,0],r);break;case"skewY":_e(r,[1,Math.tan(parseFloat(l[0])*GT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),HT(t,a,s),i||function(t,e,n){for(var i=0;i0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=gt(),n=gt(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;nc(e,ic(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(cC(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function vC(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):il(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function mC(t,e,n,i,r){t.data||qh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function xC(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Ul(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=il(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function _C(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),N(t,(function(t){s.lineStart();for(var e=0;e-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},n.type="series.map",n.dependencies=["geo"],n.layoutMode="box",n.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},n}(_g);function SC(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),N(e,(function(t,e){for(var n,i,r,o=(n=E(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},N(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=Ap(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center"),e),this.setZoom(t.get("zoom"))}O(kC,TC);var OC=function(){function t(){this.dimensions=AC}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new kC(o+r,o,D({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=PC,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),N(r,(function(t,r){var o=E(t,(function(t){return t.get("nameMap")})),a=new kC(r,r,D({nameMap:C(o)},i(t[0])));a.zoomLimit=nt.apply(null,E(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=PC,a.resize(t[0],e),N(t,(function(t){t.coordinateSystem=a,function(t,e){N(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=gt(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=XC(s),o=UC(o),s&&o;){r=XC(r),a=UC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(jC(ZC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!XC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!UC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function WC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function HC(t){return arguments.length?t:qC}function YC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function XC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function UC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function ZC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function jC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function qC(t,e){return t.parentNode===e.parentNode?1:2}var KC=function(){this.parentPoint=[],this.childPoints=[]},$C=function(t){function n(e){return t.call(this,e)||this}return e(n,t),n.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},n.prototype.getDefaultShape=function(){return new KC},n.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Kr(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),k="relative"===D?yt(a.getAncestorsIndices(),a.getDescendantIndices()):"ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;k&&(il(n).focus=k),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Qu({shape:rD(h,c,p,r,r)})),yh(g,{shape:rD(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function vD(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function mD(t,e){return L(vD(t),e)>=0}function xD(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var _D=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return e(n,t),n.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new Tc(n,this,this.ecModel),r=gD.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},n.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},n.prototype.setZoom=function(t){this.option.zoom=t},n.prototype.setCenter=function(t){this.option.center=t},n.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return rg("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},n.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=xD(i,this),n.collapsed=!i.isExpand,n},n.type="series.tree",n.layoutMode="box",n.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},n}(_g);function bD(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function wD(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=HC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=HC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),bD(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=YC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),bD(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),bD(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function SD(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();D(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var MD=["treemapZoomToNode","treemapRender","treemapMove"];function ID(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=cd(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var TD=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.preventUsingHoverLayer=!0,e}return e(n,t),n.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};CD(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new Tc({itemStyle:r},this,e);i=t.levels=function(t,e){var n,i,r=Io(e.get("color")),o=Io(e.get(["aria","decal","decals"]));if(!r)return;t=t||[],N(t,(function(t){var e=new Tc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e);var a=E(i||[],(function(t){return new Tc(t,o,e)}),this),s=gD.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},n.prototype.optionUpdated=function(){this.resetViewRoot()},n.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return rg("nameValue",{name:i.getName(t),value:r})},n.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=xD(i,this),n.treePathInfo=n.treeAncestors,n},n.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},D(this.layoutInfo,t)},n.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=gt(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},n.prototype.getViewRoot=function(){return this._viewRoot},n.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},n.prototype.enableAriaDecal=function(){ID(this)},n.type="series.treemap",n.layoutMode="box",n.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,scaleLimit:null,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}},emphasis:{itemStyle:{color:"rgba(0,0,0,0.9)"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},n}(_g);function CD(t){var e=0;N(t.children,(function(t){CD(t);var n=t.value;H(n)&&(n=n[0]),e+=n}));var n=t.value;H(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),H(t.value)?t.value[0]=n:t.value=n}var DD=function(){function t(t){this.group=new Vr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=r.getModel("emphasis"),l=a.getModel("textStyle"),u=s.getModel(["itemStyle","textStyle"]),h={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,h,l),this._renderContent(t,h,a,s,l,u,i),kp(o,h.pos,h.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=Oo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r,o,a){for(var s,l,u,h,c,p,d,f,g,y=0,v=e.emptyItemWidth,m=t.get(["breadcrumb","height"]),x=(s=e.pos,l=e.box,h=l.width,c=l.height,p=Kr(s.left,h),d=Kr(s.top,c),f=Kr(s.right,h),g=Kr(s.bottom,c),(isNaN(p)||isNaN(parseFloat(s.left)))&&(p=0),(isNaN(f)||isNaN(parseFloat(s.right)))&&(f=h),(isNaN(d)||isNaN(parseFloat(s.top)))&&(d=0),(isNaN(g)||isNaN(parseFloat(s.bottom)))&&(g=c),u=yp(u||0),{width:Math.max(f-p-u[1]-u[3],0),height:Math.max(g-d-u[0]-u[2],0)}),_=e.totalWidth,b=e.renderList,w=i.getModel("itemStyle").getItemStyle(),S=b.length-1;S>=0;S--){var M=b[S],I=M.node,T=M.width,C=M.text;_>x.width&&(_-=T-v,T=v,C=null);var D=new Yu({shape:{points:AD(y,0,T,m,S===b.length-1,0===S)},style:A(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new Ys({style:rc(r,{text:C})}),textConfig:{position:"inside"},z2:1e5,onclick:W(a,I)});D.disableLabelAnimation=!0,D.getTextContent().ensureState("emphasis").style=rc(o,{text:C}),D.ensureState("emphasis").style=w,Ul(D,i.get("focus"),i.get("blurScope"),i.get("disabled")),this.group.add(D),kD(D,t,I),y+=T+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function AD(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function kD(t,e,n){il(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&xD(n,e)}}var LD=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},n.prototype._onZoom=function(t){var e=t.originX,n=t.originY,i=t.scale;if("animating"!==this._state){var r=this.seriesModel.getData().tree.root;if(!r)return;var o=r.getLayout();if(!o)return;var a,s=new Ee(o.x,o.y,o.width,o.height),l=this._controllerHost;a=l.zoomLimit;var u=l.zoom=l.zoom||1;if(u*=i,a){var h=a.min||0,c=a.max||1/0;u=Math.max(Math.min(c,u),h)}var p=u/l.zoom;l.zoom=u;var d=this.seriesModel.layoutInfo,f=[1,0,0,1,0,0];be(f,f,[-(e-=d.x),-(n-=d.y)]),Se(f,f,[p,p]),be(f,f,[e,n]),s.applyTransform(f),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:s.x,y:s.y,width:s.width,height:s.height}})}},n.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&Sp(a,s)}}}}}),this)},n.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new DD(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(mD(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},n.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},n.prototype.dispose=function(){this._clearController()},n.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},n.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},n.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},n.type="treemap",n}(Pg);var FD=N,GD=j,WD=-1,HD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=I(e);this.type=i,this.mappingMethod=n,this._normalizeData=QD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(YD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,N(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(FD(e,(function(t,e){n[t]=e})),!H(i)){var r=[];j(i)?FD(i,(function(t,e){var i=n[e];r[null!=i?i:WD]=t})):r[-1]=i,i=JD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):YD(r,!0):(st("linear"!==n||r.dataExtent),YD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return G(this._normalizeData,this)},t.listVisualTypes=function(){return F(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){j(t)?N(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=H(e)?[]:j(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&FD(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(H(t))t=t.slice();else{if(!GD(t))return[];var e=[];FD(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new HD(c);return eA(p).drColorMappingBy=h,p}(0,r,o,0,u,d);N(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=D({},e);if(r){var s=r.type,l="color"===s&&eA(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);iA(t,o,n,i)}}))}else s=rA(u),h.fill=s}}function rA(t){var e=oA(t,"color");if(e){var n=oA(t,"colorAlpha"),i=oA(t,"colorSaturation");return i&&(e=ei(e,null,null,i)),n&&(e=ni(e,n)),e}}function oA(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function aA(t,e){var n=t.get(e);return H(n)&&n.length?{name:e,range:n}:null}var sA=Math.max,lA=Math.min,uA=nt,hA=N,cA=["itemStyle","borderWidth"],pA=["itemStyle","gapWidth"],dA=["upperLabel","show"],fA=["upperLabel","height"],gA={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=Ap(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Kr(uA(s.width,l[0]),r),h=Kr(uA(s.height,l[1]),o),c=i&&i.type,p=yD(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=vD(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pro&&(u=ro),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?sA(u*i/l,l/(u*r)):1/0}function mA(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},n}(Vr),ik=function(){function t(t){this.group=new Vr,this._LineCtor=t||nk}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=rk(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=rk(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function fk(t,e){var n=[],i=Cn,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[It(l[0]),It(l[1])],l[2]&&l.__original.push(It(l[2])));var c=l.__original;if(null!=l[2]){if(Mt(r[0],c[0]),Mt(r[1],c[2]),Mt(r[2],c[1]),u&&"none"!==u){var p=EA(t.node1),d=dk(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=EA(t.node2),d=dk(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}Mt(l[0],r[0]),Mt(l[1],r[2]),Mt(l[2],r[1])}else{if(Mt(o[0],c[0]),Mt(o[1],c[1]),At(a,o[1],o[0]),Nt(a,a),u&&"none"!==u){p=EA(t.node1);Dt(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=EA(t.node2);Dt(o[1],o[1],a,-p*e)}Mt(l[0],o[0]),Mt(l[1],o[1])}}))}function gk(t){return"view"===t.type}var yk=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(t,e){var n=new PS,i=new ik,r=this.group;this._controller=new gT(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},n.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(gk(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):yh(s,l,t)}fk(t.getGraph(),NA(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p);var d=t.get("layout");u.graph.eachNode((function(e){var n=e.dataIndex,r=e.getGraphicEl(),o=e.getModel();if(r){r.off("drag").off("dragend");var a=o.get("draggable");a&&r.on("drag",(function(o){switch(d){case"force":c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(n),u.setItemLayout(n,[r.x,r.y]);break;case"circular":u.setItemLayout(n,[r.x,r.y]),e.setLayout({fixed:!0},!0),BA(t,"symbolSize",e,[o.offsetX,o.offsetY]),i.updateLayout(t);break;default:u.setItemLayout(n,[r.x,r.y]),OA(t.getGraph(),t),i.updateLayout(t)}})).on("dragend",(function(){c&&c.setUnfixed(n)})),r.setDraggable(a,!!o.get("cursor")),"adjacency"===o.get(["emphasis","focus"])&&(il(r).focus=e.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(il(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var f="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),g=u.getLayout("cx"),y=u.getLayout("cy");u.graph.eachNode((function(t){GA(t,f,g,y)})),this._firstRender=!1},n.prototype.dispose=function(){this.remove(),this._controller&&this._controller.dispose(),this._controllerHost=null},n.prototype._startForceLayoutIteration=function(t,e){var n=this;!function i(){t.step((function(t){n.updateLayout(n._model),(n._layouting=!t)&&(e?n._layoutTimeout=setTimeout(i,16):i())}))}()},n.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!ST(e,n,t)})),gk(t.coordinateSystem)?(r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){xT(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){_T(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(),fk(t.getGraph(),NA(t)),i._lineDraw.updateLayout(),n.updateLabelLayout()}))):r.disable()},n.prototype._updateNodeAndLinkScale=function(){var t=this._model,e=t.getData(),n=NA(t);e.eachItemGraphicEl((function(t,e){t&&t.setSymbolScale(n)}))},n.prototype.updateLayout=function(t){fk(t.getGraph(),NA(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},n.prototype.remove=function(){clearTimeout(this._layoutTimeout),this._layouting=!1,this._layoutTimeout=null,this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()},n.type="graph",n}(Pg);function vk(t){return"_EC_"+t}var mk=function(){function t(t){this.type="graph",this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this._directed=t||!1}return t.prototype.isDirected=function(){return this._directed},t.prototype.addNode=function(t,e){t=null==t?""+e:""+t;var n=this._nodesMap;if(!n[vk(t)]){var i=new xk(t,e);return i.hostGraph=this,this.nodes.push(i),n[vk(t)]=i,i}},t.prototype.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},t.prototype.getNodeById=function(t){return this._nodesMap[vk(t)]},t.prototype.addEdge=function(t,e,n){var i=this._nodesMap,r=this._edgesMap;if(Z(t)&&(t=this.nodes[t]),Z(e)&&(e=this.nodes[e]),t instanceof xk||(t=i[vk(t)]),e instanceof xk||(e=i[vk(e)]),t&&e){var o=t.id+"-"+e.id,a=new _k(t,e,n);return a.hostGraph=this,this._directed&&(t.outEdges.push(a),e.inEdges.push(a)),t.edges.push(a),t!==e&&e.edges.push(a),this.edges.push(a),r[o]=a,a}},t.prototype.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},t.prototype.getEdge=function(t,e){t instanceof xk&&(t=t.id),e instanceof xk&&(e=e.id);var n=this._edgesMap;return this._directed?n[t+"-"+e]:n[t+"-"+e]||n[e+"-"+t]},t.prototype.eachNode=function(t,e){for(var n=this.nodes,i=n.length,r=0;r=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof xk||(e=this._nodesMap[vk(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function wk(t,e,n,i,r){for(var o=new mk(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=kx(t,n);else{var g=bd.get(f),y=g&&g.dimensions||[];L(y,"value")<0&&y.concat(["value"]);var v=bx(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new _x(v,n)).initData(t)}var m=new _x(["value"],n);return m.initData(l,s),r&&r(d,m),aD({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}O(xk,bk("hostGraph","data")),O(_k,bk("hostGraph","edgeData"));var Sk=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.hasSymbolVisual=!0,e}return e(n,t),n.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new jM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},n.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},n.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),To(e,"edgeLabel",["show"])},n.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){TA(n=this)&&(n.__curvenessList=[],n.__edgeMap={},CA(n));var a=wk(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=Tc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return N(a.edges,(function(t){!function(t,e,n,i){if(TA(n)){var r=DA(t,e,n),o=n.__edgeMap,a=o[AA(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},n.prototype.getGraph=function(){return this.getData().graph},n.prototype.getEdgeData=function(){return this.getGraph().edgeData},n.prototype.getCategoriesData=function(){return this._categoriesData},n.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),rg("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return yg({series:this,dataIndex:t,multipleSeries:e})},n.prototype._updateCategoriesData=function(){var t=E(this.option.categories||[],(function(t){return null!=t.value?t:D({value:0},t)})),e=new _x(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},n.prototype.setZoom=function(t){this.option.zoom=t},n.prototype.setCenter=function(t){this.option.center=t},n.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},n.type="series.graph",n.dependencies=["grid","polar","geo","singleAxis","calendar"],n.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},n}(_g),Mk={type:"graphRoam",event:"graphRoam",update:"none"};var Ik=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},Tk=function(t){function n(e){var n=t.call(this,e)||this;return n.type="pointer",n}return e(n,t),n.prototype.getDefaultShape=function(){return new Ik},n.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},n}(As);function Ck(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):Y(e)&&(n=e(t))),n}var Dk=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Kr(n[0],e.getWidth()),cy:Kr(n[1],e.getHeight()),r:Kr(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},n.prototype.dispose=function(){},n.prototype._renderMain=function(t,e,n,i,r){var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?cM:Bu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=[s,l];ls(f,!a);for(var g=(l=f[1])-(s=f[0]),y=s,v=[],m=0;c&&m=t&&(0===e?0:i[e-1][0])Math.PI/2&&(V+=Math.PI):"tangential"===z?V=-M-Math.PI/2:Z(z)&&(V=z*Math.PI/180),0===V?c.add(new Ys({style:rc(x,{text:O,x:N,y:E,verticalAlign:h<-.8?"top":h>.8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0})):c.add(new Ys({style:rc(x,{text:O,x:N,y:E,verticalAlign:"middle",align:"center"},{inheritColor:R}),silent:!0,originX:N,originY:E,rotation:V}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var B=0;B<=b;B++){u=Math.cos(M),h=Math.sin(M);var F=new qu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&F.setStyle({stroke:i((k+B/b)/_)}),c.add(F),M+=T}M-=T}else M+=I}},n.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Kr(o.get("width"),r.r),s=Kr(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Kr(u[0],r.r),c=Kr(u[1],r.r),p=o.get("keepAspect");return(i=l?Yy(l,h-a/2,c-s,a,s,null,p):new Tk({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?cM:Bu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);vh(i,{rotation:-((isNaN(+n)?b[0]:qr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");vh(r,{shape:{endAngle:qr(n,_,b,a)}},t),u.add(r),rl(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,yh(s,{rotation:-((isNaN(+i)?b[0]:qr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");yh(m,{shape:{endAngle:qr(i,_,b,x)}},t),u.add(m),rl(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof Rs){var h=s.style;s.useStyle(D({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(qr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,Kl(s,e),Ul(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,Kl(c,e),Ul(c,r,o,a)}})),this._progressEls=p)},n.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=Yy(r,e.cx-i/2+Kr(o[0],e.r),e.cy-i/2+Kr(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},n.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Vr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new Ys({silent:!0}),p[t]=new Ys({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Vr,y=i(qr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Kr(m[0],r.r),_=r.cy+Kr(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:rc(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Kr(w[0],r.r),M=r.cy+Kr(w[1],r.r),I=Kr(b.get("width"),r.r),T=Kr(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:rc(b,{x:S,y:M,text:Ck(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),pc(D,{normal:b},o,(function(t){return Ck(t,A)})),d&&dc(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return Ck(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},n.type="gauge",n}(Pg),Ak=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.visualStyleAccessPath="itemStyle",e}return e(n,t),n.prototype.getInitialData=function(t,e){return ZM(this,["value"])},n.type="series.gauge",n.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12,rotate:0},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},n}(_g);var kk=["itemStyle","opacity"],Lk=function(t){function n(e,n){var i=t.call(this)||this,r=i,o=new Uu,a=new Ys;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return e(n,t),n.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(kk);l=null==l?1:l,n||wh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,vh(i,{style:{opacity:l}},r,e)):yh(i,{style:{opacity:l},shape:{points:a.points}},r,e),Kl(i,o),this._updateLabel(t,e),Ul(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},n.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;nc(r,ic(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ce(h[0][0],h[0][1]):null},yh(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),Hb(n,Yb(a),{stroke:u})},n}(Yu),Pk=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.ignoreLabelLineUpdate=!0,e}return e(n,t),n.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new Lk(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){bh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},n.prototype.remove=function(){this.group.removeAll(),this._data=null},n.prototype.dispose=function(){},n.type="funnel",n}(Pg),Ok=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new jM(G(this.getData,this),G(this.getRawData,this)),this._defaultLabelLine(e)},n.prototype.getInitialData=function(t,e){return ZM(this,{coordDimensions:["value"],encodeDefaulter:W(td,this)})},n.prototype._defaultLabelLine=function(t){To(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},n.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},n.type="series.funnel",n.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},n}(_g);function Rk(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&Zk(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function Zk(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var jk=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},n.prototype.mergeOption=function(t){var e=this.option;t&&T(e,t,!0),this._initDimensions()},n.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},n.prototype.setAxisExpand=function(t){N(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},n.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];N(V(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},n.type="parallel",n.dependencies=["parallelAxis"],n.layoutMode="box",n.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},n}(Ep),qk=function(t){function n(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return e(n,t),n.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},n}(gb);function Kk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=Jk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=Jk(s,[0,a]),r=o=Jk(s,[r,o]),i=0}e[0]=Jk(e[0],n),e[1]=Jk(e[1],n);var l=$k(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=Jk(e[i],c),u=$k(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function $k(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function Jk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var Qk=N,tL=Math.min,eL=Math.max,nL=Math.floor,iL=Math.ceil,rL=$r,oL=Math.PI,aL=function(){function t(t,e,n){this.type="parallel",this._axesMap=gt(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;Qk(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new qk(t,k_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();Qk(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),A_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=sL(e.get("axisExpandWidth"),l),c=sL(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=sL(d[1]-d[0],l),d[1]=d[0]+t):(t=sL(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||nL(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[nL(rL(d[0]/h,1))+1,iL(rL(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),Qk(n,(function(e,n){var o=(i.axisExpandable?uL:lL)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:oL/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];we(h,h,u),be(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];N(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?Kk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[eL(0,o[1]*s/p-p/2)])[1]=tL(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function sL(t,e){return tL(eL(t,e[0]),e[1])}function lL(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function uL(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)Jr(e[n])},n.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&kL(t);var l=I(s);l.brushType=ZL(l.brushType,a),l.panelId=a===pL?null:a.panelId,o=t._creatingCover=wL(t,l),t._covers.push(o)}if(o){var u=KL[ZL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(HL(t,o,t._track)),i&&(SL(t,o),u.updateCommon(t,o)),ML(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&DL(t,e,n)&&kL(t)&&(r={isEnd:i,removeOnClick:!0});return r}function ZL(t,e){return"auto"===t?e.defaultBrushType:t}var jL={mousedown:function(t){if(this._dragging)qL(this,t);else if(!t.target||!t.target.draggable){YL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=DL(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=DL(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new Tc(r[a],this,e));if(i&&n){var s=wk(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))}));return s.data}},n.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},n.prototype.getGraph=function(){return this.getData().graph},n.prototype.getEdgeData=function(){return this.getGraph().edgeData},n.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return rg("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return rg("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},n.prototype.optionUpdated=function(){},n.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},n.type="series.sankey",n.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},edgeLabel:{show:!1,fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},n}(_g);function pP(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){N(t,(function(t){var e=wP(t.outEdges,bP),n=wP(t.inEdges,bP),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)gP(s,l*=.99,a),fP(s,r,n,i,a),SP(s,l,a),fP(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";N(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),N(t,(function(t){var e=0,n=0;N(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),N(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==V(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function dP(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function fP(t,e,n,i,r){var o="vertical"===r?"x":"y";N(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function gP(t,e,n){N(t.slice().reverse(),(function(t){N(t,(function(t){if(t.outEdges.length){var i=wP(t.outEdges,yP,n)/wP(t.outEdges,bP);if(isNaN(i)){var r=t.outEdges.length;i=r?wP(t.outEdges,vP,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-_P(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-_P(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function yP(t,e){return _P(t.node2,e)*t.getValue()}function vP(t,e){return _P(t.node2,e)}function mP(t,e){return _P(t.node1,e)*t.getValue()}function xP(t,e){return _P(t.node1,e)}function _P(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function bP(t){return t.getValue()}function wP(t,e,n){for(var i=0,r=t.length,o=-1;++oo&&(o=e)})),N(n,(function(e){var n=new HD({type:"color",mappingMethod:"linear",dataExtent:[r,o],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),i=e.getModel().get(["itemStyle","color"]);null!=i?(e.setVisual("color",i),e.setVisual("style",{fill:i})):(e.setVisual("color",n),e.setVisual("style",{fill:n}))}))}i.length&&N(i,(function(t){var e=t.getModel().get("lineStyle");t.setVisual("style",e)}))}))}var IP=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];N(g,(function(t,e){var n;H(t)?(n=t.slice(),t.unshift(e)):H(t.value)?((n=D({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Qm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Qm(f),dimsDef:v.slice()}];return ZM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:W(Qp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),TP=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],e.visualDrawType="stroke",e}return e(n,t),n.type="series.boxplot",n.dependencies=["xAxis","yAxis","grid"],n.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},n}(_g);O(TP,IP,!0);var CP=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=kP(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(wh(n),LP(s,n,i,t)):n=kP(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},n.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},n.type="boxplot",n}(Pg),DP=function(){},AP=function(t){function n(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return e(n,t),n.prototype.getDefaultShape=function(){return new DP},n.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var EP=["color","borderColor"],zP=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},n.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},n.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},n.prototype.eachRendered=function(t){$h(this._progressiveEls||this.group,t)},n.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},n.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&GP(s,a))return;var l=FP(a,n,!0);vh(l,{shape:{points:a.ends}},t,n),WP(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&GP(s,h)?i.remove(u):(u?(yh(u,{shape:{points:h.ends}},t,a),wh(u)):u=FP(h),WP(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},n.prototype._renderLarge=function(t){this._clear(),UP(t,this.group);var e=t.get("clip",!0)?XS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},n.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=FP(i.getItemLayout(n));WP(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},n.prototype._incrementalRenderLarge=function(t,e){UP(e,this.group,this._progressiveEls,!0)},n.prototype.remove=function(t){this._clear()},n.prototype._clear=function(){this.group.removeAll(),this._data=null},n.type="candlestick",n}(Pg),VP=function(){},BP=function(t){function n(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return e(n,t),n.prototype.getDefaultShape=function(){return new VP},n.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},n}(As);function FP(t,e,n){var i=t.ends;return new BP({shape:{points:n?HP(i,t):i},z2:100})}function GP(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]);0===t&&(r=n.get(["itemStyle","borderColorDoji"]));var o=n.getModel("itemStyle").getItemStyle(EP);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var jP=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],e}return e(n,t),n.prototype.getShadowDim=function(){return"open"},n.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},n.type="series.candlestick",n.dependencies=["xAxis","yAxis","grid"],n.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderColorDoji:null,borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},n}(_g);function qP(t){t&&H(t.series)&&N(t.series,(function(t){j(t)&&"k"===t.type&&(t.type="candlestick")}))}O(jP,IP,!0);var KP=["itemStyle","borderColor"],$P=["itemStyle","borderColor0"],JP=["itemStyle","borderColorDoji"],QP=["itemStyle","color"],tO=["itemStyle","color0"],eO={seriesType:"candlestick",plan:Ag(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?QP:tO)}function i(t,e){return e.get(0===t?JP:t>0?KP:$P)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,D(e.ensureUniqueItemVisual(r,"style"),s)}}}}},nO={seriesType:"candlestick",plan:Ag(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Kr(it(t.get("barMaxWidth"),r),r),a=Kr(it(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Kr(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=E(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(n,i){var r,a,c=jx(4*n.count),p=0,d=[],f=[],g=i.getStore(),y=!!t.get(["itemStyle","borderColorDoji"]);for(;null!=(a=n.next());){var v=g.get(o,a),m=g.get(s,a),x=g.get(l,a),_=g.get(u,a),b=g.get(h,a);isNaN(v)||isNaN(_)||isNaN(b)?(c[p++]=NaN,p+=3):(c[p++]=iO(g,a,m,x,l,y),d[0]=v,d[1]=_,r=e.dataToPoint(d,null,f),c[p++]=r?r[0]:NaN,c[p++]=r?r[1]:NaN,d[1]=b,r=e.dataToPoint(d,null,f),c[p++]=r?r[1]:NaN)}i.setLayout("largePoints",c)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=M(y,c),x=M(v,c),_=M(f,c),b=M(g,c),w=[];I(w,x,0),I(w,m,1),w.push(C(b),C(x),C(_),C(m));var S=!!n.getItemModel(r).get(["itemStyle","borderColorDoji"]);n.setItemLayout(r,{sign:iO(a,r,p,d,l,S),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:T(f,g,c)})}function M(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function I(t,e,n){var r=e.slice(),o=e.slice();r[0]=zh(r[0]+i/2,1,!1),o[0]=zh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function T(t,e,n){var r=M(t,n),o=M(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function C(t){return t[0]=zh(t[0],1),t}}}}};function iO(t,e,n,i,r,o){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function rO(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var oO=function(t){function n(e,n){var i=t.call(this)||this,r=new CS(e,n),o=new Vr;return i.add(r),i.add(o),i.updateData(e,n),i}return e(n,t),n.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},n.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(o=this._getLineLength(i)/l*1e3),o!==this._period||a!==this._loop||s!==this._roundTrip){i.stopAnimation();var h=void 0;h=Y(u)?u(n):u,i.__t>0&&(h=-o*i.__t),this._animateSymbol(i,o,h,a,s)}this._period=o,this._loop=a,this._roundTrip=s}},n.prototype._animateSymbol=function(t,e,n,i,r){if(e>0){t.__t=0;var o=this,a=t.animate("",i).when(r?2*e:e,{__t:r?2:1}).delay(n).during((function(){o._updateSymbolPosition(t)}));i||a.done((function(){o.remove(t)})),a.start()}},n.prototype._getLineLength=function(t){return zt(t.__p1,t.__cp1)+zt(t.__cp1,t.__p2)},n.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},n.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},n.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t<1?t.__t:2-t.__t,o=[t.x,t.y],a=o.slice(),s=Mn,l=In;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=t.__t<1?l(e[0],i[0],n[0],r):l(n[0],i[0],e[0],1-r),h=t.__t<1?l(e[1],i[1],n[1],r):l(n[1],i[1],e[1],1-r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=t.__t<1?u[0]-l[0]:l[0]-u[0],c=t.__t<1?u[1]-l[1]:l[1]-u[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},n}(lO),cO=function(){this.polyline=!1,this.curveness=0,this.segs=[]},pO=function(t){function n(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return e(n,t),n.prototype.reset=function(){this.notClear=!1,this._off=0},n.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},n.prototype.getDefaultShape=function(){return new cO},n.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n0){t.moveTo(i[n++],i[n++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},n.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if(ps(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(hs(u,h,p,d,o,t,e))return a;a++}return-1},n.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},n.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),fO={seriesType:"lines",plan:Ag(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&XS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},n.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},n.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},n.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},n.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=fO.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},n.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new dO:new ik(r?i?hO:uO:i?lO:nk),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},n.prototype._showEffect=function(t){return!!t.get(["effect","show"])},n.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},n.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},n.prototype.dispose=function(t,e){this.remove(t,e)},n.type="lines",n}(Pg),yO="undefined"==typeof Uint32Array?Array:Uint32Array,vO="undefined"==typeof Float64Array?Array:Float64Array;function mO(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=E(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),C([e,t[0],t[1]])})))}var xO=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.visualStyleAccessPath="lineStyle",e.visualDrawType="stroke",e}return e(n,t),n.prototype.init=function(e){e.data=e.data||[],mO(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},n.prototype.mergeOption=function(e){if(mO(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},n.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=yt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=yt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},n.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},n.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},n.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r ")})},n.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},n.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},n.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},n.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},n.type="series.lines",n.dependencies=["grid","polar","geo","calendar"],n.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},n}(_g);function _O(t){return t instanceof Array||(t=[t,t]),t}var bO={seriesType:"lines",reset:function(t){var e=_O(t.get("symbol")),n=_O(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=_O(n.getShallow("symbol",!0)),r=_O(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var wO=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=u.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=u.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function SO(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var MO=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):SO(r)&&this._renderOnGeo(r,t,i,n)},n.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},n.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(SO(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},n.prototype.eachRendered=function(t){$h(this._progressiveEls||this.group,t)},n.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem,h=US(u,"cartesian2d");if(h){var c=u.getAxis("x"),p=u.getAxis("y");0,o=c.getBandWidth()+.5,a=p.getBandWidth()+.5,s=c.scale.getExtent(),l=p.scale.getExtent()}for(var d=this.group,f=t.getData(),g=t.getModel(["emphasis","itemStyle"]).getItemStyle(),y=t.getModel(["blur","itemStyle"]).getItemStyle(),v=t.getModel(["select","itemStyle"]).getItemStyle(),m=t.get(["itemStyle","borderRadius"]),x=ic(t),_=t.getModel("emphasis"),b=_.get("focus"),w=_.get("blurScope"),S=_.get("disabled"),M=h?[f.mapDimension("x"),f.mapDimension("y"),f.mapDimension("value")]:[f.mapDimension("time"),f.mapDimension("value")],I=n;Is[1]||Al[1])continue;var k=u.dataToPoint([D,A]);T=new Gs({shape:{x:k[0]-o/2,y:k[1]-a/2,width:o,height:a},style:C})}else{if(isNaN(f.get(M[1],I)))continue;T=new Gs({z2:1,shape:u.dataToRect([f.get(M[0],I)]).contentShape,style:C})}if(f.hasItemOption){var L=f.getItemModel(I),P=L.getModel("emphasis");g=P.getModel("itemStyle").getItemStyle(),y=L.getModel(["blur","itemStyle"]).getItemStyle(),v=L.getModel(["select","itemStyle"]).getItemStyle(),m=L.get(["itemStyle","borderRadius"]),b=P.get("focus"),w=P.get("blurScope"),S=P.get("disabled"),x=ic(L)}T.shape.r=m;var O=t.getRawValue(I),R="-";O&&null!=O[2]&&(R=O[2]+""),nc(T,x,{labelFetcher:t,labelDataIndex:I,defaultOpacity:C.opacity,defaultText:R}),T.ensureState("emphasis").style=g,T.ensureState("blur").style=y,T.ensureState("select").style=v,Ul(T,b,w,S),T.incremental=r,r&&(T.states.emphasis.hoverLayer=!0),d.add(T),f.setItemGraphicEl(I,T),this._progressiveEls&&this._progressiveEls.push(T)}},n.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new wO;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=E(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=H(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Kr(h[p.index],d),h[c.index]=Kr(h[c.index],i?d:Math.abs(o)),u.symbolSize=h;var g=u.symbolScale=[h[0]/s,h[1]/s];g[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(TO)||0;o&&(DO.attr({scaleX:e[0],scaleY:e[1],rotation:n}),DO.updateTransform(),o/=DO.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o||0}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Uy(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=nt(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Kr(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=yo(i),M=S?i:UO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?UO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var A=c.barRectShape=D({},n);A[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),A[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function LO(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function PO(t){var e=t.symbolPatternSize,n=Yy(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function OO(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(HO(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function RO(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?YO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=PO(n),r.add(o),YO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function NO(t,e,n){var i=D({},e.barRectShape),r=t.__pictorialBarRect;r?YO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Gs({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function EO(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=D({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)yh(r,{shape:o},s,l);else{o[a.wh]=0,r=new Gs({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Jh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function zO(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=VO,n.isAnimationEnabled=BO,n}function VO(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function BO(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function FO(t,e,n,i){var r=new Vr,o=new Vr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?OO(r,e,n):RO(r,0,n),NO(r,n,i),EO(r,e,n,i),r.__pictorialShapeStr=WO(t,n),r.__pictorialSymbolMeta=n,r}function GO(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];HO(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),N(o,(function(t){xh(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function WO(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function HO(t,e,n){N(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function YO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Jh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function XO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");HO(t,(function(t){if(t instanceof Rs){var e=t.style;t.useStyle(D({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)],f=t.__pictorialBarRect;f.ignoreClip=!0,nc(f,ic(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:IS(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Ul(t,h,c,o.get("disabled"))}function UO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var ZO=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.hasSymbolVisual=!0,e.defaultSymbol="roundRect",e}return e(n,t),n.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},n.type="series.pictorialBar",n.dependencies=["grid"],n.defaultOption=Ac(lM.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",clip:!1,progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),n}(lM);var jO=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e._layers=[],e}return e(n,t),n.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Km(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fI&&!ao(C-I)&&C0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new JO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},n.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)Sp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},n.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:QO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},n.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},n.type="sunburst",n}(Pg),nR=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.ignoreStyleOnData=!0,e}return e(n,t),n.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};iR(n);var i=this._levelModels=E(t.levels||[],(function(t){return new Tc(t,this,e)}),this),r=gD.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},n.prototype.optionUpdated=function(){this.resetViewRoot()},n.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=xD(i,this),n},n.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},n.prototype.getViewRoot=function(){return this._viewRoot},n.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},n.prototype.enableAriaDecal=function(){ID(this)},n.type="series.sunburst",n.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},n}(_g);function iR(t){var e=0;N(t.children,(function(t){iR(t);var n=t.value;H(n)&&(n=n[0]),e+=n}));var n=t.value;H(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),H(t.value)?t.value[0]=n:t.value=n}var rR=Math.PI/180;function oR(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");H(i)||(i=[0,i]),H(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Kr(e[0],r),l=Kr(e[1],o),u=Kr(i[0],a/2),h=Kr(i[1],a/2),c=-t.get("startAngle")*rR,p=t.get("minAngle")*rR,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&aR(f,y);var v=0;N(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Kn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),D(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var lR={color:"fill",borderColor:"stroke"},uR={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},hR=zo(),cR=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},n.prototype.getInitialData=function(t,e){return kx(null,this)},n.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=hR(i).info),r},n.type="series.custom",n.dependencies=["grid","polar","geo","singleAxis","calendar"],n.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},n}(_g);function pR(t,e){return e=e||[0,0],E(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function dR(t,e){return e=e||[0,0],E([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function fR(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function gR(t,e){return e=e||[0,0],E(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function yR(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||xt(t,"text")))}function vR(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},xt(a,"text")&&(o.text=a.text),xt(a,"rich")&&(o.rich=a.rich),xt(a,"textFill")&&(o.fill=a.textFill),xt(a,"textStroke")&&(o.stroke=a.textStroke),xt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),xt(a,"fontSize")&&(o.fontSize=a.fontSize),xt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),xt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=xt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),xt(a,"textPosition")&&(i.position=a.textPosition),xt(a,"textOffset")&&(i.offset=a.textOffset),xt(a,"textRotation")&&(i.rotation=a.textRotation),xt(a,"textDistance")&&(i.distance=a.textDistance)}return mR(o,t),N(o.rich,(function(t){mR(t,t)})),{textConfig:i,textContent:r}}function mR(t,e){e&&(e.font=e.textFont||e.font,xt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),xt(e,"textAlign")&&(t.align=e.textAlign),xt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),xt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),xt(e,"textWidth")&&(t.width=e.textWidth),xt(e,"textHeight")&&(t.height=e.textHeight),xt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),xt(e,"textPadding")&&(t.padding=e.textPadding),xt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),xt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),xt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),xt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),xt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),xt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),xt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function xR(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";_R(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,N(e.rich,(function(t){_R(t,t)})),i}function _R(t,e){e&&(xt(e,"fill")&&(t.textFill=e.fill),xt(e,"stroke")&&(t.textStroke=e.fill),xt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),xt(e,"font")&&(t.font=e.font),xt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),xt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),xt(e,"fontSize")&&(t.fontSize=e.fontSize),xt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),xt(e,"align")&&(t.textAlign=e.align),xt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),xt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),xt(e,"width")&&(t.textWidth=e.width),xt(e,"height")&&(t.textHeight=e.height),xt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),xt(e,"padding")&&(t.textPadding=e.padding),xt(e,"borderColor")&&(t.textBorderColor=e.borderColor),xt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),xt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),xt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),xt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),xt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),xt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),xt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),xt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),xt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),xt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var bR={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},wR=F(bR),SR=(z(vr,(function(t,e){return t[e]=1,t}),{}),vr.join(", "),["","style","shape","extra"]),MR=zo();function IR(t,e,n,i,r){var o=t+"Animation",a=fh(t,i,r)||{},s=MR(e).userDuring;return a.duration>0&&(a.during=s?G(PR,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),D(a,n[o]),a}function TR(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=MR(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=F(n);for(u=0;u0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=IR("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);CR(t,e),u?t.dirty():t.markRedraw()}function CR(t,e){for(var n=MR(t).leaveToProps,i=0;i=0){!o&&(o=i[t]={});var p=F(a);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:G(gR,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function KR(t){return t instanceof As}function $R(t){return t instanceof Ca}var JR=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=iN(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){oN(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);n&&DR(n,hR(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);oN(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?XS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},n.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},n.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=iN(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,FR).getItemStyle(),o=x(i,FR),a=rc(o,null,null,!0,!0);a.text=o.getShallow("show")?rt(t.getFormattedLabel(i,FR),t.getFormattedLabel(i,GR),IS(e,i)):null;var l=oc(o,null,!0);return b(n,r),r=xR(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),xt(lR,t)){var i=e.getItemVisual(n,"style");return i?i[lR[t]]:null}if(xt(uR,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;f--){var g=e.childAt(f);cN(e,g,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function sN(t,e,n){var i,r=hR(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(xt(i,"pathData")||xt(i,"d")))&&gN(a)!==r.customPathData||"image"===o&&xt(s,"image")&&s.image!==r.customImagePath}function lN(t,e,n){var i=e?uN(t,e):t,r=e?hN(t,i,FR):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?uN(s,e):s:null;if(r&&(n.isLegacy||yR(r,o,!!a,!!l))){n.isLegacy=!0;var u=vR(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function uN(t,e){return e?t?t[e]:null:t}function hN(t,e,n){var i=e&&e.style;return null==i&&n===FR&&t&&(i=t.styleEmphasis),i}function cN(t,e,n){e&&DR(e,hR(t).option,n)}function pN(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function dN(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;aN(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function fN(t){var e=this.context,n=e.oldChildren[t];n&&DR(n,hR(n).option,e.seriesModel)}function gN(t){return t&&(t.pathData||t.d)}var yN=zo(),vN=I,mN=G,xN=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=W(_N,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Vr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);MN(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=NI(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=yN(t).pointerEl=new Jh[r.type](vN(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=yN(t).labelEl=new Ys(vN(e.label));t.add(r),wN(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=yN(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=yN(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),wN(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Xh(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){pe(t.event)},onmousedown:mN(this._onHandleDragMove,this,0,0),drift:mN(this._onHandleDragMove,this),ondragend:mN(this._onHandleDragEnd,this)}),i.add(r)),MN(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");H(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Wg(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){_N(this._axisPointerModel,!e&&this._moveAnimation,this._handle,SN(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(SN(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(SN(i)),yN(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),Hg(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function _N(t,e,n,i){bN(yN(n).lastProp,i)||(yN(n).lastProp=i,e?yh(n,i,t):(n.stopAnimation(),n.attr(i)))}function bN(t,e){if(j(t)&&j(e)){var n=!0;return N(e,(function(e,i){n=n&&bN(t[i],e)})),!!n}return t===e}function wN(t,e){t[e.get(["label","show"])?"show":"hide"]()}function SN(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function MN(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function IN(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function TN(t,e,n,i,r){var o=CN(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=yp(a.get("padding")||0),l=a.getFont(),u=wr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:rc(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function CN(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:P_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};N(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):Y(a)&&(o=a(s))}return o}function DN(t,e,n){var i=[1,0,0,1,0,0];return we(i,i,n.rotation),be(i,i,n.position),Bh([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function AN(t,e,n,i,r,o){var a=TI.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),TN(e,i,r,o,{position:DN(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function kN(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function LN(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function PN(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var ON=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=RN(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=IN(i),c=NN[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}AN(e,t,yI(a.model,n),n,i,r)},n.prototype.getHandleTransform=function(t,e,n){var i=yI(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=DN(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},n.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=RN(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},n}(xN);function RN(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var NN={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:kN([e,n[0]],[e,n[1]],EN(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:LN([e-i/2,n[0]],[i,r],EN(t))}}};function EN(t){return"x"===t.dim?0:1}var zN=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="axisPointer",n.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,triggerEmphasis:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},n}(Ep),VN=zo(),BN=N;function FN(t,e,n){if(!i.node){var r=e.getZr();VN(r).records||(VN(r).records={}),function(t,e){if(VN(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);BN(VN(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}VN(t).initialized=!0,n("click",W(WN,"click")),n("mousemove",W(WN,"mousemove")),n("globalout",GN)}(r,e),(VN(r).records[t]||(VN(r).records[t]={})).handler=n}}function GN(t,e,n){t.handler("leave",null,n)}function WN(t,e,n,i){e.handler(t,n,i)}function HN(t,e){if(!i.node){var n=e.getZr();(VN(n).records||{})[t]&&(VN(n).records[t]=null)}}var YN=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";FN("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},n.prototype.remove=function(t,e){HN("axisPointer",e)},n.prototype.dispose=function(t,e){HN("axisPointer",e)},n.type="axisPointer",n}(Dg);function XN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=Eo(o,t);if(null==a||a<0||H(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(E(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var UN=zo();function ZN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||G(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){JN(r)&&(r=XN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=JN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||JN(r),p={},d={},f={list:[],map:{}},g={showPointer:W(qN,d),showTooltip:W(KN,f)};N(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);N(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&jN(t,a,g,!1,p)}}))}));var y={};return N(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&N(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,$N(e),$N(t)))),y[t.key]=o}}))})),N(y,(function(t,e){jN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];N(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(JN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=UN(i)[r]||{},a=UN(i)[r]={};N(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&t.triggerEmphasis&&N(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];N(o,(function(t,e){!a[e]&&l.push(t)})),N(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function jN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return N(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),N(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&D(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function qN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function KN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=zI(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function $N(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function JN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function QN(t){BI.registerAxisPointerClass("CartesianAxisPointer",ON),t.registerComponentModel(zN),t.registerComponentView(YN),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!H(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=PI(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},ZN)}var tE=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=IN(i),c=eE[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];we(p,p,s),be(p,p,[i.cx,i.cy]),l=Bh([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=TI.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));TN(t,n,i,r,p)},n}(xN);var eE={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:kN(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:PN(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:PN(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},nE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},n.type="polar",n.dependencies=["radiusAxis","angleAxis"],n.defaultOption={z:0,center:["50%","50%"],radius:"80%"},n}(Ep),iE=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Go).models[0]},n.type="polarAxis",n}(Ep);O(iE,z_);var rE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="angleAxis",n}(iE),oE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="radiusAxis",n}(iE),aE=function(t){function n(e,n){return t.call(this,"radius",e,n)||this}return e(n,t),n.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},n}(gb);aE.prototype.dataToRadius=gb.prototype.dataToCoord,aE.prototype.radiusToData=gb.prototype.coordToData;var sE=zo(),lE=function(t){function n(e,n){return t.call(this,"angle",e,n||[0,360])||this}return e(n,t),n.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},n.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=wr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=sE(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},n}(gb);lE.prototype.dataToAngle=gb.prototype.dataToCoord,lE.prototype.angleToData=gb.prototype.coordToData;var uE=["radius","angle"],hE=function(){function t(t){this.dimensions=uE,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new aE,this._angleAxis=new lE,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return cE(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return cE(e)===this?this.pointToData(n):null},t}();function cE(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function pE(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();N(E_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),N(E_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),A_(i.scale,i.model),A_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function dE(t,e){var n;if(t.type=e.get("type"),t.scale=k_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var i=e.get("startAngle"),r=null!==(n=e.get("endAngle"))&&void 0!==n?n:i+(t.inverse?-360:360);t.setExtent(i,r)}e.axis=t,t.model=e}var fE={dimensions:uE,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new hE(i+"");r.update=pE;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");dE(o,s),dE(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Kr(i[0],r),t.cy=Kr(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:H(l)||(l=[0,l]);var u=[Kr(l[0],s),Kr(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Go).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},gE=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function yE(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function vE(t){return t.getRadiusAxis().inverse?0:1}function mE(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var xE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.axisPointerClass="PolarAxisPointer",e}return e(n,t),n.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=E(n.getViewLabels(),(function(t){t=I(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));mE(s),mE(o),N(gE,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||_E[e](this.group,t,i,o,a,r,s)}),this)}},n.type="angleAxis",n}(BI),_E={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=n.getAngleAxis(),u=Math.PI/180,h=l.getExtent(),c=vE(n),p=c?0:1,d=360===Math.abs(h[1]-h[0])?"Circle":"Arc";(a=0===o[p]?new Jh[d]({shape:{cx:n.cx,cy:n.cy,r:o[c],startAngle:-h[0]*u,endAngle:-h[1]*u,clockwise:l.inverse},style:s.getLineStyle(),z2:1,silent:!0}):new Gu({shape:{cx:n.cx,cy:n.cy,r:o[c],r0:o[p]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[vE(n)],u=E(i,(function(t){return new qu({shape:yE(n,[l,l+s],t.coord)})}));t.add(Rh(u,{style:A(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[vE(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];j(m)&&m.textStyle&&(a=new Tc(m.textStyle,l,l.ecModel))}var x=new Ys({silent:TI.isLabelSilent(e),style:rc(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=TI.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,il(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",C=b;m&&(i[s][I]||(i[s][I]={p:b,n:b}),C=i[s][I][T]);var D=void 0,A=void 0,k=void 0,L=void 0;if("radius"===c.dim){var P=c.dataToCoord(M)-b,O=o.dataToCoord(I);Math.abs(P)=L})}}}))}var DE={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},AE={splitNumber:5},kE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="polar",n}(Dg);function LE(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),nt(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var PE=["axisLine","axisTickLabel","axisName"],OE=["splitArea","splitLine"],RE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.axisPointerClass="SingleAxisPointer",e}return e(n,t),n.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Vr;var s=LE(e),l=new TI(e,s);N(PE,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),N(OE,(function(t){e.get([t,"show"])&&NE[t](this,this.group,this._axisGroup,e)}),this),Wh(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},n.prototype.remove=function(){WI(this)},n.type="singleAxis",n}(BI),NE={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=a.get("width"),u=i.coordinateSystem.getRect(),h=r.isHorizontal(),c=[],p=0,d=r.getTicksCoords({tickModel:o}),f=[],g=[],y=0;y=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return FE(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return FE(e)===this?this.pointToData(n):null},t}();function FE(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var GE={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new BE(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Go).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:VE},WE=["x","y"],HE=["width","height"],YE=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=ZE(a,1-UE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=IN(i),c=XE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}AN(e,t,LE(n),n,i,r)},n.prototype.getHandleTransform=function(t,e,n){var i=LE(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=DN(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},n.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=UE(r),s=ZE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=ZE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},n}(xN),XE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:kN([e,n[0]],[e,n[1]],UE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:LN([e-i/2,n[0]],[i,r],UE(t))}}};function UE(t){return t.isHorizontal()?0:1}function ZE(t,e){var n=t.getRect();return[n[WE[e]],n[WE[e]]+n[HE[e]]]}var jE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="single",n}(Dg);var qE=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(e,n,i){var r=Op(e);t.prototype.init.apply(this,arguments),KE(e,r)},n.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),KE(this.option,e)},n.prototype.getCellSize=function(){return this.option.cellSize},n.type="calendar",n.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},n}(Ep);function KE(t,e){var n,i=t.cellSize;1===(n=H(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=E([0,1],(function(t){return function(t,e){return null!=t[Tp[e][0]]||null!=t[Tp[e][1]]&&null!=t[Tp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));Pp(t,e,{type:"box",ignoreSize:r})}var $E=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},n.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Gs({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},n.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},n.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},n.prototype._drawSplitline=function(t,e,n){var i=new Uu({z2:20,shape:{points:t},style:e});n.add(i)},n.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},n.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,N(e,(function(t,e){n=n.replace("{"+e+"}",i?ie(t):t)})),n):Y(t)?t(e):e.nameMap;var n,i},n.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},n.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new Ys({z2:30,style:rc(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},n.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},n.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=zc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/JE)-Math.floor(n[0].time/JE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function tz(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function ez(t,e){var n;return N(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var nz=["transition","enterFrom","leaveTo"],iz=nz.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function rz(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?nz:iz,r=0;r=0;l--){var p,d,f;if(f=null!=(d=Oo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=sz(g),{}),v=kp(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!sz(f).isNew&&v){for(var m=p.transition,x={},_=0;_=0)?x[b]=w:f[b]=w}yh(f,x,t,0)}else f.attr(y)}}},n.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){cz(n,sz(n).option,e,t._lastGraphicModel)})),this._elMap=gt()},n.prototype.dispose=function(){this._clear()},n.type="graphic",n}(Dg);function uz(t){var e=xt(az,t)?az[t]:kh(t);var n=new e({});return sz(n).type=t,n}function hz(t,e,n,i){var r=uz(n);return e.add(r),i.set(t,r),sz(r).id=t,sz(r).isNew=!0,r}function cz(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){cz(t,e,n,i)})),DR(t,e,i),n.removeKey(sz(t).id))}function pz(t,e,n,i){t.isGroup||N([["cursor",Ca.prototype.cursor],["zlevel",i||0],["z",n||0],["z2",0]],(function(n){var i=n[0];xt(e,i)?t[i]=it(e[i],n[1]):null==t[i]&&(t[i]=n[1])})),N(F(e),(function(n){if(0===n.indexOf("on")){var i=e[n];t[n]=Y(i)?i:null}})),xt(e,"draggable")&&(t.draggable=e.draggable),null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var dz=["x","y","radius","angle","single"],fz=["cartesian2d","polar","singleAxis"];function gz(t){return t+"Axis"}function yz(t,e){var n,i=gt(),r=[],o=gt();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function vz(t){var e=t.ecModel,n={infoList:[],infoMap:gt()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(gz(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var mz=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),xz=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e._autoThrottle=!0,e._noTarget=!0,e._rangePropMode=["percent","percent"],e}return e(n,t),n.prototype.init=function(t,e,n){var i=_z(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},n.prototype.mergeOption=function(t){var e=_z(t);T(this.option,t,!0),T(this.settledOption,e,!0),this._doInit(e)},n.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;N([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},n.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=gt();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},n.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return N(dz,(function(n){var i=this.getReferringComponents(gz(n),Wo);if(i.specified){e=!0;var r=new mz;N(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},n.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new mz;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Go).models[0];a&&N(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Go).models[0]&&o.add(t.componentIndex)}))}}}i&&N(dz,(function(e){if(i){var r=n.findComponents({mainType:gz(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new mz;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},n.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},n.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},n.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");N([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},n.prototype.noTarget=function(){return this._noTarget},n.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(gz(e),n))}),this),t},n.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){N(n.indexList,(function(n){t.call(e,i,n)}))}))},n.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},n.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(gz(t),e)},n.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;N([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},n.prototype.setCalculatedRange=function(t){var e=this.option;N(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},n.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},n.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},n.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=gz(this._dimName),i=e.getReferringComponents(n,Go).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return I(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];Mz(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(qr(h,o,n))):(e=!0,h=qr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=null==c||isNaN(c)?n[u]:c,a[u]=null==h||isNaN(h)?o[u]:h})),Iz(s),Iz(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";Kk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=qr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];Mz(n,(function(t){!function(t,e,n){e&&N(E_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=T_(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&Mz(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=E(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else Mz(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));Mz(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;Mz(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=qr(n[0]+o,n,[0,100],!0):null!=r&&(o=qr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=eo(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var Cz={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(gz(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new Tz(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=gt();return N(n,(function(t){N(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var Dz=!1;function Az(t){Dz||(Dz=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,Cz),function(t){t.registerAction("dataZoom",(function(t,e){N(yz(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function kz(t){t.registerComponentModel(bz),t.registerComponentView(Sz),Az(t)}var Lz=function(){},Pz={};function Oz(t,e){Pz[t]=e}function Rz(t){return Pz[t]}var Nz=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;N(this.option.feature,(function(t,n){var i=Rz(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),T(t,i.defaultOption))}))},n.type="toolbox",n.layoutMode={type:"box",ignoreSize:!0},n.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},n}(Ep);function Ez(t,e){var n=yp(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Gs({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var zz=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a="vertical"===t.get("orient"),s=t.get("feature")||{},l=this._features||(this._features={}),u=[];N(s,(function(t,e){u.push(e)})),new Km(this._featureNames||[],u).add(h).update(h).remove(W(h,null)).execute(),this._featureNames=u,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=Ap(i,o,r);Dp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),kp(t,i,o,r)}(r,t,n),r.add(Ez(r.getBoundingRect(),t)),a||r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.ensureState("emphasis");if(l&&!Y(l)&&e){var u=l.style||(l.style={}),h=wr(e,Ys.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+10;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function h(h,c){var p,d=u[h],f=u[c],g=s[d],y=new Tc(g,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===d&&(g.title=i.newTitle),d&&!f){if(function(t){return 0===t.indexOf("my")}(d))p={onclick:y.option.onclick,featureName:d};else{var v=Rz(d);if(!v)return;p=new v}l[d]=p}else if(!(p=l[f]))return;p.uid=Dc("toolbox-feature"),p.model=y,p.ecModel=e,p.api=n;var m=p instanceof Lz;d||!f?!y.get("show")||m&&p.unusable?m&&p.remove&&p.remove(e,n):(!function(i,s,l){var u,h,c=i.getModel("iconStyle"),p=i.getModel(["emphasis","iconStyle"]),d=s instanceof Lz&&s.getIcons?s.getIcons():i.get("icon"),f=i.get("title")||{};X(d)?(u={})[l]=d:u=d;X(f)?(h={})[l]=f:h=f;var g=i.iconPaths={};N(u,(function(l,u){var d=Xh(l,{},{x:-o/2,y:-o/2,width:o,height:o});d.setStyle(c.getItemStyle()),d.ensureState("emphasis").style=p.getItemStyle();var f=new Ys({style:{text:h[u],align:p.get("textAlign"),borderRadius:p.get("textBorderRadius"),padding:p.get("textPadding"),fill:null,font:hc({fontStyle:p.get("textFontStyle"),fontFamily:p.get("textFontFamily"),fontSize:p.get("textFontSize"),fontWeight:p.get("textFontWeight")},e)},ignore:!0});d.setTextContent(f),qh({el:d,componentModel:t,itemName:u,formatterParamsExtra:{title:h[u]}}),d.__title=h[u],d.on("mouseover",(function(){var e=p.getItemStyle(),i=a?null==t.get("right")&&"right"!==t.get("left")?"right":"left":null==t.get("bottom")&&"bottom"!==t.get("top")?"bottom":"top";f.setStyle({fill:p.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:p.get("textBackgroundColor")}),d.setTextConfig({position:p.get("textPosition")||i}),f.ignore=!t.get("showTitle"),n.enterEmphasis(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",u])&&n.leaveEmphasis(this),f.hide()})),("emphasis"===i.get(["iconStatus",u])?Pl:Ol)(d),r.add(d),d.on("click",G(s.onclick,s,e,n,u)),g[u]=d}))}(y,p,d),y.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?Pl:Ol)(i[t])},p instanceof Lz&&p.render&&p.render(y,e,n,i)):m&&p.dispose&&p.dispose(e,n)}},n.prototype.updateView=function(t,e,n,i){N(this._features,(function(t){t instanceof Lz&&t.updateView&&t.updateView(t.model,e,n,i)}))},n.prototype.remove=function(t,e){N(this._features,(function(n){n instanceof Lz&&n.remove&&n.remove(t,e)})),this.group.removeAll()},n.prototype.dispose=function(t,e){N(this._features,(function(n){n instanceof Lz&&n.dispose&&n.dispose(t,e)}))},n.type="toolbox",n}(Dg);var Vz=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.onclick=function(t,e){var n=this.model,r=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=i.browser;if("function"!=typeof MouseEvent||!l.newEdge&&(l.ie||l.edge))if(window.navigator.msSaveOrOpenBlob||o){var u=s.split(","),h=u[0].indexOf("base64")>-1,c=o?decodeURIComponent(u[1]):u[1];h&&(c=window.atob(c));var p=r+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var d=c.length,f=new Uint8Array(d);d--;)f[d]=c.charCodeAt(d);var g=new Blob([f]);window.navigator.msSaveOrOpenBlob(g,p)}else{var y=document.createElement("iframe");document.body.appendChild(y);var v=y.contentWindow,m=v.document;m.open("image/svg+xml","replace"),m.write(c),m.close(),v.focus(),m.execCommand("SaveAs",!0,p),document.body.removeChild(y)}}else{var x=n.get("lang"),_='',b=window.open();b.document.write(_),b.document.title=r}else{var w=document.createElement("a");w.download=r+"."+a,w.target="_blank",w.href=s;var S=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});w.dispatchEvent(S)}},n.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},n}(Lz),Bz="__ec_magicType_stack__",Fz=[["line","bar"],["stack"]],Gz=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return N(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},n.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},n.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(Wz[n]){var o,a={series:[]};N(Fz,(function(t){L(t,n)>=0&&N(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=Wz[n](e,r,t,i);o&&(A(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Go).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=T({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},n}(Lz),Wz={line:function(t,e,n,i){if("bar"===t)return T({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return T({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===Bz;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),T({id:e,stack:r?"":Bz},i.get(["option","stack"])||{},!0)}};Pm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var Hz=new Array(60).join("-"),Yz="\t";function Xz(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var Uz=new RegExp("[\t]+","g");function Zz(t,e){var n=t.split(new RegExp("\n*"+Hz+"\n*","g")),i={series:[]};return N(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(Yz)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=E(Xz(e.shift()).split(Uz),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=sV[t.brushType](0,n,e);t.__rangeOffset={offset:uV[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){N(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&N(i.coordSyses,(function(i){var r=sV[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){N(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=sV[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?uV[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=cV(n),o=cV(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return E(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:JL(i),isTargetByCursor:tP(i,t,n.coordSysModel),getLinearBrushOtherExtent:QL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&L(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=iV(e,t),r=0;rt[1]&&t.reverse(),t}function iV(t,e){return Bo(t,e,{includeMainTypes:tV})}var rV={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=gt(),a={},s={};(n||i||r)&&(N(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),N(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),N(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];N(r.getCartesians(),(function(t,e){(L(n,t.getAxis("x").model)>=0||L(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:aV.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){N(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:aV.geo})}))}},oV=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],aV={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Vh(t)),e}},sV={lineX:W(lV,0),lineY:W(lV,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[nV([r[0],o[0]]),nV([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:E(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function lV(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=nV(E([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var uV={lineX:W(hV,0),lineY:W(hV,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return E(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function hV(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function cV(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var pV,dV,fV=N,gV=Mo+"toolbox-dataZoom_",yV=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new bL(n.getZr()),this._brushController.on("brush",G(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new eV(mV(t),e,{include:["grid"]}),s=a.makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(s).enableBrush(!(!o||!s.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return Jz(t).length}(e)>1?"emphasis":"normal")}(t,e)},n.prototype.onclick=function(t,e,n){vV[n].call(this)},n.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},n.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},n.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new eV(mV(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=Jz(t);Kz(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=Kk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},n.prototype._dispatchZoomAction=function(t){var e=[];fV(t,(function(t,n){e.push(I(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},n.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},n}(Lz),vV={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=Jz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return Kz(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function mV(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}pV="dataZoom",dV=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Bo(t,mV(i));return fV(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),fV(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:gV+e+o};a[n]=o,r.push(a)}},st(null==rd.get(pV)&&dV),rd.set(pV,dV);var xV=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="tooltip",n.dependencies=["axisPointer"],n.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},n}(Ep);function _V(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function bV(t){if(i.domSupported)for(var e=document.documentElement.style,n=0,r=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
'}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",H(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},n.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api,i=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==i&&"click"!==i){var r=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&r.manuallyShowTip(t,e,n,{x:r._lastX,y:r._lastY,dataByCoordSys:r._lastDataByCoordSys})}))}},n.prototype.manuallyShowTip=function(t,e,n,r){if(r.from!==this.uid&&!i.node&&n.getDom()){var o=VV(r,n);this._ticket="";var a=r.dataByCoordSys,s=function(t,e,n){var i=Fo(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o=Ho(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}),a=o.models[0];if(!a)return;var s,l=n.getViewOfComponentModel(a);if(l.group.traverse((function(e){var n=il(e).tooltipConfig;if(n&&n.name===t.name)return s=e,!0})),s)return{componentMainType:r,componentIndex:a.componentIndex,el:s}}(r,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:r.position,positionDefault:"bottom"},o)}else if(r.tooltip&&null!=r.x&&null!=r.y){var u=NV;u.x=r.x,u.y=r.y,u.update(),il(u).tooltipConfig={name:null,option:r.tooltip},this._tryShow({offsetX:r.x,offsetY:r.y,target:u},o)}else if(a)this._tryShow({offsetX:r.x,offsetY:r.y,position:r.position,dataByCoordSys:a,tooltipOption:r.tooltipOption},o);else if(null!=r.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,r))return;var h=XN(r,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:r.position,positionDefault:"bottom"},o)}else null!=r.x&&null!=r.y&&(n.dispatchAction({type:"updateAxisPointer",x:r.x,y:r.y}),this._tryShow({offsetX:r.x,offsetY:r.y,position:r.position,target:n.getZr().findHover(r.x,r.y).target},o))}},n.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(VV(i,n))},n.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===zV([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},n.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;if("legend"===il(n).ssrType)return;this._lastDataByCoordSys=null,Py(n,(function(t){return null!=il(t).dataIndex?(r=t,!0):null!=il(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},n.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=G(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},n.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=zV([e.tooltipOption],i),a=this._renderMode,s=[],l=rg("section",{blocks:[],noHeader:!0}),u=[],h=new gg;N(t,(function(t){N(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=CN(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=rg("section",{header:o,noHeader:!lt(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),N(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=P_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",wp(f.color),a);var g=_f(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=zV([p],i).get("valueFormatter");c.blocks.push(v?D({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=hg(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},n.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=il(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=zV([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new gg;g.marker=y.makeTooltipMarker("item",wp(g.color),c);var v=_f(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?hg(x?D({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},n.prototype._showComponentItemTooltip=function(t,e,n){var i="html"===this._renderMode,r=il(e),o=r.tooltipConfig.option||{},a=o.encodeHTMLContent;if(X(o)){o={content:o,formatter:o},a=!0}a&&i&&o.content&&((o=I(o)).content=ie(o.content));var s=[o],l=this._ecModel.getComponent(r.componentMainType,r.componentIndex);l&&s.push(l),s.push({formatter:o.content});var u=t.positionDefault,h=zV(s,this._tooltipModel,u?{position:u}:null),c=h.get("content"),p=Math.random()+"",d=new gg;this._showOrMove(h,(function(){var n=I(h.get("formatterParams")||{});this._showTooltipContent(h,c,n,p,t.offsetX,t.offsetY,t.position,e,d)})),n({type:"showTip",from:this.uid})},n.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent;u.setEnterable(t.get("enterable"));var h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=H(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=$c(f.axisValue,c,d)),c=_p(c,n,!0)}else if(Y(h)){var g=G((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},n.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||H(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:H(e)?void 0:{color:i||e.color||e.borderColor}},n.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),Y(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),H(e))n=Kr(e[0],s),i=Kr(e[1],l);else if(j(e)){var d=e;d.width=u[0],d.height=u[1];var f=Ap(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=BV(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=BV(c)?u[1]/2:"bottom"===c?u[1]:0),_V(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},n.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&N(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&N(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&N(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&N(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},n.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},n.prototype.dispose=function(t,e){!i.node&&e.getDom()&&(Hg(this,"_updatePosition"),this._tooltipContent.dispose(),HN("itemTooltip",e))},n.type="tooltip",n}(Dg);function zV(t,e,n){var i,r=e.ecModel;n?(i=new Tc(n,r,r),i=new Tc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof Tc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new Tc(a,i,r)))}return i}function VV(t,e){return t.dispatchAction||G(e.dispatchAction,e)}function BV(t){return"center"===t||"middle"===t}var FV=["rect","polygon","keep","clear"];function GV(t,e){var n=Io(t?t.brush:[]);if(n.length){var i=[];N(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;H(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};N(t,(function(t){e[t]=1})),t.length=0,N(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,FV)}}var WV=N;function HV(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function YV(t,e,n){var i={};return WV(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);WV(t[e],(function(t,i){if(HD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new HD(r),"opacity"===i&&((r=I(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new HD(r))}}))})),i}function XV(t,e,n){var i;N(n,(function(t){e.hasOwnProperty(t)&&HV(e[t])&&(i=!0)})),i&&N(n,(function(n){e.hasOwnProperty(n)&&HV(e[n])?t[n]=I(e[n]):delete t[n]}))}var UV={lineX:ZV(0),lineY:ZV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&G_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(G_(i,r,o)||G_(i,r+a,o)||G_(i,r,o+s)||G_(i,r+a,o+s)||Ee.create(t).contain(l[0],l[1])||Uh(r,o,r+a,o,i)||Uh(r,o,r,o+s,i)||Uh(r+a,o,r+a,o+s,i)||Uh(r,o+s,r+a,o+s,i))||void 0}}};function ZV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return jV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&iB(e)}};function iB(t){return new Ee(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var rB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new bL(e.getZr())).on("brush",G(this._onBrush,this)).mount()},n.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},n.prototype.updateTransform=function(t,e,n,i){JV(e),this._updateController(t,e,n,i)},n.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},n.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},n.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},n.prototype.dispose=function(){this._brushController.dispose()},n.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:I(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:I(n),$from:e})},n.type="brush",n}(Dg),oB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.areas=[],e.brushOption={},e}return e(n,t),n.prototype.optionUpdated=function(t,e){var n=this.option;!e&&XV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},n.prototype.setAreas=function(t){t&&(this.areas=E(t,(function(t){return aB(this.option,t)}),this))},n.prototype.setBrushOption=function(t){this.brushOption=aB(this.option,t),this.brushType=this.brushOption.brushType},n.type="brush",n.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],n.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},n}(Ep);function aB(t,e){return T({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new Tc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var sB=["rect","polygon","lineX","lineY","keep","clear"],lB=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,N(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},n.prototype.updateView=function(t,e,n){this.render(t,e,n)},n.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return N(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},n.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},n.getDefaultOption=function(t){return{show:!0,type:sB.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},n}(Lz);var uB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.layoutMode={type:"box",ignoreSize:!0},e}return e(n,t),n.type="title",n.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},n}(Ep),hB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=it(t.get("textBaseline"),t.get("textVerticalAlign")),l=new Ys({style:rc(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new Ys({style:rc(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){Sp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){Sp(d,"_"+t.get("subtarget"))})),il(l).eventData=il(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=Ap(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Gs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},n.type="title",n}(Dg);var cB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.layoutMode="box",e}return e(n,t),n.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},n.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},n.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},n.prototype.getCurrentIndex=function(){return this.option.currentIndex},n.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},n.prototype.setPlayState=function(t){this.option.autoPlay=!!t},n.prototype.getPlayState=function(){return!!this.option.autoPlay},n.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],N(n,(function(e,n){var i,o=Oo(Do(e),"");j(e)?(i=I(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new _x([{name:"value",type:o}],this)).initData(t,r)},n.prototype.getData=function(){return this._data},n.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},n.type="timeline",n.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},n}(Ep),pB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="timeline.slider",n.defaultOption=Ac(cB.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),n}(cB);O(pB,xf.prototype);var dB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="timeline",n}(Dg),fB=function(t){function n(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return e(n,t),n.prototype.getLabelModel=function(){return this.model.getModel("label")},n.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},n}(gb),gB=Math.PI,yB=zo(),vB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(t,e){this.api=e},n.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return rg("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},N(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},n.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},n.prototype.dispose=function(){this._clearTimer()},n.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return Ap(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:gB/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*gB/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},n.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;be(o,o,[-a,-s]),we(o,o,-gB/2),be(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},n.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"),e)switch(e){case"category":return new Hx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new o_({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new Xx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new fB("value",r,t.axisExtent,i);return a.model=e,a},n.prototype._createGroup=function(t){var e=this[t]=new Vr;return this.group.add(e),e},n.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new qu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:D({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new qu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:A({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},n.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],N(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:G(r._changeTimeline,r,t.value)},p=mB(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Xl(p);var d=il(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},n.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],N(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new Ys({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:G(r._changeTimeline,r,a),silent:!1,style:rc(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=rc(u),p.ensureState("progress").style=rc(h),e.add(p),Xl(p),yB(p).dataIndex=a,r._tickLabels.push(p)}))}},n.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=Tr(it(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Xh(t.get(["controlStyle",e]),i||{},new Ee(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Xl(c)}}h(t.nextBtnPosition,"next",G(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",G(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",G(this._handlePlayClick,this,!l),!0)},n.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=G(s._handlePointerDrag,s),t.ondragend=G(s._handlePointerDragend,s),xB(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){xB(t,s._progressLine,o,n,i)}};this._currentPointer=mB(a,a,this._mainGroup,{},this._currentPointer,l)},n.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},n.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},n.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},n.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Jr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var kB={min:W(AB,"min"),max:W(AB,"max"),average:W(AB,"average"),median:W(AB,"median")};function LB(t,e){if(e){var n=t.getData(),i=t.coordinateSystem,r=i&&i.dimensions;if(!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!H(e.coord)&&H(r)){var o=PB(e,n,i,t);if((e=I(e)).type&&kB[e.type]&&o.baseAxis&&o.valueAxis){var a=L(r,o.baseAxis.dim),s=L(r,o.valueAxis.dim),l=kB[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else e.coord=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis]}if(null!=e.coord&&H(r))for(var u=e.coord,h=0;h<2;h++)kB[u[h]]&&(u[h]=NB(n,n.mapDimension(r[h]),u[h]));else e.coord=[];return e}}function PB(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function OB(t,e){return!(t&&t.containData&&e.coord&&!DB(e))||t.containData(e.coord)}function RB(t,e){return t?function(t,n,i,r){return Mf(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return Mf(t.value,e[r])}}function NB(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var EB=zo(),zB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.init=function(){this.markerGroupMap=gt()},n.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){EB(t).keep=!1})),e.eachSeries((function(t){var r=TB.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!EB(t).keep&&i.group.remove(t.group)}))},n.prototype.markKeep=function(t){EB(t).keep=!0},n.prototype.toggleBlurSeries=function(t,e){var n=this;N(t,(function(t){var i=TB.getMarkerModelFromSeries(t,n.type);i&&i.getData().eachItemGraphicEl((function(t){t&&(e?Rl(t):Nl(t))}))}))},n.type="marker",n}(Dg);function VB(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Kr(a.get("x"),n.getWidth()),l=Kr(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var BB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=TB.getMarkerModelFromSeries(t,"markPoint");e&&(VB(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},n.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new PS),u=function(t,e,n){var i;i=t?E(t&&t.dimensions,(function(t){return D(D({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new _x(i,n),o=E(n.get("data"),W(LB,e));t&&(o=V(o,W(OB,t)));var a=RB(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),VB(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(Y(i)||Y(r)||Y(o)||Y(s)){var h=e.getRawValue(t),c=e.getDataParams(t);Y(i)&&(i=i(h,c)),Y(r)&&(r=r(h,c)),Y(o)&&(o=o(h,c)),Y(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=Dy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){il(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},n.type="markPoint",n}(zB);var FB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.createMarkerModelFromSeries=function(t,e,i){return new n(t,e,i)},n.type="markLine",n.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},n}(TB),GB=zo(),WB=function(t,e,n,i){var r,o=t.getData();if(H(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=nt(i.yAxis,i.xAxis);else{var u=PB(i,o,e,t);s=u.valueAxis,l=NB(o,Ax(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=I(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&Z(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[LB(t,r[0]),LB(t,r[1]),D({},r[2])];return g[2].type=g[2].type||null,T(g[2],g[0]),T(g[2],g[1]),g};function HB(t){return!isNaN(t)&&!isFinite(t)}function YB(t,e,n,i){var r=1-t,o=i.dimensions[t];return HB(e[r])&&HB(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function XB(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(YB(1,n,i,t)||YB(0,n,i,t)))return!0}return OB(t,e[0])&&OB(t,e[1])}function UB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Kr(s.get("x"),r.getWidth()),u=Kr(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(US(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;HB(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):HB(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var ZB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=TB.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=GB(e).from,o=GB(e).to;r.each((function(e){UB(r,e,!0,t,n),UB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},n.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new ik);this.group.add(l.group);var u=function(t,e,n){var i;i=t?E(t&&t.dimensions,(function(t){return D(D({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new _x(i,n),o=new _x(i,n),a=new _x([],n),s=E(n.get("data"),W(WB,e,t,n));t&&(s=V(s,W(XB,t)));var l=RB(!!t,i);return r.initData(E(s,(function(t){return t[0]})),null,l),o.initData(E(s,(function(t){return t[1]})),null,l),a.initData(E(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;GB(e).from=h,GB(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);UB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=Dy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:it(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:it(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:it(o.get("symbolSize"),f[r?0:1]),symbol:it(o.get("symbol",!0),d[r?0:1]),style:s})}H(d)||(d=[d,d]),H(f)||(f=[f,f]),H(g)||(g=[g,g]),H(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t){il(t).dataModel=e,t.traverse((function(t){il(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},n.type="markLine",n}(zB);var jB=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.createMarkerModelFromSeries=function(t,e,i){return new n(t,e,i)},n.type="markArea",n.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},n}(TB),qB=zo(),KB=function(t,e,n,i){var r=i[0],o=i[1];if(r&&o){var a=LB(t,r),s=LB(t,o),l=a.coord,u=s.coord;l[0]=nt(l[0],-1/0),l[1]=nt(l[1],-1/0),u[0]=nt(u[0],1/0),u[1]=nt(u[1],1/0);var h=C([{},a,s]);return h.coord=[a.coord,s.coord],h.x0=a.x,h.y0=a.y,h.x1=s.x,h.y1=s.y,h}};function $B(t){return!isNaN(t)&&!isFinite(t)}function JB(t,e,n,i){var r=1-t;return $B(e[r])&&$B(n[r])}function QB(t,e){var n=e.coord[0],i=e.coord[1],r={coord:n,x:e.x0,y:e.y0},o={coord:i,x:e.x1,y:e.y1};return US(t,"cartesian2d")?!(!n||!i||!JB(1,n,i)&&!JB(0,n,i))||function(t,e,n){return!(t&&t.containZone&&e.coord&&n.coord&&!DB(e)&&!DB(n))||t.containZone(e.coord,n.coord)}(t,r,o):OB(t,r)||OB(t,o)}function tF(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Kr(s.get(n[0]),r.getWidth()),u=Kr(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition){var h=t.getValues(["x0","y0"],e),c=t.getValues(["x1","y1"],e),p=a.clampData(h),d=a.clampData(c),f=[];"x0"===n[0]?f[0]=p[0]>d[0]?c[0]:h[0]:f[0]=p[0]>d[0]?h[0]:c[0],"y0"===n[1]?f[1]=p[1]>d[1]?c[1]:h[1]:f[1]=p[1]>d[1]?h[1]:c[1],o=i.getMarkerPosition(f,n,!0)}else{var g=[m=t.get(n[0],e),x=t.get(n[1],e)];a.clampData&&a.clampData(g,g),o=a.dataToPoint(g,!0)}if(US(a,"cartesian2d")){var y=a.getAxis("x"),v=a.getAxis("y"),m=t.get(n[0],e),x=t.get(n[1],e);$B(m)?o[0]=y.toGlobalCoord(y.getExtent()["x0"===n[0]?0:1]):$B(x)&&(o[1]=v.toGlobalCoord(v.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var eF=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],nF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=TB.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=E(eF,(function(r){return tF(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},n.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Vr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=E(t&&t.dimensions,(function(t){var n=e.getData();return D(D({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=E(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new _x(r,n)}else i=new _x(r=[{name:"value",type:"float"}],n);var s=E(n.get("data"),W(KB,e,t,n));t&&(s=V(s,W(QB,t)));var l=t?function(t,e,n,i){return Mf(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return Mf(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=E(eF,(function(n){return tF(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Jr(c),Jr(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},n.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},n.type="legend.plain",n.dependencies=["series"],n.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},n}(Ep),rF=W,oF=N,aF=Vr,sF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.newlineDisabled=!1,e}return e(n,t),n.prototype.init=function(){this.group.add(this._contentGroup=new aF),this.group.add(this._selectorGroup=new aF),this._isFirstRender=!0},n.prototype.getContentGroup=function(){return this._contentGroup},n.prototype.getSelectorGroup=function(){return this._selectorGroup},n.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=Ap(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=Ap(A({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=Ez(p,t))}},n.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},n.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=gt(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),oF(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new aF;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style"),v=this._createItem(p,a,o,r,e,t,f,y,g,u,i);v.on("click",rF(lF,a,null,i,h)).on("mouseover",rF(hF,p.name,null,i,h)).on("mouseout",rF(cF,p.name,null,i,h)),n.ssr&&v.eachChild((function(t){var e=il(t);e.seriesIndex=p.seriesIndex,e.dataIndex=o,e.ssrType="legend"})),l.set(a,!0)}else n.eachRawSeries((function(s){if(!l.get(a)&&s.legendVisualProvider){var c=s.legendVisualProvider;if(!c.containName(a))return;var p=c.indexOfName(a),d=c.getItemVisual(p,"style"),f=c.getItemVisual(p,"legendIcon"),g=jn(d.fill);g&&0===g[3]&&(g[3]=.2,d=D(D({},d),{fill:ii(g,"rgba")}));var y=this._createItem(s,a,o,r,e,t,{},d,f,u,i);y.on("click",rF(lF,null,a,i,h)).on("mouseover",rF(hF,null,a,i,h)).on("mouseout",rF(cF,null,a,i,h)),n.ssr&&y.eachChild((function(t){var e=il(t);e.seriesIndex=s.seriesIndex,e.dataIndex=o,e.ssrType="legend"})),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},n.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();oF(t,(function(t){var i=t.type,r=new Ys({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),nc(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Xl(r)}))},n.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=t.visualDrawType,p=r.get("itemWidth"),d=r.get("itemHeight"),f=r.isSelected(e),g=i.get("symbolRotate"),y=i.get("symbolKeepAspect"),v=i.get("icon"),m=function(t,e,n,i,r,o,a){function s(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),oF(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var l=e.getModel("itemStyle"),u=l.getItemStyle(),h=0===t.lastIndexOf("empty",0)?"fill":"stroke",c=l.getShallow("decal");u.decal=c&&"inherit"!==c?vv(c,a):i.decal,"inherit"===u.fill&&(u.fill=i[r]);"inherit"===u.stroke&&(u.stroke=i[h]);"inherit"===u.opacity&&(u.opacity=("fill"===r?i:n).opacity);s(u,i);var p=e.getModel("lineStyle"),d=p.getLineStyle();if(s(d,n),"auto"===u.fill&&(u.fill=i.fill),"auto"===u.stroke&&(u.stroke=i.fill),"auto"===d.stroke&&(d.stroke=i.fill),!o){var f=e.get("inactiveBorderWidth"),g=u[h];u.lineWidth="auto"===f?i.lineWidth>0&&g?2:0:u.lineWidth,u.fill=e.get("inactiveColor"),u.stroke=e.get("inactiveBorderColor"),d.stroke=p.get("inactiveColor"),d.lineWidth=p.get("inactiveWidth")}return{itemStyle:u,lineStyle:d}}(l=v||l||"roundRect",i,a,s,c,f,h),x=new aF,_=i.getModel("textStyle");if(!Y(t.getLegendIcon)||v&&"inherit"!==v){var b="inherit"===v&&t.getData().getVisual("symbol")?"inherit"===g?t.getData().getVisual("symbolRotate"):g:0;x.add(function(t){var e=t.icon||"roundRect",n=Yy(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:p,itemHeight:d,icon:l,iconRotate:b,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}))}else x.add(t.getLegendIcon({itemWidth:p,itemHeight:d,icon:l,iconRotate:g,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}));var w="left"===o?p+5:-5,S=o,M=r.get("formatter"),I=e;X(M)&&M?I=M.replace("{name}",null!=e?e:""):Y(M)&&(I=M(e));var T=f?_.getTextColor():i.get("inactiveColor");x.add(new Ys({style:rc(_,{text:I,x:w,y:d/2,fill:T,align:S,verticalAlign:"middle"},{inheritColor:T})}));var C=new Gs({shape:x.getBoundingRect(),style:{fill:"transparent"}}),D=i.getModel("tooltip");return D.get("show")&&qh({el:C,componentModel:r,itemName:e,itemTooltipOption:D.option}),x.add(C),x.eachChild((function(t){t.silent=!0})),C.silent=!u,this.getContentGroup().add(x),Xl(x),x.__legendDataIndex=n,x},n.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();Dp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){Dp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},n.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},n.type="legend.plain",n}(Dg);function lF(t,e,n,i){cF(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),hF(t,e,n,i)}function uF(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=it(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Gs({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&yh(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},n.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},n.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;N(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},n.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=mF[r],a=xF[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i=e&&t.s<=e+i}},n.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},n.type="legend.scroll",n}(sF);function bF(t){Zm(fF),t.registerComponentModel(gF),t.registerComponentView(_F),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var wF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="dataZoom.inside",n.defaultOption=Ac(xz.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),n}(xz),SF=zo();function MF(t,e,n){SF(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function IF(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function TF(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function CF(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function DF(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=SF(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=gt());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){N(vz(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:W(CF,e),dispatchAction:W(TF,t),dataZoomInfoMap:null,controller:null},i=n.controller=new gT(t.getZr());return N(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=gt())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Wg(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else IF(i,t)}))}))}var AF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return e(n,t),n.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),MF(i,e,{pan:G(kF.pan,this),zoom:G(kF.zoom,this),scrollMove:G(kF.scrollMove,this)}))},n.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},n.prototype._clear=function(){!function(t,e){for(var n=SF(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return Kk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:LF((function(t,e,n,i,r,o){var a=PF[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:LF((function(t,e,n,i,r,o){return PF[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function LF(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return Kk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var PF={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function OF(t){Az(t),t.registerComponentModel(wF),t.registerComponentView(AF),DF(t)}var RF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.type="dataZoom.slider",n.layoutMode="box",n.defaultOption=Ac(xz.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),n}(xz),NF=Gs,EF="horizontal",zF="vertical",VF=["line","bar","candlestick","scatter"],BF={easing:"cubicOut",duration:100,delay:0},FF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e._displayables={},e}return e(n,t),n.prototype.init=function(t,e){this.api=e,this._onBrush=G(this._onBrush,this),this._onBrushEnd=G(this._onBrushEnd,this)},n.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Wg(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},n.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},n.prototype._clear=function(){Hg(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},n.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Vr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},n.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===EF?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Op(t.option);N(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=Ap(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===zF&&this._size.reverse()},n.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==EF||r?n===EF&&r?{scaleY:a?1:-1,scaleX:-1}:n!==zF||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},n.prototype._getViewExtent=function(){return[0,this._size[0]]},n.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new NF({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new NF({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:G(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},n.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim&&i.getShadowDim(),a=o&&r.getDimensionInfo(o)?i.getShadowDim():t.otherDim;if(null!=a){var s=this._shadowPolygonPts,l=this._shadowPolylinePts;if(r!==this._shadowData||a!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var u=r.getDataExtent(a),h=.3*(u[1]-u[0]);u=[u[0]-h,u[1]+h];var c,p=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],g=[],y=d[1]/(r.count()-1),v=0,m=Math.round(r.count()/e[0]);r.each([a],(function(t,e){if(m>0&&e%m)v+=y;else{var n=null==t||isNaN(t)||""===t,i=n?0:qr(t,u,p,!0);n&&!c&&e?(f.push([f[f.length-1][0],0]),g.push([g[g.length-1][0],0])):!n&&c&&(f.push([v,0]),g.push([v,0])),f.push([v,i]),g.push([v,i]),v+=y,c=n}})),s=this._shadowPolygonPts=f,l=this._shadowPolylinePts=g}this._shadowData=r,this._shadowDim=a,this._shadowSize=[e[0],e[1]];for(var x=this.dataZoomModel,_=0;_<3;_++){var b=w(1===_);this._displayables.sliderGroup.add(b),this._displayables.dataShadowSegs.push(b)}}}function w(t){var e=x.getModel(t?"selectedDataBackground":"dataBackground"),n=new Vr,i=new Yu({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Uu({shape:{points:l},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},n.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){N(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&L(VF,t.get("type"))<0)){var a,s=i.getComponent(gz(r),o).axis,l=function(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}(r),u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},n.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new NF({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new NF({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),N([0,1],(function(e){var o=a.get("handleIcon");!Gy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=Yy(o,-1,0,2,2,null,!0);s.attr({cursor:GF(this._orient),draggable:!0,drift:G(this._onDragMove,this,e),ondragend:G(this._onDragEnd,this),onmouseover:G(this._showDataInfo,this,!0),onmouseout:G(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Kr(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Xl(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new Ys({silent:!0,invisible:!0,style:rc(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Kr(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Gs({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=Yy(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Gs({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:GF(this._orient),drift:G(this._onDragMove,this,"all"),ondragstart:G(this._showDataInfo,this,!0),ondragend:G(this._onDragEnd,this),onmouseover:G(this._showDataInfo,this,!0),onmouseout:G(this._showDataInfo,this,!1)})},n.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[qr(t[0],[0,100],e,!0),qr(t[1],[0,100],e,!0)]},n.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];Kk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?qr(o.minSpan,a,r,!0):null,null!=o.maxSpan?qr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Jr([qr(i[0],r,a,!0),qr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},n.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Jr(n.slice()),r=this._size;N([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},n.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ce(e,n),this._brushing=!0,this._brushStartTime=+new Date},n.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Jr([qr(n.x,i,r,!0),qr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},n.prototype._onBrush=function(t){this._brushing&&(pe(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},n.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new NF({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},n.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?BF:null,start:e[0],end:e[1]})},n.prototype._findCoordRect=function(){var t,e=vz(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},n.type="dataZoom.slider",n}(wz);function GF(t){return"vertical"===t?"ns-resize":"ew-resize"}function WF(t){t.registerComponentModel(RF),t.registerComponentView(FF),Az(t)}var HF=function(t,e,n){var i=I((YF[t]||{})[e]);return n&&H(i)?i[i.length-1]:i},YF={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},XF=HD.mapVisual,UF=HD.eachVisual,ZF=H,jF=N,qF=Jr,KF=qr,$F=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e.stateList=["inRange","outOfRange"],e.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],e.layoutMode={type:"box",ignoreSize:!0},e.dataBound=[-1/0,1/0],e.targetVisuals={},e.controllerVisuals={},e}return e(n,t),n.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},n.prototype.optionUpdated=function(t,e){var n=this.option;!e&&XV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},n.prototype.resetVisual=function(t){var e=this.stateList;t=G(t,this),this.controllerVisuals=YV(this.option.controller,e,t),this.targetVisuals=YV(this.option.target,e,t)},n.prototype.getItemSymbol=function(){return null},n.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=Io(t),e},n.prototype.eachTargetSeries=function(t,e){N(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},n.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},n.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],H(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):Y(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},n.prototype.resetExtent=function(){var t=this.option,e=qF([t.min,t.max]);this._dataExtent=e},n.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},n.prototype.getExtent=function(){return this._dataExtent.slice()},n.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});T(i,n),T(r,n);var o=this.isCategory();function a(n){ZF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},jF(i,(function(t,e){if(HD.isValidType(e)){var n=HF(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";jF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&I(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&I(n)||(o?s[0]:[s[0],s[0]])),l.symbol=XF(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;UF(u,(function(t){t>h&&(h=t)})),l.symbolSize=XF(u,(function(t){return KF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},n.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},n.prototype.isCategory=function(){return!!this.option.categories},n.prototype.setSelected=function(t){},n.prototype.getSelected=function(){return null},n.prototype.getValueState=function(t){return null},n.prototype.getVisualMeta=function(t){return null},n.type="visualMap",n.dependencies=["series"],n.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},n}(Ep),JF=[20,140],QF=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},n.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=JF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=JF[1])},n.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):H(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},n.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),N(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},n.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},n.prototype.getSelected=function(){var t=this.getExtent(),e=Jr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},n.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},n.prototype.getVisualMeta=function(t){var e=tG(this,"outOfRange",this.getExtent()),n=tG(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},n.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},n.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Vr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},n.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();aG([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=oG(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Bh(n.handleLabelPoints[l],Vh(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},n.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=oG(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Bh(l.indicatorLabelPoint,Vh(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||cG(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function yG(t,e,n,i){for(var r=e.targetVisuals[i],o=HD.prepareVisualTypes(r),a={color:Dy(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(dG,fG),N(gG,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(mG))}function wG(t){t.registerComponentModel(QF),t.registerComponentView(uG),bG(t)}var SG=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e._pieceList=[],e}return e(n,t),n.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],MG[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=I(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=E(this._pieceList,(function(t){return t=I(t),"inRange"!==e&&(t.visual=null),t})))}))},n.prototype.completeVisualOption=function(){var e=this.option,n={},i=HD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}N(e.pieces,(function(t){N(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),N(n,(function(t,n){var i=!1;N(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&N(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=HF(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},n.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,N(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;N(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},n.prototype.getItemSymbol=function(){return this.get("itemSymbol")},n.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},n.prototype.getPieceList=function(){return this._pieceList},n.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},n.prototype.setSelected=function(t){this.option.selected=I(t)},n.prototype.getValueState=function(t){var e=HD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},n.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){HD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},n.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},n.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return N(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},n.type="visualMap.piecewise",n.defaultOption=Ac($F.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),n}($F),MG={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function IG(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var TG=function(t){function n(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=n.type,e}return e(n,t),n.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=nt(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),N(l.viewPieceList,(function(i){var l=i.piece,u=new Vr;u.onclick=G(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new Ys({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),Dp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},n.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:rG(i.findTargetDataIndices(e),i)})}},n.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return iG(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},n.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Vr,a=this.visualMapModel.textStyleModel;o.add(new Ys({style:rc(a,{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e})})),t.add(o)}},n.prototype._getViewData=function(){var t=this.visualMapModel,e=E(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},n.prototype._createItemSymbol=function(t,e,n){t.add(Yy(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},n.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=n.selectedMode;if(i){var r=I(n.selected),o=e.getSelectedMapKey(t);"single"===i||!0===i?(r[o]=!0,N(r,(function(t,e){r[e]=e===o}))):r[o]=!r[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:r})}},n.type="visualMap.piecewise",n}(eG);function CG(t){t.registerComponentModel(SG),t.registerComponentView(TG),bG(t)}var DG={label:{enabled:!0},decal:{show:!1}},AG=zo(),kG={};function LG(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=I(DG);T(i.label,t.getLocaleModel().get("aria"),!1),T(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=gt();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),AG(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(Y(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=cd(e.ecModel,e.name,kG,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=AG(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=cd(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?D(D({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=e.getZr().dom;if(!i)return;var o=t.getLocaleModel().get("aria"),a=n.getModel("label");if(a.option=A(a.option,o),!a.get("enabled"))return;if(a.get("description"))return void i.setAttribute("aria-label",a.get("description"));var s,l=t.getSeriesCount(),u=a.get(["data","maxCount"])||10,h=a.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();s=p?r(a.get(["general","withTitle"]),{title:p}):a.get(["general","withoutTitle"]);var d=[];s+=r(l>1?a.get(["series","multiple","prefix"]):a.get(["series","single","prefix"]),{seriesCount:l}),t.eachSeries((function(e,n){if(n1?a.get(["series","multiple",o]):a.get(["series","single",o]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,_=t.getLocaleModel().get(["series","typeNames"]),_[x]||_.chart)});var s=e.getData();if(s.count()>u)i+=r(a.get(["data","partialData"]),{displayCnt:u});else i+=a.get(["data","allData"]);for(var h=a.get(["data","separator","middle"]),p=a.get(["data","separator","end"]),f=[],g=0;g":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},RG=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):tt(t)?t:null)){var e="";0,bo(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!Z(e)&&this._condVal.test(t+"")},t}(),NG=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),EG=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){qG(t,i)&&qG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function $G(t,e,n,i,r,o,a,s,l,u){if(qG(t,n)&&qG(e,i)&&qG(r,a)&&qG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x=0&&_-w*w=0)l.push(a,s);else{var S=[],M=[];bn(t,n,r,a,.5,S),bn(e,i,o,s,.5,M),$G(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),$G(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function JG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=JG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new Ce(d*l+t,d*u+e)}function nW(t,e,n){var i=new Ce;Ce.sub(i,n,e),i.normalize();var r=new Ce;return Ce.sub(r,t,e),r.dot(i)}function iW(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function rW(t){var e=t.points,n=[],i=[];Va(e,n,i);var r=new Ee(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ce,h=new Ce;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;or,a=JG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function bW(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=E(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return E(o,(function(o,a){return{cp:o,z:_W(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function wW(t){return sW(t.path,t.count)}function SW(t){return H(t[0])}function MW(t,e){for(var n=[],i=t.length,r=0;r=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var IW={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);SW(t)&&(s=t,l=e),SW(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?MW(l,s):MW(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var r=n.getIndices(),o=0;o0&&i.group.traverse((function(t){t instanceof As&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function EW(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function zW(t){return H(t)?t.sort().join(","):t}function VW(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function BW(t,e){for(var n=0;n=0&&r.push({dataGroupId:e.oldDataGroupIds[n],data:e.oldData[n],divide:VW(e.oldData[n]),groupIdDim:t.dimension})})),N(Io(t.to),(function(t){var i=BW(n.updatedSeries,t);if(i>=0){var r=n.updatedSeries[i].getData();o.push({dataGroupId:e.oldDataGroupIds[i],data:r,divide:VW(r),groupIdDim:t.dimension})}})),r.length>0&&o.length>0&&NW(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=gt(),i=gt(),r=gt();return N(t.oldSeries,(function(e,n){var o=t.oldDataGroupIds[n],a=t.oldData[n],s=EW(e),l=zW(s);i.set(l,{dataGroupId:o,data:a}),H(s)&&N(s,(function(t){r.set(t,{key:l,dataGroupId:o,data:a})}))})),N(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.get("dataGroupId"),o=t.getData(),a=EW(t),s=zW(a),l=i.get(s);if(l)n.set(s,{oldSeries:[{dataGroupId:l.dataGroupId,divide:VW(l.data),data:l.data}],newSeries:[{dataGroupId:e,divide:VW(o),data:o}]});else if(H(a)){var u=[];N(a,(function(t){var e=i.get(t);e.data&&u.push({dataGroupId:e.dataGroupId,divide:VW(e.data),data:e.data})})),u.length&&n.set(s,{oldSeries:u,newSeries:[{dataGroupId:e,data:o,divide:VW(o)}]})}else{var h=r.get(a);if(h){var c=n.get(h.key);c||(c={oldSeries:[{dataGroupId:h.dataGroupId,data:h.data,divide:VW(h.data)}],newSeries:[]},n.set(h.key,c)),c.newSeries.push({dataGroupId:e,data:o,divide:VW(o)})}}}})),n}(i,n);N(o.keys(),(function(t){var n=o.get(t);NW(n.oldSeries,n.newSeries,e)}))}N(n.updatedSeries,(function(t){t[xg]&&(t[xg]=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldDataGroupIds=[],u=i.oldData=[],h=0;h = S | ((prevState: S) => S); +export function useState(initialState: S | (() => S)): [S, (update: StateUpdater) => void]; +export function useReducer(reducer: (state: S, action: A) => S, initialState: S): [S, (action: A) => void]; +export function useEffect(effect: () => void | (() => void), inputs?: readonly unknown[]): void; +export function useLayoutEffect(effect: () => void | (() => void), inputs?: readonly unknown[]): void; +export function useRef(initialValue: T): { current: T }; +export function useRef(initialValue: T | null): Ref; +export function useRef(): Ref; +export function useMemo(factory: () => T, inputs: readonly unknown[]): T; +export function useCallback any>(callback: T, inputs: readonly unknown[]): T; +export function useContext(context: Context): T; diff --git a/web/vendor/preact-hooks.mjs b/web/vendor/preact-hooks.mjs new file mode 100644 index 0000000..1ee4c40 --- /dev/null +++ b/web/vendor/preact-hooks.mjs @@ -0,0 +1,2 @@ +import{options as n}from"preact";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return"function"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__="P"+i[0]+"-"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k="function"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return"function"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState}; +//# sourceMappingURL=hooks.module.js.map diff --git a/web/vendor/preact.d.ts b/web/vendor/preact.d.ts new file mode 100644 index 0000000..32accbc --- /dev/null +++ b/web/vendor/preact.d.ts @@ -0,0 +1,22 @@ +export type Key = string | number; +export interface Ref { current: T | null; } +export type ComponentChild = VNode | string | number | bigint | boolean | null | undefined; +export type ComponentChildren = ComponentChild | ComponentChild[]; +export interface Attributes { key?: Key; ref?: Ref; children?: ComponentChildren; } +export type VNode

= { type: any; props: P & { children?: ComponentChildren }; key: Key | null; }; +export type ComponentType

= (props: P & Attributes) => VNode | null; +export type Context = { Provider: ComponentType<{ value: T; children?: ComponentChildren }>; Consumer: ComponentType<{ children: (value: T) => ComponentChild }> }; + +export function h(type: any, props: any, ...children: any[]): VNode; +export const Fragment: unique symbol; +export function render(vnode: ComponentChild, parent: Element | ShadowRoot): void; +export function cloneElement(vnode: VNode, props?: any, ...children: any[]): VNode; +export function createContext(defaultValue: T): Context; + +export namespace JSX { + type Element = VNode; + interface ElementClass { render(): ComponentChild; } + interface ElementAttributesProperty { props: {}; } + interface ElementChildrenAttribute { children: {}; } + type IntrinsicElements = { [K in keyof HTMLElementTagNameMap]: any } & { [K in keyof SVGElementTagNameMap]: any } & { [key: string]: any }; +} diff --git a/web/vendor/preact.mjs b/web/vendor/preact.mjs new file mode 100644 index 0000000..77873b9 --- /dev/null +++ b/web/vendor/preact.mjs @@ -0,0 +1,2 @@ +var n,l,u,t,i,o,r,f,e,c,s,a,h={},v=[],p=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function w(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,o,r,f={};for(r in u)"key"==r?i=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return g(l,f,i,o,null)}function g(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function m(){return{current:null}}function b(n){return n.children}function k(n,l){this.props=n,this.context=l}function x(n,l){if(null==l)return n.__?x(n.__,n.__i+1):null;for(var u;lu&&i.sort(f));M.__r=0}function P(n,l,u,t,i,o,r,f,e,c,s){var a,p,y,d,w,_=t&&t.__k||v,g=l.length;for(u.__d=e,$(u,l,_),e=u.__d,a=0;a0?g(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i).__=n,i.__b=n.__b+1,o=null,-1!==(f=i.__i=L(i,u,r,s))&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,"function"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f==r-1?a--:f==r+1?a++:(f>r?a--:a++,i.__u|=65536))):i=n.__k[t]=null;if(s)for(t=0;t(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f2&&(e.children=arguments.length>3?n.call(arguments,2):t),g(l.type,e,i||l.key,o||l.ref,null)}function G(n,l){var u={__c:l="__cC"+a++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.forEach(function(n){n.__e=!0,S(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=v.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},k.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=d({},this.state),"function"==typeof n&&(n=n(d({},u),this.props)),n&&d(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),S(this))},k.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),S(this))},k.prototype.render=b,i=[],r="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},M.__r=0,e=0,c=F(!1),s=F(!0),a=0;export{k as Component,b as Fragment,E as cloneElement,G as createContext,_ as createElement,m as createRef,_ as h,D as hydrate,t as isValidElement,l as options,B as render,H as toChildArray}; +//# sourceMappingURL=preact.module.js.map diff --git a/web/vendor/uplot.css b/web/vendor/uplot.css new file mode 100644 index 0000000..a030d63 --- /dev/null +++ b/web/vendor/uplot.css @@ -0,0 +1 @@ +.uplot, .uplot *, .uplot *::before, .uplot *::after {box-sizing: border-box;}.uplot {font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";line-height: 1.5;width: min-content;}.u-title {text-align: center;font-size: 18px;font-weight: bold;}.u-wrap {position: relative;user-select: none;}.u-over, .u-under {position: absolute;}.u-under {overflow: hidden;}.uplot canvas {display: block;position: relative;width: 100%;height: 100%;}.u-axis {position: absolute;}.u-legend {font-size: 14px;margin: auto;text-align: center;}.u-inline {display: block;}.u-inline * {display: inline-block;}.u-inline tr {margin-right: 16px;}.u-legend th {font-weight: 600;}.u-legend th > * {vertical-align: middle;display: inline-block;}.u-legend .u-marker {width: 1em;height: 1em;margin-right: 4px;background-clip: padding-box !important;}.u-inline.u-live th::after {content: ":";vertical-align: middle;}.u-inline:not(.u-live) .u-value {display: none;}.u-series > * {padding: 4px;}.u-series th {cursor: pointer;}.u-legend .u-off > * {opacity: 0.3;}.u-select {background: rgba(0,0,0,0.07);position: absolute;pointer-events: none;}.u-cursor-x, .u-cursor-y {position: absolute;left: 0;top: 0;pointer-events: none;will-change: transform;}.u-hz .u-cursor-x, .u-vt .u-cursor-y {height: 100%;border-right: 1px dashed #607D8B;}.u-hz .u-cursor-y, .u-vt .u-cursor-x {width: 100%;border-bottom: 1px dashed #607D8B;}.u-cursor-pt {position: absolute;top: 0;left: 0;border-radius: 50%;border: 0 solid;pointer-events: none;will-change: transform;/*this has to be !important since we set inline "background" shorthand */background-clip: padding-box !important;}.u-axis.u-off, .u-select.u-off, .u-cursor-x.u-off, .u-cursor-y.u-off, .u-cursor-pt.u-off {display: none;} \ No newline at end of file diff --git a/web/vendor/uplot.esm.js b/web/vendor/uplot.esm.js new file mode 100644 index 0000000..87473c9 --- /dev/null +++ b/web/vendor/uplot.esm.js @@ -0,0 +1,6140 @@ +/** +* Copyright (c) 2025, Leon Sorokin +* All rights reserved. (MIT Licensed) +* +* uPlot.js (μPlot) +* A small, fast chart for time series, lines, areas, ohlc & bars +* https://github.com/leeoniya/uPlot (v1.6.32) +*/ + +const FEAT_TIME = true; + +const pre = "u-"; + +const UPLOT = "uplot"; +const ORI_HZ = pre + "hz"; +const ORI_VT = pre + "vt"; +const TITLE = pre + "title"; +const WRAP = pre + "wrap"; +const UNDER = pre + "under"; +const OVER = pre + "over"; +const AXIS = pre + "axis"; +const OFF = pre + "off"; +const SELECT = pre + "select"; +const CURSOR_X = pre + "cursor-x"; +const CURSOR_Y = pre + "cursor-y"; +const CURSOR_PT = pre + "cursor-pt"; +const LEGEND = pre + "legend"; +const LEGEND_LIVE = pre + "live"; +const LEGEND_INLINE = pre + "inline"; +const LEGEND_SERIES = pre + "series"; +const LEGEND_MARKER = pre + "marker"; +const LEGEND_LABEL = pre + "label"; +const LEGEND_VALUE = pre + "value"; + +const WIDTH = "width"; +const HEIGHT = "height"; +const TOP = "top"; +const BOTTOM = "bottom"; +const LEFT = "left"; +const RIGHT = "right"; +const hexBlack = "#000"; +const transparent = hexBlack + "0"; + +const mousemove = "mousemove"; +const mousedown = "mousedown"; +const mouseup = "mouseup"; +const mouseenter = "mouseenter"; +const mouseleave = "mouseleave"; +const dblclick = "dblclick"; +const resize = "resize"; +const scroll = "scroll"; + +const change = "change"; +const dppxchange = "dppxchange"; + +const LEGEND_DISP = "--"; + +const domEnv = typeof window != 'undefined'; + +const doc = domEnv ? document : null; +const win = domEnv ? window : null; +const nav = domEnv ? navigator : null; + +let pxRatio; + +//export const canHover = domEnv && !win.matchMedia('(hover: none)').matches; + +let query; + +function setPxRatio() { + let _pxRatio = devicePixelRatio; + + // during print preview, Chrome fires off these dppx queries even without changes + if (pxRatio != _pxRatio) { + pxRatio = _pxRatio; + + query && off(change, query, setPxRatio); + query = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`); + on(change, query, setPxRatio); + + win.dispatchEvent(new CustomEvent(dppxchange)); + } +} + +function addClass(el, c) { + if (c != null) { + let cl = el.classList; + !cl.contains(c) && cl.add(c); + } +} + +function remClass(el, c) { + let cl = el.classList; + cl.contains(c) && cl.remove(c); +} + +function setStylePx(el, name, value) { + el.style[name] = value + "px"; +} + +function placeTag(tag, cls, targ, refEl) { + let el = doc.createElement(tag); + + if (cls != null) + addClass(el, cls); + + if (targ != null) + targ.insertBefore(el, refEl); + + return el; +} + +function placeDiv(cls, targ) { + return placeTag("div", cls, targ); +} + +const xformCache = new WeakMap(); + +function elTrans(el, xPos, yPos, xMax, yMax) { + let xform = "translate(" + xPos + "px," + yPos + "px)"; + let xformOld = xformCache.get(el); + + if (xform != xformOld) { + el.style.transform = xform; + xformCache.set(el, xform); + + if (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax) + addClass(el, OFF); + else + remClass(el, OFF); + } +} + +const colorCache = new WeakMap(); + +function elColor(el, background, borderColor) { + let newColor = background + borderColor; + let oldColor = colorCache.get(el); + + if (newColor != oldColor) { + colorCache.set(el, newColor); + el.style.background = background; + el.style.borderColor = borderColor; + } +} + +const sizeCache = new WeakMap(); + +function elSize(el, newWid, newHgt, centered) { + let newSize = newWid + "" + newHgt; + let oldSize = sizeCache.get(el); + + if (newSize != oldSize) { + sizeCache.set(el, newSize); + el.style.height = newHgt + "px"; + el.style.width = newWid + "px"; + el.style.marginLeft = centered ? -newWid/2 + "px" : 0; + el.style.marginTop = centered ? -newHgt/2 + "px" : 0; + } +} + +const evOpts = {passive: true}; +const evOpts2 = {...evOpts, capture: true}; + +function on(ev, el, cb, capt) { + el.addEventListener(ev, cb, capt ? evOpts2 : evOpts); +} + +function off(ev, el, cb, capt) { + el.removeEventListener(ev, cb, evOpts); +} + +domEnv && setPxRatio(); + +// binary search for index of closest value +function closestIdx(num, arr, lo, hi) { + let mid; + lo = lo || 0; + hi = hi || arr.length - 1; + let bitwise = hi <= 2147483647; + + while (hi - lo > 1) { + mid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2); + + if (arr[mid] < num) + lo = mid; + else + hi = mid; + } + + if (num - arr[lo] <= arr[hi] - num) + return lo; + + return hi; +} + +function makeIndexOfs(predicate) { + let indexOfs = (data, _i0, _i1) => { + let i0 = -1; + let i1 = -1; + + for (let i = _i0; i <= _i1; i++) { + if (predicate(data[i])) { + i0 = i; + break; + } + } + + for (let i = _i1; i >= _i0; i--) { + if (predicate(data[i])) { + i1 = i; + break; + } + } + + return [i0, i1]; + }; + + return indexOfs; +} + +const notNullish = v => v != null; +const isPositive = v => v != null && v > 0; + +const nonNullIdxs = makeIndexOfs(notNullish); +const positiveIdxs = makeIndexOfs(isPositive); + +function getMinMax(data, _i0, _i1, sorted = 0, log = false) { +// console.log("getMinMax()"); + + let getEdgeIdxs = log ? positiveIdxs : nonNullIdxs; + let predicate = log ? isPositive : notNullish; + + [_i0, _i1] = getEdgeIdxs(data, _i0, _i1); + + let _min = data[_i0]; + let _max = data[_i0]; + + if (_i0 > -1) { + if (sorted == 1) { + _min = data[_i0]; + _max = data[_i1]; + } + else if (sorted == -1) { + _min = data[_i1]; + _max = data[_i0]; + } + else { + for (let i = _i0; i <= _i1; i++) { + let v = data[i]; + + if (predicate(v)) { + if (v < _min) + _min = v; + else if (v > _max) + _max = v; + } + } + } + } + + return [_min ?? inf, _max ?? -inf]; // todo: fix to return nulls +} + +function rangeLog(min, max, base, fullMags) { + let minSign = sign(min); + let maxSign = sign(max); + + if (min == max) { + if (minSign == -1) { + min *= base; + max /= base; + } + else { + min /= base; + max *= base; + } + } + + let logFn = base == 10 ? log10 : log2; + + let growMinAbs = minSign == 1 ? floor : ceil; + let growMaxAbs = maxSign == 1 ? ceil : floor; + + let minExp = growMinAbs(logFn(abs(min))); + let maxExp = growMaxAbs(logFn(abs(max))); + + let minIncr = pow(base, minExp); + let maxIncr = pow(base, maxExp); + + // fix values like Math.pow(10, -5) === 0.000009999999999999999 + if (base == 10) { + if (minExp < 0) + minIncr = roundDec(minIncr, -minExp); + if (maxExp < 0) + maxIncr = roundDec(maxIncr, -maxExp); + } + + if (fullMags || base == 2) { + min = minIncr * minSign; + max = maxIncr * maxSign; + } + else { + min = incrRoundDn(min, minIncr); + max = incrRoundUp(max, maxIncr); + } + + return [min, max]; +} + +function rangeAsinh(min, max, base, fullMags) { + let minMax = rangeLog(min, max, base, fullMags); + + if (min == 0) + minMax[0] = 0; + + if (max == 0) + minMax[1] = 0; + + return minMax; +} + +const rangePad = 0.1; + +const autoRangePart = { + mode: 3, + pad: rangePad, +}; + +const _eqRangePart = { + pad: 0, + soft: null, + mode: 0, +}; + +const _eqRange = { + min: _eqRangePart, + max: _eqRangePart, +}; + +// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below +// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value +function rangeNum(_min, _max, mult, extra) { + if (isObj(mult)) + return _rangeNum(_min, _max, mult); + + _eqRangePart.pad = mult; + _eqRangePart.soft = extra ? 0 : null; + _eqRangePart.mode = extra ? 3 : 0; + + return _rangeNum(_min, _max, _eqRange); +} + +// nullish coalesce +function ifNull(lh, rh) { + return lh == null ? rh : lh; +} + +// checks if given index range in an array contains a non-null value +// aka a range-bounded Array.some() +function hasData(data, idx0, idx1) { + idx0 = ifNull(idx0, 0); + idx1 = ifNull(idx1, data.length - 1); + + while (idx0 <= idx1) { + if (data[idx0] != null) + return true; + idx0++; + } + + return false; +} + +function _rangeNum(_min, _max, cfg) { + let cmin = cfg.min; + let cmax = cfg.max; + + let padMin = ifNull(cmin.pad, 0); + let padMax = ifNull(cmax.pad, 0); + + let hardMin = ifNull(cmin.hard, -inf); + let hardMax = ifNull(cmax.hard, inf); + + let softMin = ifNull(cmin.soft, inf); + let softMax = ifNull(cmax.soft, -inf); + + let softMinMode = ifNull(cmin.mode, 0); + let softMaxMode = ifNull(cmax.mode, 0); + + let delta = _max - _min; + let deltaMag = log10(delta); + + let scalarMax = max(abs(_min), abs(_max)); + let scalarMag = log10(scalarMax); + + let scalarMagDelta = abs(scalarMag - deltaMag); + + // this handles situations like 89.7, 89.69999999999999 + // by assuming 0.001x deltas are precision errors +// if (delta > 0 && delta < abs(_max) / 1e3) +// delta = 0; + + // treat data as flat if delta is less than 1e-24 + // or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004 + if (delta < 1e-24 || scalarMagDelta > 10) { + delta = 0; + + // if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback + // this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1 + if (_min == 0 || _max == 0) { + delta = 1e-24; + + if (softMinMode == 2 && softMin != inf) + padMin = 0; + + if (softMaxMode == 2 && softMax != -inf) + padMax = 0; + } + } + + let nonZeroDelta = delta || scalarMax || 1e3; + let mag = log10(nonZeroDelta); + let base = pow(10, floor(mag)); + + let _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin); + let _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 24); + let _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf; + let minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin)); + + let _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax); + let _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 24); + let _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf; + let maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax)); + + if (minLim == maxLim && minLim == 0) + maxLim = 100; + + return [minLim, maxLim]; +} + +// alternative: https://stackoverflow.com/a/2254896 +const numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US'); +const fmtNum = val => numFormatter.format(val); + +const M = Math; + +const PI = M.PI; +const abs = M.abs; +const floor = M.floor; +const round = M.round; +const ceil = M.ceil; +const min = M.min; +const max = M.max; +const pow = M.pow; +const sign = M.sign; +const log10 = M.log10; +const log2 = M.log2; +// TODO: seems like this needs to match asinh impl if the passed v is tweaked? +const sinh = (v, linthresh = 1) => M.sinh(v) * linthresh; +const asinh = (v, linthresh = 1) => M.asinh(v / linthresh); + +const inf = Infinity; + +function numIntDigits(x) { + return (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; +} + +function clamp(num, _min, _max) { + return min(max(num, _min), _max); +} + +function isFn(v) { + return typeof v == "function"; +} + +function fnOrSelf(v) { + return isFn(v) ? v : () => v; +} + +const noop = () => {}; + +// note: these identity fns may get deoptimized if reused for different arg types +// a TS version would enforce they stay monotyped and require making variants +const retArg0 = _0 => _0; + +const retArg1 = (_0, _1) => _1; + +const retNull = _ => null; + +const retTrue = _ => true; + +const retEq = (a, b) => a == b; + +const regex6 = /\.\d*?(?=9{6,}|0{6,})/gm; + +// e.g. 17999.204999999998 -> 17999.205 +const fixFloat = val => { + if (isInt(val) || fixedDec.has(val)) + return val; + + const str = `${val}`; + + const match = str.match(regex6); + + if (match == null) + return val; + + let len = match[0].length - 1; + + // e.g. 1.0000000000000001e-24 + if (str.indexOf('e-') != -1) { + let [num, exp] = str.split('e'); + return +`${fixFloat(num)}e${exp}`; + } + + return roundDec(val, len); +}; + +function incrRound(num, incr) { + return fixFloat(roundDec(fixFloat(num/incr))*incr); +} + +function incrRoundUp(num, incr) { + return fixFloat(ceil(fixFloat(num/incr))*incr); +} + +function incrRoundDn(num, incr) { + return fixFloat(floor(fixFloat(num/incr))*incr); +} + +// https://stackoverflow.com/a/48764436 +// rounds half away from zero +function roundDec(val, dec = 0) { + if (isInt(val)) + return val; +// else if (dec == 0) +// return round(val); + + let p = 10 ** dec; + let n = (val * p) * (1 + Number.EPSILON); + return round(n) / p; +} + +const fixedDec = new Map(); + +function guessDec(num) { + return ((""+num).split(".")[1] || "").length; +} + +function genIncrs(base, minExp, maxExp, mults) { + let incrs = []; + + let multDec = mults.map(guessDec); + + for (let exp = minExp; exp < maxExp; exp++) { + let expa = abs(exp); + let mag = roundDec(pow(base, exp), expa); + + for (let i = 0; i < mults.length; i++) { + let _incr = base == 10 ? +`${mults[i]}e${exp}` : mults[i] * mag; + let dec = (exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]); + let incr = base == 10 ? _incr : roundDec(_incr, dec); + incrs.push(incr); + fixedDec.set(incr, dec); + } + } + + return incrs; +} + +//export const assign = Object.assign; + +const EMPTY_OBJ = {}; +const EMPTY_ARR = []; + +const nullNullTuple = [null, null]; + +const isArr = Array.isArray; +const isInt = Number.isInteger; +const isUndef = v => v === void 0; + +function isStr(v) { + return typeof v == 'string'; +} + +function isObj(v) { + let is = false; + + if (v != null) { + let c = v.constructor; + is = c == null || c == Object; + } + + return is; +} + +function fastIsObj(v) { + return v != null && typeof v == 'object'; +} + +const TypedArray = Object.getPrototypeOf(Uint8Array); + +const __proto__ = "__proto__"; + +function copy(o, _isObj = isObj) { + let out; + + if (isArr(o)) { + let val = o.find(v => v != null); + + if (isArr(val) || _isObj(val)) { + out = Array(o.length); + for (let i = 0; i < o.length; i++) + out[i] = copy(o[i], _isObj); + } + else + out = o.slice(); + } + else if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView)) + out = o.slice(); + else if (_isObj(o)) { + out = {}; + for (let k in o) { + if (k != __proto__) + out[k] = copy(o[k], _isObj); + } + } + else + out = o; + + return out; +} + +function assign(targ) { + let args = arguments; + + for (let i = 1; i < args.length; i++) { + let src = args[i]; + + for (let key in src) { + if (key != __proto__) { + if (isObj(targ[key])) + assign(targ[key], copy(src[key])); + else + targ[key] = copy(src[key]); + } + } + } + + return targ; +} + +// nullModes +const NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true) +const NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default) +const NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts + +// sets undefined values to nulls when adjacent to existing nulls (minesweeper) +function nullExpand(yVals, nullIdxs, alignedLen) { + for (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) { + let nullIdx = nullIdxs[i]; + + if (nullIdx > lastNullIdx) { + xi = nullIdx - 1; + while (xi >= 0 && yVals[xi] == null) + yVals[xi--] = null; + + xi = nullIdx + 1; + while (xi < alignedLen && yVals[xi] == null) + yVals[lastNullIdx = xi++] = null; + } + } +} + +// nullModes is a tables-matched array indicating how to treat nulls in each series +// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed +function join(tables, nullModes) { + if (allHeadersSame(tables)) { + // console.log('cheap join!'); + + let table = tables[0].slice(); + + for (let i = 1; i < tables.length; i++) + table.push(...tables[i].slice(1)); + + if (!isAsc(table[0])) + table = sortCols(table); + + return table; + } + + let xVals = new Set(); + + for (let ti = 0; ti < tables.length; ti++) { + let t = tables[ti]; + let xs = t[0]; + let len = xs.length; + + for (let i = 0; i < len; i++) + xVals.add(xs[i]); + } + + let data = [Array.from(xVals).sort((a, b) => a - b)]; + + let alignedLen = data[0].length; + + let xIdxs = new Map(); + + for (let i = 0; i < alignedLen; i++) + xIdxs.set(data[0][i], i); + + for (let ti = 0; ti < tables.length; ti++) { + let t = tables[ti]; + let xs = t[0]; + + for (let si = 1; si < t.length; si++) { + let ys = t[si]; + + let yVals = Array(alignedLen).fill(undefined); + + let nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN; + + let nullIdxs = []; + + for (let i = 0; i < ys.length; i++) { + let yVal = ys[i]; + let alignedIdx = xIdxs.get(xs[i]); + + if (yVal === null) { + if (nullMode != NULL_REMOVE) { + yVals[alignedIdx] = yVal; + + if (nullMode == NULL_EXPAND) + nullIdxs.push(alignedIdx); + } + } + else + yVals[alignedIdx] = yVal; + } + + nullExpand(yVals, nullIdxs, alignedLen); + + data.push(yVals); + } + } + + return data; +} + +const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask; + +// TODO: https://github.com/dy/sort-ids (~2x faster for 1e5+ arrays) +function sortCols(table) { + let head = table[0]; + let rlen = head.length; + + let idxs = Array(rlen); + for (let i = 0; i < idxs.length; i++) + idxs[i] = i; + + idxs.sort((i0, i1) => head[i0] - head[i1]); + + let table2 = []; + for (let i = 0; i < table.length; i++) { + let row = table[i]; + let row2 = Array(rlen); + + for (let j = 0; j < rlen; j++) + row2[j] = row[idxs[j]]; + + table2.push(row2); + } + + return table2; +} + +// test if we can do cheap join (all join fields same) +function allHeadersSame(tables) { + let vals0 = tables[0][0]; + let len0 = vals0.length; + + for (let i = 1; i < tables.length; i++) { + let vals1 = tables[i][0]; + + if (vals1.length != len0) + return false; + + if (vals1 != vals0) { + for (let j = 0; j < len0; j++) { + if (vals1[j] != vals0[j]) + return false; + } + } + } + + return true; +} + +function isAsc(vals, samples = 100) { + const len = vals.length; + + // empty or single value + if (len <= 1) + return true; + + // skip leading & trailing nullish + let firstIdx = 0; + let lastIdx = len - 1; + + while (firstIdx <= lastIdx && vals[firstIdx] == null) + firstIdx++; + + while (lastIdx >= firstIdx && vals[lastIdx] == null) + lastIdx--; + + // all nullish or one value surrounded by nullish + if (lastIdx <= firstIdx) + return true; + + const stride = max(1, floor((lastIdx - firstIdx + 1) / samples)); + + for (let prevVal = vals[firstIdx], i = firstIdx + stride; i <= lastIdx; i += stride) { + const v = vals[i]; + + if (v != null) { + if (v <= prevVal) + return false; + + prevVal = v; + } + } + + return true; +} + +const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +const days = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", +]; + +function slice3(str) { + return str.slice(0, 3); +} + +const days3 = days.map(slice3); + +const months3 = months.map(slice3); + +const engNames = { + MMMM: months, + MMM: months3, + WWWW: days, + WWW: days3, +}; + +function zeroPad2(int) { + return (int < 10 ? '0' : '') + int; +} + +function zeroPad3(int) { + return (int < 10 ? '00' : int < 100 ? '0' : '') + int; +} + +/* +function suffix(int) { + let mod10 = int % 10; + + return int + ( + mod10 == 1 && int != 11 ? "st" : + mod10 == 2 && int != 12 ? "nd" : + mod10 == 3 && int != 13 ? "rd" : "th" + ); +} +*/ + +const subs = { + // 2019 + YYYY: d => d.getFullYear(), + // 19 + YY: d => (d.getFullYear()+'').slice(2), + // July + MMMM: (d, names) => names.MMMM[d.getMonth()], + // Jul + MMM: (d, names) => names.MMM[d.getMonth()], + // 07 + MM: d => zeroPad2(d.getMonth()+1), + // 7 + M: d => d.getMonth()+1, + // 09 + DD: d => zeroPad2(d.getDate()), + // 9 + D: d => d.getDate(), + // Monday + WWWW: (d, names) => names.WWWW[d.getDay()], + // Mon + WWW: (d, names) => names.WWW[d.getDay()], + // 03 + HH: d => zeroPad2(d.getHours()), + // 3 + H: d => d.getHours(), + // 9 (12hr, unpadded) + h: d => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;}, + // AM + AA: d => d.getHours() >= 12 ? 'PM' : 'AM', + // am + aa: d => d.getHours() >= 12 ? 'pm' : 'am', + // a + a: d => d.getHours() >= 12 ? 'p' : 'a', + // 09 + mm: d => zeroPad2(d.getMinutes()), + // 9 + m: d => d.getMinutes(), + // 09 + ss: d => zeroPad2(d.getSeconds()), + // 9 + s: d => d.getSeconds(), + // 374 + fff: d => zeroPad3(d.getMilliseconds()), +}; + +function fmtDate(tpl, names) { + names = names || engNames; + let parts = []; + + let R = /\{([a-z]+)\}|[^{]+/gi, m; + + while (m = R.exec(tpl)) + parts.push(m[0][0] == '{' ? subs[m[1]] : m[0]); + + return d => { + let out = ''; + + for (let i = 0; i < parts.length; i++) + out += typeof parts[i] == "string" ? parts[i] : parts[i](d, names); + + return out; + } +} + +const localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone; + +// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131 +function tzDate(date, tz) { + let date2; + + // perf optimization + if (tz == 'UTC' || tz == 'Etc/UTC') + date2 = new Date(+date + date.getTimezoneOffset() * 6e4); + else if (tz == localTz) + date2 = date; + else { + date2 = new Date(date.toLocaleString('en-US', {timeZone: tz})); + date2.setMilliseconds(date.getMilliseconds()); + } + + return date2; +} + +//export const series = []; + +// default formatters: + +const onlyWhole = v => v % 1 == 0; + +const allMults = [1,2,2.5,5]; + +// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5 +const decIncrs = genIncrs(10, -32, 0, allMults); + +// 1, 2, 2.5, 5, 10, 20, 25, 50... +const oneIncrs = genIncrs(10, 0, 32, allMults); + +// 1, 2, 5, 10, 20, 25, 50... +const wholeIncrs = oneIncrs.filter(onlyWhole); + +const numIncrs = decIncrs.concat(oneIncrs); + +const NL = "\n"; + +const yyyy = "{YYYY}"; +const NLyyyy = NL + yyyy; +const md = "{M}/{D}"; +const NLmd = NL + md; +const NLmdyy = NLmd + "/{YY}"; + +const aa = "{aa}"; +const hmm = "{h}:{mm}"; +const hmmaa = hmm + aa; +const NLhmmaa = NL + hmmaa; +const ss = ":{ss}"; + +const _ = null; + +function genTimeStuffs(ms) { + let s = ms * 1e3, + m = s * 60, + h = m * 60, + d = h * 24, + mo = d * 30, + y = d * 365; + + // min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms + let subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults); + + let timeIncrs = subSecIncrs.concat([ + // minute divisors (# of secs) + s, + s * 5, + s * 10, + s * 15, + s * 30, + // hour divisors (# of mins) + m, + m * 5, + m * 10, + m * 15, + m * 30, + // day divisors (# of hrs) + h, + h * 2, + h * 3, + h * 4, + h * 6, + h * 8, + h * 12, + // month divisors TODO: need more? + d, + d * 2, + d * 3, + d * 4, + d * 5, + d * 6, + d * 7, + d * 8, + d * 9, + d * 10, + d * 15, + // year divisors (# months, approx) + mo, + mo * 2, + mo * 3, + mo * 4, + mo * 6, + // century divisors + y, + y * 2, + y * 5, + y * 10, + y * 25, + y * 50, + y * 100, + ]); + + // [0]: minimum num secs in the tick incr + // [1]: default tick format + // [2-7]: rollover tick formats + // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7] + const _timeAxisStamps = [ + // tick incr default year month day hour min sec mode + [y, yyyy, _, _, _, _, _, _, 1], + [d * 28, "{MMM}", NLyyyy, _, _, _, _, _, 1], + [d, md, NLyyyy, _, _, _, _, _, 1], + [h, "{h}" + aa, NLmdyy, _, NLmd, _, _, _, 1], + [m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1], + [s, ss, NLmdyy + " " + hmmaa, _, NLmd + " " + hmmaa, _, NLhmmaa, _, 1], + [ms, ss + ".{fff}", NLmdyy + " " + hmmaa, _, NLmd + " " + hmmaa, _, NLhmmaa, _, 1], + ]; + + // the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp + // https://www.timeanddate.com/time/dst/ + // https://www.timeanddate.com/time/dst/2019.html + // https://www.epochconverter.com/timezones + function timeAxisSplits(tzDate) { + return (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => { + let splits = []; + let isYr = foundIncr >= y; + let isMo = foundIncr >= mo && foundIncr < y; + + // get the timezone-adjusted date + let minDate = tzDate(scaleMin); + let minDateTs = roundDec(minDate * ms, 3); + + // get ts of 12am (this lands us at or before the original scaleMin) + let minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate()); + let minMinTs = roundDec(minMin * ms, 3); + + if (isMo || isYr) { + let moIncr = isMo ? foundIncr / mo : 0; + let yrIncr = isYr ? foundIncr / y : 0; + // let tzOffset = scaleMin - minDateTs; // needed? + let split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3); + let splitDate = new Date(round(split / ms)); + let baseYear = splitDate.getFullYear(); + let baseMonth = splitDate.getMonth(); + + for (let i = 0; split <= scaleMax; i++) { + let next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1); + let offs = next - tzDate(roundDec(next * ms, 3)); + + split = roundDec((+next + offs) * ms, 3); + + if (split <= scaleMax) + splits.push(split); + } + } + else { + let incr0 = foundIncr >= d ? d : foundIncr; + let tzOffset = floor(scaleMin) - floor(minDateTs); + let split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0); + splits.push(split); + + let date0 = tzDate(split); + + let prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h); + let incrHours = foundIncr / h; + + let minSpace = self.axes[axisIdx]._space; + let pctSpace = foundSpace / minSpace; + + while (1) { + split = roundDec(split + foundIncr, ms == 1 ? 0 : 3); + + if (split > scaleMax) + break; + + if (incrHours > 1) { + let expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24; + let splitDate = tzDate(split); + let actualHour = splitDate.getHours(); + + let dstShift = actualHour - expectedHour; + + if (dstShift > 1) + dstShift = -1; + + split -= dstShift * h; + + prevHour = (prevHour + incrHours) % 24; + + // add a tick only if it's further than 70% of the min allowed label spacing + let prevSplit = splits[splits.length - 1]; + let pctIncr = roundDec((split - prevSplit) / foundIncr, 3); + + if (pctIncr * pctSpace >= .7) + splits.push(split); + } + else + splits.push(split); + } + } + + return splits; + } + } + + return [ + timeIncrs, + _timeAxisStamps, + timeAxisSplits, + ]; +} + +const [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1); +const [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3); + +// base 2 +genIncrs(2, -53, 53, [1]); + +/* +console.log({ + decIncrs, + oneIncrs, + wholeIncrs, + numIncrs, + timeIncrs, + fixedDec, +}); +*/ + +function timeAxisStamps(stampCfg, fmtDate) { + return stampCfg.map(s => s.map((v, i) => + i == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v) + )); +} + +// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales. +// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it +function timeAxisVals(tzDate, stamps) { + return (self, splits, axisIdx, foundSpace, foundIncr) => { + let s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1]; + + // these track boundaries when a full label is needed again + let prevYear; + let prevMnth; + let prevDate; + let prevHour; + let prevMins; + let prevSecs; + + return splits.map(split => { + let date = tzDate(split); + + let newYear = date.getFullYear(); + let newMnth = date.getMonth(); + let newDate = date.getDate(); + let newHour = date.getHours(); + let newMins = date.getMinutes(); + let newSecs = date.getSeconds(); + + let stamp = ( + newYear != prevYear && s[2] || + newMnth != prevMnth && s[3] || + newDate != prevDate && s[4] || + newHour != prevHour && s[5] || + newMins != prevMins && s[6] || + newSecs != prevSecs && s[7] || + s[1] + ); + + prevYear = newYear; + prevMnth = newMnth; + prevDate = newDate; + prevHour = newHour; + prevMins = newMins; + prevSecs = newSecs; + + return stamp(date); + }); + } +} + +// for when axis.values is defined as a static fmtDate template string +function timeAxisVal(tzDate, dateTpl) { + let stamp = fmtDate(dateTpl); + return (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split))); +} + +function mkDate(y, m, d) { + return new Date(y, m, d); +} + +function timeSeriesStamp(stampCfg, fmtDate) { + return fmtDate(stampCfg); +} +const _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}'; + +function timeSeriesVal(tzDate, stamp) { + return (self, val, seriesIdx, dataIdx) => dataIdx == null ? LEGEND_DISP : stamp(tzDate(val)); +} + +function legendStroke(self, seriesIdx) { + let s = self.series[seriesIdx]; + return s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null; +} + +function legendFill(self, seriesIdx) { + return self.series[seriesIdx].fill(self, seriesIdx); +} + +const legendOpts = { + show: true, + live: true, + isolate: false, + mount: noop, + markers: { + show: true, + width: 2, + stroke: legendStroke, + fill: legendFill, + dash: "solid", + }, + idx: null, + idxs: null, + values: [], +}; + +function cursorPointShow(self, si) { + let o = self.cursor.points; + + let pt = placeDiv(); + + let size = o.size(self, si); + setStylePx(pt, WIDTH, size); + setStylePx(pt, HEIGHT, size); + + let mar = size / -2; + setStylePx(pt, "marginLeft", mar); + setStylePx(pt, "marginTop", mar); + + let width = o.width(self, si, size); + width && setStylePx(pt, "borderWidth", width); + + return pt; +} + +function cursorPointFill(self, si) { + let sp = self.series[si].points; + return sp._fill || sp._stroke; +} + +function cursorPointStroke(self, si) { + let sp = self.series[si].points; + return sp._stroke || sp._fill; +} + +function cursorPointSize(self, si) { + let sp = self.series[si].points; + return sp.size; +} + +const moveTuple = [0,0]; + +function cursorMove(self, mouseLeft1, mouseTop1) { + moveTuple[0] = mouseLeft1; + moveTuple[1] = mouseTop1; + return moveTuple; +} + +function filtBtn0(self, targ, handle, onlyTarg = true) { + return e => { + e.button == 0 && (!onlyTarg || e.target == targ) && handle(e); + }; +} + +function filtTarg(self, targ, handle, onlyTarg = true) { + return e => { + (!onlyTarg || e.target == targ) && handle(e); + }; +} + +const cursorOpts = { + show: true, + x: true, + y: true, + lock: false, + move: cursorMove, + points: { + one: false, + show: cursorPointShow, + size: cursorPointSize, + width: 0, + stroke: cursorPointStroke, + fill: cursorPointFill, + }, + + bind: { + mousedown: filtBtn0, + mouseup: filtBtn0, + click: filtBtn0, // legend clicks, not .u-over clicks + dblclick: filtBtn0, + + mousemove: filtTarg, + mouseleave: filtTarg, + mouseenter: filtTarg, + }, + + drag: { + setScale: true, + x: true, + y: false, + dist: 0, + uni: null, + click: (self, e) => { + // e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + }, + _x: false, + _y: false, + }, + + focus: { + dist: (self, seriesIdx, dataIdx, valPos, curPos) => valPos - curPos, + prox: -1, + bias: 0, + }, + + hover: { + skip: [void 0], + prox: null, + bias: 0, + }, + + left: -10, + top: -10, + idx: null, + dataIdx: null, + idxs: null, + + event: null, +}; + +const axisLines = { + show: true, + stroke: "rgba(0,0,0,0.07)", + width: 2, +// dash: [], +}; + +const grid = assign({}, axisLines, { + filter: retArg1, +}); + +const ticks = assign({}, grid, { + size: 10, +}); + +const border = assign({}, axisLines, { + show: false, +}); + +const font = '12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'; +const labelFont = "bold " + font; +const lineGap = 1.5; // font-size multiplier + +const xAxisOpts = { + show: true, + scale: "x", + stroke: hexBlack, + space: 50, + gap: 5, + alignTo: 1, + size: 50, + labelGap: 0, + labelSize: 30, + labelFont, + side: 2, +// class: "x-vals", +// incrs: timeIncrs, +// values: timeVals, +// filter: retArg1, + grid, + ticks, + border, + font, + lineGap, + rotate: 0, +}; + +const numSeriesLabel = "Value"; +const timeSeriesLabel = "Time"; + +const xSeriesOpts = { + show: true, + scale: "x", + auto: false, + sorted: 1, +// label: "Time", +// value: v => stamp(new Date(v * 1e3)), + + // internal caches + min: inf, + max: -inf, + idxs: [], +}; + +function numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) { + return splits.map(v => v == null ? "" : fmtNum(v)); +} + +function numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + let splits = []; + + let numDec = fixedDec.get(foundIncr) || 0; + + scaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec); + + for (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec)) + splits.push(Object.is(val, -0) ? 0 : val); // coalesces -0 + + return splits; +} + +// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs +function logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + const splits = []; + + const logBase = self.scales[self.axes[axisIdx].scale].log; + + const logFn = logBase == 10 ? log10 : log2; + + const exp = floor(logFn(scaleMin)); + + foundIncr = pow(logBase, exp); + + // boo: 10 ** -24 === 1.0000000000000001e-24 + // this grabs the proper 1e-24 one + if (logBase == 10) + foundIncr = numIncrs[closestIdx(foundIncr, numIncrs)]; + + let split = scaleMin; + let nextMagIncr = foundIncr * logBase; + + if (logBase == 10) + nextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)]; + + do { + splits.push(split); + split = split + foundIncr; + + if (logBase == 10 && !fixedDec.has(split)) + split = roundDec(split, fixedDec.get(foundIncr)); + + if (split >= nextMagIncr) { + foundIncr = split; + nextMagIncr = foundIncr * logBase; + + if (logBase == 10) + nextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)]; + } + } while (split <= scaleMax); + + return splits; +} + +function asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + let sc = self.scales[self.axes[axisIdx].scale]; + + let linthresh = sc.asinh; + + let posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh]; + let zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : []; + let negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh]; + + return negSplits.reverse().map(v => -v).concat(zero, posSplits); +} + +const RE_ALL = /./; +const RE_12357 = /[12357]/; +const RE_125 = /[125]/; +const RE_1 = /1/; + +const _filt = (splits, distr, re, keepMod) => splits.map((v, i) => ((distr == 4 && v == 0) || i % keepMod == 0 && re.test(v.toExponential()[v < 0 ? 1 : 0])) ? v : null); + +function log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) { + let axis = self.axes[axisIdx]; + let scaleKey = axis.scale; + let sc = self.scales[scaleKey]; + +// if (sc.distr == 3 && sc.log == 2) +// return splits; + + let valToPos = self.valToPos; + + let minSpace = axis._space; + + let _10 = valToPos(10, scaleKey); + + let re = ( + valToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL : + valToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 : + valToPos(5, scaleKey) - _10 >= minSpace ? RE_125 : + RE_1 + ); + + if (re == RE_1) { + let magSpace = abs(valToPos(1, scaleKey) - _10); + + if (magSpace < minSpace) + return _filt(splits.slice().reverse(), sc.distr, re, ceil(minSpace / magSpace)).reverse(); // max->min skip + } + + return _filt(splits, sc.distr, re, 1); +} + +function log2AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) { + let axis = self.axes[axisIdx]; + let scaleKey = axis.scale; + let minSpace = axis._space; + let valToPos = self.valToPos; + + let magSpace = abs(valToPos(1, scaleKey) - valToPos(2, scaleKey)); + + if (magSpace < minSpace) + return _filt(splits.slice().reverse(), 3, RE_ALL, ceil(minSpace / magSpace)).reverse(); // max->min skip + + return splits; +} + +function numSeriesVal(self, val, seriesIdx, dataIdx) { + return dataIdx == null ? LEGEND_DISP : val == null ? "" : fmtNum(val); +} + +const yAxisOpts = { + show: true, + scale: "y", + stroke: hexBlack, + space: 30, + gap: 5, + alignTo: 1, + size: 50, + labelGap: 0, + labelSize: 30, + labelFont, + side: 3, +// class: "y-vals", +// incrs: numIncrs, +// values: (vals, space) => vals, +// filter: retArg1, + grid, + ticks, + border, + font, + lineGap, + rotate: 0, +}; + +// takes stroke width +function ptDia(width, mult) { + let dia = 3 + (width || 1) * 2; + return roundDec(dia * mult, 3); +} + +function seriesPointsShow(self, si) { + let { scale, idxs } = self.series[0]; + let xData = self._data[0]; + let p0 = self.valToPos(xData[idxs[0]], scale, true); + let p1 = self.valToPos(xData[idxs[1]], scale, true); + let dim = abs(p1 - p0); + + let s = self.series[si]; +// const dia = ptDia(s.width, pxRatio); + let maxPts = dim / (s.points.space * pxRatio); + return idxs[1] - idxs[0] <= maxPts; +} + +const facet = { + scale: null, + auto: true, + sorted: 0, + + // internal caches + min: inf, + max: -inf, +}; + +const gaps = (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps; + +const xySeriesOpts = { + show: true, + auto: true, + sorted: 0, + gaps, + alpha: 1, + facets: [ + assign({}, facet, {scale: 'x'}), + assign({}, facet, {scale: 'y'}), + ], +}; + +const ySeriesOpts = { + scale: "y", + auto: true, + sorted: 0, + show: true, + spanGaps: false, + gaps, + alpha: 1, + points: { + show: seriesPointsShow, + filter: null, + // paths: + // stroke: "#000", + // fill: "#fff", + // width: 1, + // size: 10, + }, +// label: "Value", +// value: v => v, + values: null, + + // internal caches + min: inf, + max: -inf, + idxs: [], + + path: null, + clip: null, +}; + +function clampScale(self, val, scaleMin, scaleMax, scaleKey) { +/* + if (val < 0) { + let cssHgt = self.bbox.height / pxRatio; + let absPos = self.valToPos(abs(val), scaleKey); + let fromBtm = cssHgt - absPos; + return self.posToVal(cssHgt + fromBtm, scaleKey); + } +*/ + return scaleMin / 10; +} + +const xScaleOpts = { + time: FEAT_TIME, + auto: true, + distr: 1, + log: 10, + asinh: 1, + min: null, + max: null, + dir: 1, + ori: 0, +}; + +const yScaleOpts = assign({}, xScaleOpts, { + time: false, + ori: 1, +}); + +const syncs = {}; + +function _sync(key, opts) { + let s = syncs[key]; + + if (!s) { + s = { + key, + plots: [], + sub(plot) { + s.plots.push(plot); + }, + unsub(plot) { + s.plots = s.plots.filter(c => c != plot); + }, + pub(type, self, x, y, w, h, i) { + for (let j = 0; j < s.plots.length; j++) + s.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i); + }, + }; + + if (key != null) + syncs[key] = s; + } + + return s; +} + +const BAND_CLIP_FILL = 1 << 0; +const BAND_CLIP_STROKE = 1 << 1; + +function orient(u, seriesIdx, cb) { + const mode = u.mode; + const series = u.series[seriesIdx]; + const data = mode == 2 ? u._data[seriesIdx] : u._data; + const scales = u.scales; + const bbox = u.bbox; + + let dx = data[0], + dy = mode == 2 ? data[1] : data[seriesIdx], + sx = mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale], + sy = mode == 2 ? scales[series.facets[1].scale] : scales[series.scale], + l = bbox.left, + t = bbox.top, + w = bbox.width, + h = bbox.height, + H = u.valToPosH, + V = u.valToPosV; + + return (sx.ori == 0 + ? cb( + series, + dx, + dy, + sx, + sy, + H, + V, + l, + t, + w, + h, + moveToH, + lineToH, + rectH, + arcH, + bezierCurveToH, + ) + : cb( + series, + dx, + dy, + sx, + sy, + V, + H, + t, + l, + h, + w, + moveToV, + lineToV, + rectV, + arcV, + bezierCurveToV, + ) + ); +} + +function bandFillClipDirs(self, seriesIdx) { + let fillDir = 0; + + // 2 bits, -1 | 1 + let clipDirs = 0; + + let bands = ifNull(self.bands, EMPTY_ARR); + + for (let i = 0; i < bands.length; i++) { + let b = bands[i]; + + // is a "from" band edge + if (b.series[0] == seriesIdx) + fillDir = b.dir; + // is a "to" band edge + else if (b.series[1] == seriesIdx) { + if (b.dir == 1) + clipDirs |= 1; + else + clipDirs |= 2; + } + } + + return [ + fillDir, + ( + clipDirs == 1 ? -1 : // neg only + clipDirs == 2 ? 1 : // pos only + clipDirs == 3 ? 2 : // both + 0 // neither + ) + ]; +} + +function seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) { + let mode = self.mode; + let series = self.series[seriesIdx]; + let scaleKey = mode == 2 ? series.facets[1].scale : series.scale; + let scale = self.scales[scaleKey]; + + return ( + bandFillDir == -1 ? scale.min : + bandFillDir == 1 ? scale.max : + scale.distr == 3 ? ( + scale.dir == 1 ? scale.min : + scale.max + ) : 0 + ); +} + +// creates inverted band clip path (from stroke path -> yMax || yMin) +// clipDir is always inverse of fillDir +// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx) +function clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) { + return orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + const lineTo = scaleX.ori == 0 ? lineToH : lineToV; + + let frIdx, toIdx; + + if (dir == 1) { + frIdx = idx0; + toIdx = idx1; + } + else { + frIdx = idx1; + toIdx = idx0; + } + + // path start + let x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff)); + let y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff)); + // path end x + let x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff)); + // upper or lower y limit + let yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff)); + + let clip = new Path2D(strokePath); + + lineTo(clip, x1, yLimit); + lineTo(clip, x0, yLimit); + lineTo(clip, x0, y0); + + return clip; + }); +} + +function clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) { + let clip = null; + + // create clip path (invert gaps and non-gaps) + if (gaps.length > 0) { + clip = new Path2D(); + + const rect = ori == 0 ? rectH : rectV; + + let prevGapEnd = plotLft; + + for (let i = 0; i < gaps.length; i++) { + let g = gaps[i]; + + if (g[1] > g[0]) { + let w = g[0] - prevGapEnd; + + w > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt); + + prevGapEnd = g[1]; + } + } + + let w = plotLft + plotWid - prevGapEnd; + + // hack to ensure we expand the clip enough to avoid cutting off strokes at edges + let maxStrokeWidth = 10; + + w > 0 && rect(clip, prevGapEnd, plotTop - maxStrokeWidth / 2, w, plotTop + plotHgt + maxStrokeWidth); + } + + return clip; +} + +function addGap(gaps, fromX, toX) { + let prevGap = gaps[gaps.length - 1]; + + if (prevGap && prevGap[0] == fromX) // TODO: gaps must be encoded at stroke widths? + prevGap[1] = toX; + else + gaps.push([fromX, toX]); +} + +function findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) { + let gaps = []; + let len = xs.length; + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal = ys[i]; + + if (yVal === null) { + let fr = i, to = i; + + if (dir == 1) { + while (++i <= idx1 && ys[i] === null) + to = i; + } + else { + while (--i >= idx0 && ys[i] === null) + to = i; + } + + let frPx = pixelForX(xs[fr]); + let toPx = to == fr ? frPx : pixelForX(xs[to]); + + // if value adjacent to edge null is same pixel, then it's partially + // filled and gap should start at next pixel + let fri2 = fr - dir; + let frPx2 = align <= 0 && fri2 >= 0 && fri2 < len ? pixelForX(xs[fri2]) : frPx; + // if (frPx2 == frPx) + // frPx++; + // else + frPx = frPx2; + + let toi2 = to + dir; + let toPx2 = align >= 0 && toi2 >= 0 && toi2 < len ? pixelForX(xs[toi2]) : toPx; + // if (toPx2 == toPx) + // toPx--; + // else + toPx = toPx2; + + if (toPx >= frPx) + gaps.push([frPx, toPx]); // addGap + } + } + + return gaps; +} + +function pxRoundGen(pxAlign) { + return pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign); +} + +/* +// inefficient linear interpolation that does bi-directinal scans on each call +export function costlyLerp(i, idx0, idx1, _dirX, dataY) { + let prevNonNull = nonNullIdx(dataY, _dirX == 1 ? idx0 : idx1, i, -_dirX); + let nextNonNull = nonNullIdx(dataY, i, _dirX == 1 ? idx1 : idx0, _dirX); + + let prevVal = dataY[prevNonNull]; + let nextVal = dataY[nextNonNull]; + + return prevVal + (i - prevNonNull) / (nextNonNull - prevNonNull) * (nextVal - prevVal); +} +*/ + +function rect(ori) { + let moveTo = ori == 0 ? + moveToH : + moveToV; + + let arcTo = ori == 0 ? + (p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } : + (p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); }; + + let rect = ori == 0 ? + (p, x, y, w, h) => { p.rect(x, y, w, h); } : + (p, y, x, h, w) => { p.rect(x, y, w, h); }; + + // TODO (pending better browser support): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect + return (p, x, y, w, h, endRad = 0, baseRad = 0) => { + if (endRad == 0 && baseRad == 0) + rect(p, x, y, w, h); + else { + endRad = min(endRad, w / 2, h / 2); + baseRad = min(baseRad, w / 2, h / 2); + + // adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871 + moveTo(p, x + endRad, y); + arcTo(p, x + w, y, x + w, y + h, endRad); + arcTo(p, x + w, y + h, x, y + h, baseRad); + arcTo(p, x, y + h, x, y, baseRad); + arcTo(p, x, y, x + w, y, endRad); + p.closePath(); + } + }; +} + +// orientation-inverting canvas functions +const moveToH = (p, x, y) => { p.moveTo(x, y); }; +const moveToV = (p, y, x) => { p.moveTo(x, y); }; +const lineToH = (p, x, y) => { p.lineTo(x, y); }; +const lineToV = (p, y, x) => { p.lineTo(x, y); }; +const rectH = rect(0); +const rectV = rect(1); +const arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); }; +const arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); }; +const bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); }; +const bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); }; + +// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip) +function points(opts) { + return (u, seriesIdx, idx0, idx1, filtIdxs) => { + // log("drawPoints()", arguments); + + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let { pxRound, points } = series; + + let moveTo, arc; + + if (scaleX.ori == 0) { + moveTo = moveToH; + arc = arcH; + } + else { + moveTo = moveToV; + arc = arcV; + } + + const width = roundDec(points.width * pxRatio, 3); + + let rad = (points.size - points.width) / 2 * pxRatio; + let dia = roundDec(rad * 2, 3); + + let fill = new Path2D(); + let clip = new Path2D(); + + let { left: lft, top: top, width: wid, height: hgt } = u.bbox; + + rectH(clip, + lft - dia, + top - dia, + wid + dia * 2, + hgt + dia * 2, + ); + + const drawPoint = pi => { + if (dataY[pi] != null) { + let x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff)); + let y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff)); + + moveTo(fill, x + rad, y); + arc(fill, x, y, rad, 0, PI * 2); + } + }; + + if (filtIdxs) + filtIdxs.forEach(drawPoint); + else { + for (let pi = idx0; pi <= idx1; pi++) + drawPoint(pi); + } + + return { + stroke: width > 0 ? fill : null, + fill, + clip, + flags: BAND_CLIP_FILL | BAND_CLIP_STROKE, + }; + }); + }; +} + +function _drawAcc(lineTo) { + return (stroke, accX, minY, maxY, inY, outY) => { + if (minY != maxY) { + if (inY != minY && outY != minY) + lineTo(stroke, accX, minY); + if (inY != maxY && outY != maxY) + lineTo(stroke, accX, maxY); + + lineTo(stroke, accX, outY); + } + }; +} + +const drawAccH = _drawAcc(lineToH); +const drawAccV = _drawAcc(lineToV); + +function linear(opts) { + const alignGaps = ifNull(opts?.alignGaps, 0); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + [idx0, idx1] = nonNullIdxs(dataY, idx0, idx1); + + let pxRound = series.pxRound; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let lineTo, drawAcc; + + if (scaleX.ori == 0) { + lineTo = lineToH; + drawAcc = drawAccH; + } + else { + lineTo = lineToV; + drawAcc = drawAccV; + } + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + let hasGap = false; + + // decimate when number of points >= 4x available pixels + const decimate = idx1 - idx0 >= xDim * 4; + + if (decimate) { + let xForPixel = pos => u.posToVal(pos, scaleX.key, true); + + let minY = null, + maxY = null, + inY, outY, drawnAtX; + + let accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + + let idx0px = pixelForX(dataX[idx0]); + let idx1px = pixelForX(dataX[idx1]); + + // tracks limit of current x bucket to avoid having to get x pixel for every x value + let nextAccXVal = xForPixel(dir == 1 ? idx0px + 1 : idx1px - 1); + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let xVal = dataX[i]; + let reuseAccX = dir == 1 ? (xVal < nextAccXVal) : (xVal > nextAccXVal); + let x = reuseAccX ? accX : pixelForX(xVal); + + let yVal = dataY[i]; + + if (x == accX) { + if (yVal != null) { + outY = yVal; + + if (minY == null) { + lineTo(stroke, x, pixelForY(outY)); + inY = minY = maxY = outY; + } else { + if (outY < minY) + minY = outY; + else if (outY > maxY) + maxY = outY; + } + } + else { + if (yVal === null) + hasGap = true; + } + } + else { + if (minY != null) + drawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY)); + + if (yVal != null) { + outY = yVal; + lineTo(stroke, x, pixelForY(outY)); + minY = maxY = inY = outY; + } + else { + minY = maxY = null; + + if (yVal === null) + hasGap = true; + } + + accX = x; + nextAccXVal = xForPixel(accX + dir); + } + } + + if (minY != null && minY != maxY && drawnAtX != accX) + drawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY)); + } + else { + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal = dataY[i]; + + if (yVal === null) + hasGap = true; + else if (yVal != null) + lineTo(stroke, pixelForX(dataX[i]), pixelForY(yVal)); + } + } + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillToVal); + + let frX = pixelForX(dataX[idx0]); + let toX = pixelForX(dataX[idx1]); + + if (dir == -1) + [toX, frX] = [frX, toX]; + + lineTo(fill, toX, fillToY); + lineTo(fill, frX, fillToY); + } + + if (!series.spanGaps) { // skip in mode: 2? + // console.time('gaps'); + let gaps = []; + + hasGap && gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + }); + }; +} + +// BUG: align: -1 behaves like align: 1 when scale.dir: -1 +function stepped(opts) { + const align = ifNull(opts.align, 1); + // whether to draw ascenders/descenders at null/gap bondaries + const ascDesc = ifNull(opts.ascDesc, false); + const alignGaps = ifNull(opts.alignGaps, 0); + const extend = ifNull(opts.extend, false); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + [idx0, idx1] = nonNullIdxs(dataY, idx0, idx1); + + let pxRound = series.pxRound; + + let { left, width } = u.bbox; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let lineTo = scaleX.ori == 0 ? lineToH : lineToV; + + const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + let prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]); + let firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + let prevXPos = firstXPos; + + let firstXPosExt = firstXPos; + + if (extend && align == -1) { + firstXPosExt = left; + lineTo(stroke, firstXPosExt, prevYPos); + } + + lineTo(stroke, firstXPos, prevYPos); + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal1 = dataY[i]; + + if (yVal1 == null) + continue; + + let x1 = pixelForX(dataX[i]); + let y1 = pixelForY(yVal1); + + if (align == 1) + lineTo(stroke, x1, prevYPos); + else + lineTo(stroke, prevXPos, y1); + + lineTo(stroke, x1, y1); + + prevYPos = y1; + prevXPos = x1; + } + + let prevXPosExt = prevXPos; + + if (extend && align == 1) { + prevXPosExt = left + width; + lineTo(stroke, prevXPosExt, prevYPos); + } + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillTo); + + lineTo(fill, prevXPosExt, fillToY); + lineTo(fill, firstXPosExt, fillToY); + } + + if (!series.spanGaps) { + // console.time('gaps'); + let gaps = []; + + gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + // expand/contract clips for ascenders/descenders + let halfStroke = (series.width * pxRatio) / 2; + let startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke; + let endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke; + + gaps.forEach(g => { + g[0] += startsOffset; + g[1] += endsOffset; + }); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + }); + }; +} + +function findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid = inf) { + if (dataX.length > 1) { + // prior index with non-undefined y data + let prevIdx = null; + + // scan full dataset for smallest adjacent delta + // will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end + for (let i = 0, minDelta = Infinity; i < dataX.length; i++) { + if (dataY[i] !== undefined) { + if (prevIdx != null) { + let delta = abs(dataX[i] - dataX[prevIdx]); + + if (delta < minDelta) { + minDelta = delta; + colWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff)); + } + } + + prevIdx = i; + } + } + } + + return colWid; +} + +function bars(opts) { + opts = opts || EMPTY_OBJ; + const size = ifNull(opts.size, [0.6, inf, 1]); + const align = opts.align || 0; + const _extraGap = (opts.gap || 0); + + let ro = opts.radius; + + ro = + // [valueRadius, baselineRadius] + ro == null ? [0, 0] : + typeof ro == 'number' ? [ro, 0] : ro; + + const radiusFn = fnOrSelf(ro); + + const gapFactor = 1 - size[0]; + const _maxWidth = ifNull(size[1], inf); + const _minWidth = ifNull(size[2], 1); + + const disp = ifNull(opts.disp, EMPTY_OBJ); + const _each = ifNull(opts.each, _ => {}); + + const { fill: dispFills, stroke: dispStrokes } = disp; + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + let _align = align; + + let extraGap = _extraGap * pxRatio; + let maxWidth = _maxWidth * pxRatio; + let minWidth = _minWidth * pxRatio; + + let valRadius, baseRadius; + + if (scaleX.ori == 0) + [valRadius, baseRadius] = radiusFn(u, seriesIdx); + else + [baseRadius, valRadius] = radiusFn(u, seriesIdx); + + const _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + // const _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1); + + let rect = scaleX.ori == 0 ? rectH : rectV; + + let each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => { + _each(u, seriesIdx, i, lft, top, wid, hgt); + }; + + // band where this series is the "from" edge + let band = ifNull(u.bands, EMPTY_ARR).find(b => b.series[0] == seriesIdx); + + let fillDir = band != null ? band.dir : 0; + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, fillDir); + let fillToY = pxRound(valToPosY(fillTo, scaleY, yDim, yOff)); + + // barWid is to center of stroke + let xShift, barWid, fullGap, colWid = xDim; + + let strokeWidth = pxRound(series.width * pxRatio); + + let multiPath = false; + + let fillColors = null; + let fillPaths = null; + let strokeColors = null; + let strokePaths = null; + + if (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) { + multiPath = true; + + fillColors = dispFills.values(u, seriesIdx, idx0, idx1); + fillPaths = new Map(); + (new Set(fillColors)).forEach(color => { + if (color != null) + fillPaths.set(color, new Path2D()); + }); + + if (strokeWidth > 0) { + strokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1); + strokePaths = new Map(); + (new Set(strokeColors)).forEach(color => { + if (color != null) + strokePaths.set(color, new Path2D()); + }); + } + } + + let { x0, size } = disp; + + if (x0 != null && size != null) { + _align = 1; + dataX = x0.values(u, seriesIdx, idx0, idx1); + + if (x0.unit == 2) + dataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true)); + + // assumes uniform sizes, for now + let sizes = size.values(u, seriesIdx, idx0, idx1); + + if (size.unit == 2) + barWid = sizes[0] * xDim; + else + barWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0) + + colWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid); + + let gapWid = colWid - barWid; + fullGap = gapWid + extraGap; + } + else { + colWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid); + + let gapWid = colWid * gapFactor; + + fullGap = gapWid + extraGap; + barWid = colWid - fullGap; + } + + if (fullGap < 1) + fullGap = 0; + + if (strokeWidth >= barWid / 2) + strokeWidth = 0; + + // for small gaps, disable pixel snapping since gap inconsistencies become noticible and annoying + if (fullGap < 5) + pxRound = retArg0; + + let insetStroke = fullGap > 0; + + let rawBarWid = colWid - fullGap - (insetStroke ? strokeWidth : 0); + + barWid = pxRound(clamp(rawBarWid, minWidth, maxWidth)); + + xShift = (_align == 0 ? barWid / 2 : _align == _dirX ? 0 : barWid) - _align * _dirX * ((_align == 0 ? extraGap / 2 : 0) + (insetStroke ? strokeWidth / 2 : 0)); + + + const _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: 0}; // disp, geom + + const stroke = multiPath ? null : new Path2D(); + + let dataY0 = null; + + if (band != null) + dataY0 = u.data[band.series[1]]; + else { + let { y0, y1 } = disp; + + if (y0 != null && y1 != null) { + dataY = y1.values(u, seriesIdx, idx0, idx1); + dataY0 = y0.values(u, seriesIdx, idx0, idx1); + } + } + + let radVal = valRadius * barWid; + let radBase = baseRadius * barWid; + + for (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) { + let yVal = dataY[i]; + + if (yVal == null) + continue; + + if (dataY0 != null) { + let yVal0 = dataY0[i] ?? 0; + + if (yVal - yVal0 == 0) + continue; + + fillToY = valToPosY(yVal0, scaleY, yDim, yOff); + } + + let xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i; + + // TODO: all xPos can be pre-computed once for all series in aligned set + let xPos = valToPosX(xVal, scaleX, xDim, xOff); + let yPos = valToPosY(ifNull(yVal, fillTo), scaleY, yDim, yOff); + + let lft = pxRound(xPos - xShift); + let btm = pxRound(max(yPos, fillToY)); + let top = pxRound(min(yPos, fillToY)); + // this includes the stroke + let barHgt = btm - top; + + if (yVal != null) { // && yVal != fillTo (0 height bar) + let rv = yVal < 0 ? radBase : radVal; + let rb = yVal < 0 ? radVal : radBase; + + if (multiPath) { + if (strokeWidth > 0 && strokeColors[i] != null) + rect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + + if (fillColors[i] != null) + rect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + } + else + rect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + + each(u, seriesIdx, i, + lft - strokeWidth / 2, + top, + barWid + strokeWidth, + barHgt, + ); + } + } + + if (strokeWidth > 0) + _paths.stroke = multiPath ? strokePaths : stroke; + else if (!multiPath) { + _paths._fill = series.width == 0 ? series._fill : series._stroke ?? series._fill; + _paths.width = 0; + } + + _paths.fill = multiPath ? fillPaths : stroke; + + return _paths; + }); + }; +} + +function splineInterp(interp, opts) { + const alignGaps = ifNull(opts?.alignGaps, 0); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + [idx0, idx1] = nonNullIdxs(dataY, idx0, idx1); + + let pxRound = series.pxRound; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let moveTo, bezierCurveTo, lineTo; + + if (scaleX.ori == 0) { + moveTo = moveToH; + lineTo = lineToH; + bezierCurveTo = bezierCurveToH; + } + else { + moveTo = moveToV; + lineTo = lineToV; + bezierCurveTo = bezierCurveToV; + } + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + let firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + let prevXPos = firstXPos; + + let xCoords = []; + let yCoords = []; + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal = dataY[i]; + + if (yVal != null) { + let xVal = dataX[i]; + let xPos = pixelForX(xVal); + + xCoords.push(prevXPos = xPos); + yCoords.push(pixelForY(dataY[i])); + } + } + + const _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillTo); + + lineTo(fill, prevXPos, fillToY); + lineTo(fill, firstXPos, fillToY); + } + + if (!series.spanGaps) { + // console.time('gaps'); + let gaps = []; + + gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + + // if FEAT_PATHS: false in rollup.config.js + // u.ctx.save(); + // u.ctx.beginPath(); + // u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height); + // u.ctx.clip(); + // u.ctx.strokeStyle = u.series[sidx].stroke; + // u.ctx.stroke(stroke); + // u.ctx.fillStyle = u.series[sidx].fill; + // u.ctx.fill(fill); + // u.ctx.restore(); + // return null; + }); + }; +} + +function monotoneCubic(opts) { + return splineInterp(_monotoneCubic, opts); +} + +// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation: +// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369 +function _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) { + const n = xs.length; + + if (n < 2) + return null; + + const path = new Path2D(); + + moveTo(path, xs[0], ys[0]); + + if (n == 2) + lineTo(path, xs[1], ys[1]); + else { + let ms = Array(n), + ds = Array(n - 1), + dys = Array(n - 1), + dxs = Array(n - 1); + + // calc deltas and derivative + for (let i = 0; i < n - 1; i++) { + dys[i] = ys[i + 1] - ys[i]; + dxs[i] = xs[i + 1] - xs[i]; + ds[i] = dys[i] / dxs[i]; + } + + // determine desired slope (m) at each point using Fritsch-Carlson method + // http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation + ms[0] = ds[0]; + + for (let i = 1; i < n - 1; i++) { + if (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) + ms[i] = 0; + else { + ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ( + (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + + (dxs[i] + 2 * dxs[i - 1]) / ds[i] + ); + + if (!isFinite(ms[i])) + ms[i] = 0; + } + } + + ms[n - 1] = ds[n - 2]; + + for (let i = 0; i < n - 1; i++) { + bezierCurveTo( + path, + xs[i] + dxs[i] / 3, + ys[i] + ms[i] * dxs[i] / 3, + xs[i + 1] - dxs[i] / 3, + ys[i + 1] - ms[i + 1] * dxs[i] / 3, + xs[i + 1], + ys[i + 1], + ); + } + } + + return path; +} + +const cursorPlots = new Set(); + +function invalidateRects() { + for (let u of cursorPlots) + u.syncRect(true); +} + +if (domEnv) { + on(resize, win, invalidateRects); + on(scroll, win, invalidateRects, true); + on(dppxchange, win, () => { uPlot.pxRatio = pxRatio; }); +} + +const linearPath = linear() ; +const pointsPath = points() ; + +function setDefaults(d, xo, yo, initY) { + let d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1)); + return d2.map((o, i) => setDefault(o, i, xo, yo)); +} + +function setDefaults2(d, xyo) { + return d.map((o, i) => i == 0 ? {} : assign({}, xyo, o)); // todo: assign() will not merge facet arrays +} + +function setDefault(o, i, xo, yo) { + return assign({}, (i == 0 ? xo : yo), o); +} + +function snapNumX(self, dataMin, dataMax) { + return dataMin == null ? nullNullTuple : [dataMin, dataMax]; +} + +const snapTimeX = snapNumX; + +// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below +// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value +function snapNumY(self, dataMin, dataMax) { + return dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true); +} + +function snapLogY(self, dataMin, dataMax, scale) { + return dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false); +} + +const snapLogX = snapLogY; + +function snapAsinhY(self, dataMin, dataMax, scale) { + return dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false); +} + +const snapAsinhX = snapAsinhY; + +// dim is logical (getClientBoundingRect) pixels, not canvas pixels +function findIncr(minVal, maxVal, incrs, dim, minSpace) { + let intDigits = max(numIntDigits(minVal), numIntDigits(maxVal)); + + let delta = maxVal - minVal; + + let incrIdx = closestIdx((minSpace / dim) * delta, incrs); + + do { + let foundIncr = incrs[incrIdx]; + let foundSpace = dim * foundIncr / delta; + + if (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17) + return [foundIncr, foundSpace]; + } while (++incrIdx < incrs.length); + + return [0, 0]; +} + +function pxRatioFont(font) { + let fontSize, fontSizeCss; + font = font.replace(/(\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px'); + return [font, fontSize, fontSizeCss]; +} + +function syncFontSize(axis) { + if (axis.show) { + [axis.font, axis.labelFont].forEach(f => { + let size = roundDec(f[2] * pxRatio, 1); + f[0] = f[0].replace(/[0-9.]+px/, size + 'px'); + f[1] = size; + }); + } +} + +function uPlot(opts, data, then) { + const self = { + mode: ifNull(opts.mode, 1), + }; + + const mode = self.mode; + + function getHPos(val, scale, dim, off) { + let pct = scale.valToPct(val); + return off + dim * (scale.dir == -1 ? (1 - pct) : pct); + } + + function getVPos(val, scale, dim, off) { + let pct = scale.valToPct(val); + return off + dim * (scale.dir == -1 ? pct : (1 - pct)); + } + + function getPos(val, scale, dim, off) { + return scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off); + } + + self.valToPosH = getHPos; + self.valToPosV = getVPos; + + let ready = false; + self.status = 0; + + const root = self.root = placeDiv(UPLOT); + + if (opts.id != null) + root.id = opts.id; + + addClass(root, opts.class); + + if (opts.title) { + let title = placeDiv(TITLE, root); + title.textContent = opts.title; + } + + const can = placeTag("canvas"); + const ctx = self.ctx = can.getContext("2d"); + + const wrap = placeDiv(WRAP, root); + + on("click", wrap, e => { + if (e.target === over) { + let didDrag = mouseLeft1 != mouseLeft0 || mouseTop1 != mouseTop0; + didDrag && drag.click(self, e); + } + }, true); + + const under = self.under = placeDiv(UNDER, wrap); + wrap.appendChild(can); + const over = self.over = placeDiv(OVER, wrap); + + opts = copy(opts); + + const pxAlign = +ifNull(opts.pxAlign, 1); + + const pxRound = pxRoundGen(pxAlign); + + (opts.plugins || []).forEach(p => { + if (p.opts) + opts = p.opts(self, opts) || opts; + }); + + const ms = opts.ms || 1e-3; + + const series = self.series = mode == 1 ? + setDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) : + setDefaults2(opts.series || [null], xySeriesOpts); + const axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true); + const scales = self.scales = {}; + const bands = self.bands = opts.bands || []; + + bands.forEach(b => { + b.fill = fnOrSelf(b.fill || null); + b.dir = ifNull(b.dir, -1); + }); + + const xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale; + + const drawOrderMap = { + axes: drawAxesGrid, + series: drawSeries, + }; + + const drawOrder = (opts.drawOrder || ["axes", "series"]).map(key => drawOrderMap[key]); + + function initValToPct(sc) { + const getVal = ( + sc.distr == 3 ? val => log10(val > 0 ? val : sc.clamp(self, val, sc.min, sc.max, sc.key)) : + sc.distr == 4 ? val => asinh(val, sc.asinh) : + sc.distr == 100 ? val => sc.fwd(val) : + val => val + ); + + return val => { + let _val = getVal(val); + let { _min, _max } = sc; + let delta = _max - _min; + return (_val - _min) / delta; + }; + } + + function initScale(scaleKey) { + let sc = scales[scaleKey]; + + if (sc == null) { + let scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ; + + if (scaleOpts.from != null) { + // ensure parent is initialized + initScale(scaleOpts.from); + // dependent scales inherit + let sc = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey}); + sc.valToPct = initValToPct(sc); + scales[scaleKey] = sc; + } + else { + sc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts); + + sc.key = scaleKey; + + let isTime = sc.time; + + let rn = sc.range; + + let rangeIsArr = isArr(rn); + + if (scaleKey != xScaleKey || (mode == 2 && !isTime)) { + // if range array has null limits, it should be auto + if (rangeIsArr && (rn[0] == null || rn[1] == null)) { + rn = { + min: rn[0] == null ? autoRangePart : { + mode: 1, + hard: rn[0], + soft: rn[0], + }, + max: rn[1] == null ? autoRangePart : { + mode: 1, + hard: rn[1], + soft: rn[1], + }, + }; + rangeIsArr = false; + } + + if (!rangeIsArr && isObj(rn)) { + let cfg = rn; + // this is similar to snapNumY + rn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg); + } + } + + sc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ? + (sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) : + (sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY) + )); + + sc.auto = fnOrSelf(rangeIsArr ? false : sc.auto); + + sc.clamp = fnOrSelf(sc.clamp || clampScale); + + // caches for expensive ops like asinh() & log() + sc._min = sc._max = null; + + sc.valToPct = initValToPct(sc); + } + } + } + + initScale("x"); + initScale("y"); + + // TODO: init scales from facets in mode: 2 + if (mode == 1) { + series.forEach(s => { + initScale(s.scale); + }); + } + + axes.forEach(a => { + initScale(a.scale); + }); + + for (let k in opts.scales) + initScale(k); + + const scaleX = scales[xScaleKey]; + + const xScaleDistr = scaleX.distr; + + let valToPosX, valToPosY; + + if (scaleX.ori == 0) { + addClass(root, ORI_HZ); + valToPosX = getHPos; + valToPosY = getVPos; + /* + updOriDims = () => { + xDimCan = plotWid; + xOffCan = plotLft; + yDimCan = plotHgt; + yOffCan = plotTop; + + xDimCss = plotWidCss; + xOffCss = plotLftCss; + yDimCss = plotHgtCss; + yOffCss = plotTopCss; + }; + */ + } + else { + addClass(root, ORI_VT); + valToPosX = getVPos; + valToPosY = getHPos; + /* + updOriDims = () => { + xDimCan = plotHgt; + xOffCan = plotTop; + yDimCan = plotWid; + yOffCan = plotLft; + + xDimCss = plotHgtCss; + xOffCss = plotTopCss; + yDimCss = plotWidCss; + yOffCss = plotLftCss; + }; + */ + } + + const pendScales = {}; + + // explicitly-set initial scales + for (let k in scales) { + let sc = scales[k]; + + if (sc.min != null || sc.max != null) { + pendScales[k] = {min: sc.min, max: sc.max}; + sc.min = sc.max = null; + } + } + +// self.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone; + const _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms)))); + const _fmtDate = (opts.fmtDate || fmtDate); + + const _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate)); + const _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate)); + const _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate)); + + const activeIdxs = []; + + const legend = (self.legend = assign({}, legendOpts, opts.legend)); + const cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor)); + const showLegend = legend.show; + const showCursor = cursor.show; + const markers = legend.markers; + + { + legend.idxs = activeIdxs; + + markers.width = fnOrSelf(markers.width); + markers.dash = fnOrSelf(markers.dash); + markers.stroke = fnOrSelf(markers.stroke); + markers.fill = fnOrSelf(markers.fill); + } + + let legendTable; + let legendHead; + let legendBody; + let legendRows = []; + let legendCells = []; + let legendCols; + let multiValLegend = false; + let NULL_LEGEND_VALUES = {}; + + if (legend.live) { + const getMultiVals = series[1] ? series[1].values : null; + multiValLegend = getMultiVals != null; + legendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0}; + + for (let k in legendCols) + NULL_LEGEND_VALUES[k] = LEGEND_DISP; + } + + if (showLegend) { + legendTable = placeTag("table", LEGEND, root); + legendBody = placeTag("tbody", null, legendTable); + + // allows legend to be moved out of root + legend.mount(self, legendTable); + + if (multiValLegend) { + legendHead = placeTag("thead", null, legendTable, legendBody); + + let head = placeTag("tr", null, legendHead); + placeTag("th", null, head); + + for (var key in legendCols) + placeTag("th", LEGEND_LABEL, head).textContent = key; + } + else { + addClass(legendTable, LEGEND_INLINE); + legend.live && addClass(legendTable, LEGEND_LIVE); + } + } + + const son = {show: true}; + const soff = {show: false}; + + function initLegendRow(s, i) { + if (i == 0 && (multiValLegend || !legend.live || mode == 2)) + return nullNullTuple; + + let cells = []; + + let row = placeTag("tr", LEGEND_SERIES, legendBody, legendBody.childNodes[i]); + + addClass(row, s.class); + + if (!s.show) + addClass(row, OFF); + + let label = placeTag("th", null, row); + + if (markers.show) { + let indic = placeDiv(LEGEND_MARKER, label); + + if (i > 0) { + let width = markers.width(self, i); + + if (width) + indic.style.border = width + "px " + markers.dash(self, i) + " " + markers.stroke(self, i); + + indic.style.background = markers.fill(self, i); + } + } + + let text = placeDiv(LEGEND_LABEL, label); + + if (s.label instanceof HTMLElement) + text.appendChild(s.label); + else + text.textContent = s.label; + + if (i > 0) { + if (!markers.show) + text.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i); + + onMouse("click", label, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + let seriesIdx = series.indexOf(s); + + if ((e.ctrlKey || e.metaKey) != legend.isolate) { + // if any other series is shown, isolate this one. else show all + let isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show); + + series.forEach((s, i) => { + i > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries); + }); + } + else + setSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries); + }, false); + + if (cursorFocus) { + onMouse(mouseenter, label, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + setSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries); + }, false); + } + } + + for (var key in legendCols) { + let v = placeTag("td", LEGEND_VALUE, row); + v.textContent = "--"; + cells.push(v); + } + + return [row, cells]; + } + + const mouseListeners = new Map(); + + function onMouse(ev, targ, fn, onlyTarg = true) { + const targListeners = mouseListeners.get(targ) || {}; + const listener = cursor.bind[ev](self, targ, fn, onlyTarg); + + if (listener) { + on(ev, targ, targListeners[ev] = listener); + mouseListeners.set(targ, targListeners); + } + } + + function offMouse(ev, targ, fn) { + const targListeners = mouseListeners.get(targ) || {}; + + for (let k in targListeners) { + if (ev == null || k == ev) { + off(k, targ, targListeners[k]); + delete targListeners[k]; + } + } + + if (ev == null) + mouseListeners.delete(targ); + } + + let fullWidCss = 0; + let fullHgtCss = 0; + + let plotWidCss = 0; + let plotHgtCss = 0; + + // plot margins to account for axes + let plotLftCss = 0; + let plotTopCss = 0; + + // previous values for diffing + let _plotLftCss = plotLftCss; + let _plotTopCss = plotTopCss; + let _plotWidCss = plotWidCss; + let _plotHgtCss = plotHgtCss; + + + let plotLft = 0; + let plotTop = 0; + let plotWid = 0; + let plotHgt = 0; + + self.bbox = {}; + + let shouldSetScales = false; + let shouldSetSize = false; + let shouldConvergeSize = false; + let shouldSetCursor = false; + let shouldSetSelect = false; + let shouldSetLegend = false; + + function _setSize(width, height, force) { + if (force || (width != self.width || height != self.height)) + calcSize(width, height); + + resetYSeries(false); + + shouldConvergeSize = true; + shouldSetSize = true; + + commit(); + } + + function calcSize(width, height) { + // log("calcSize()", arguments); + + self.width = fullWidCss = plotWidCss = width; + self.height = fullHgtCss = plotHgtCss = height; + plotLftCss = plotTopCss = 0; + + calcPlotRect(); + calcAxesRects(); + + let bb = self.bbox; + + plotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5); + plotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5); + plotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5); + plotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5); + + // updOriDims(); + } + + // ensures size calc convergence + const CYCLE_LIMIT = 3; + + function convergeSize() { + let converged = false; + + let cycleNum = 0; + + while (!converged) { + cycleNum++; + + let axesConverged = axesCalc(cycleNum); + let paddingConverged = paddingCalc(cycleNum); + + converged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged); + + if (!converged) { + calcSize(self.width, self.height); + shouldSetSize = true; + } + } + } + + function setSize({width, height}) { + _setSize(width, height); + } + + self.setSize = setSize; + + // accumulate axis offsets, reduce canvas width + function calcPlotRect() { + // easements for edge labels + let hasTopAxis = false; + let hasBtmAxis = false; + let hasRgtAxis = false; + let hasLftAxis = false; + + axes.forEach((axis, i) => { + if (axis.show && axis._show) { + let {side, _size} = axis; + let isVt = side % 2; + let labelSize = axis.label != null ? axis.labelSize : 0; + + let fullSize = _size + labelSize; + + if (fullSize > 0) { + if (isVt) { + plotWidCss -= fullSize; + + if (side == 3) { + plotLftCss += fullSize; + hasLftAxis = true; + } + else + hasRgtAxis = true; + } + else { + plotHgtCss -= fullSize; + + if (side == 0) { + plotTopCss += fullSize; + hasTopAxis = true; + } + else + hasBtmAxis = true; + } + } + } + }); + + sidesWithAxes[0] = hasTopAxis; + sidesWithAxes[1] = hasRgtAxis; + sidesWithAxes[2] = hasBtmAxis; + sidesWithAxes[3] = hasLftAxis; + + // hz padding + plotWidCss -= _padding[1] + _padding[3]; + plotLftCss += _padding[3]; + + // vt padding + plotHgtCss -= _padding[2] + _padding[0]; + plotTopCss += _padding[0]; + } + + function calcAxesRects() { + // will accum + + let off1 = plotLftCss + plotWidCss; + let off2 = plotTopCss + plotHgtCss; + // will accum - + let off3 = plotLftCss; + let off0 = plotTopCss; + + function incrOffset(side, size) { + switch (side) { + case 1: off1 += size; return off1 - size; + case 2: off2 += size; return off2 - size; + case 3: off3 -= size; return off3 + size; + case 0: off0 -= size; return off0 + size; + } + } + + axes.forEach((axis, i) => { + if (axis.show && axis._show) { + let side = axis.side; + + axis._pos = incrOffset(side, axis._size); + + if (axis.label != null) + axis._lpos = incrOffset(side, axis.labelSize); + } + }); + } + + if (cursor.dataIdx == null) { + let hov = cursor.hover; + + let skip = hov.skip = new Set(hov.skip ?? []); + skip.add(void 0); // alignment artifacts + let prox = hov.prox = fnOrSelf(hov.prox); + let bias = hov.bias ??= 0; + + // TODO: only scan between in-view idxs (i0, i1) + cursor.dataIdx = (self, seriesIdx, cursorIdx, valAtPosX) => { + if (seriesIdx == 0) + return cursorIdx; + + let idx2 = cursorIdx; + + let _prox = prox(self, seriesIdx, cursorIdx, valAtPosX) ?? inf; + let withProx = _prox >= 0 && _prox < inf; + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss; + let cursorLft = cursor.left; + + let xValues = data[0]; + let yValues = data[seriesIdx]; + + if (skip.has(yValues[cursorIdx])) { + idx2 = null; + + let nonNullLft = null, + nonNullRgt = null, + j; + + if (bias == 0 || bias == -1) { + j = cursorIdx; + while (nonNullLft == null && j-- > 0) { + if (!skip.has(yValues[j])) + nonNullLft = j; + } + } + + if (bias == 0 || bias == 1) { + j = cursorIdx; + while (nonNullRgt == null && j++ < yValues.length) { + if (!skip.has(yValues[j])) + nonNullRgt = j; + } + } + + if (nonNullLft != null || nonNullRgt != null) { + if (withProx) { + let lftPos = nonNullLft == null ? -Infinity : valToPosX(xValues[nonNullLft], scaleX, xDim, 0); + let rgtPos = nonNullRgt == null ? Infinity : valToPosX(xValues[nonNullRgt], scaleX, xDim, 0); + + let lftDelta = cursorLft - lftPos; + let rgtDelta = rgtPos - cursorLft; + + if (lftDelta <= rgtDelta) { + if (lftDelta <= _prox) + idx2 = nonNullLft; + } else { + if (rgtDelta <= _prox) + idx2 = nonNullRgt; + } + } + else { + idx2 = + nonNullRgt == null ? nonNullLft : + nonNullLft == null ? nonNullRgt : + cursorIdx - nonNullLft <= nonNullRgt - cursorIdx ? nonNullLft : nonNullRgt; + } + } + } + else if (withProx) { + let dist = abs(cursorLft - valToPosX(xValues[cursorIdx], scaleX, xDim, 0)); + + if (dist > _prox) + idx2 = null; + } + + return idx2; + }; + } + + const setCursorEvent = e => { cursor.event = e; }; + + cursor.idxs = activeIdxs; + + cursor._lock = false; + + let points = cursor.points; + + points.show = fnOrSelf(points.show); + points.size = fnOrSelf(points.size); + points.stroke = fnOrSelf(points.stroke); + points.width = fnOrSelf(points.width); + points.fill = fnOrSelf(points.fill); + + const focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus); + + const cursorFocus = focus.prox >= 0; + const cursorOnePt = cursorFocus && points.one; + + // series-intersection markers + let cursorPts = []; + // position caches in CSS pixels + let cursorPtsLft = []; + let cursorPtsTop = []; + + function initCursorPt(s, si) { + let pt = points.show(self, si); + + if (pt instanceof HTMLElement) { + addClass(pt, CURSOR_PT); + addClass(pt, s.class); + elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + over.insertBefore(pt, cursorPts[si]); + + return pt; + } + } + + function initSeries(s, i) { + if (mode == 1 || i > 0) { + let isTime = mode == 1 && scales[s.scale].time; + + let sv = s.value; + s.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal; + s.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel); + } + + if (cursorOnePt || i > 0) { + s.width = s.width == null ? 1 : s.width; + s.paths = s.paths || linearPath || retNull; + s.fillTo = fnOrSelf(s.fillTo || seriesFillTo); + s.pxAlign = +ifNull(s.pxAlign, pxAlign); + s.pxRound = pxRoundGen(s.pxAlign); + + s.stroke = fnOrSelf(s.stroke || null); + s.fill = fnOrSelf(s.fill || null); + s._stroke = s._fill = s._paths = s._focus = null; + + let _ptDia = ptDia(max(1, s.width), 1); + let points = s.points = assign({}, { + size: _ptDia, + width: max(1, _ptDia * .2), + stroke: s.stroke, + space: _ptDia * 2, + paths: pointsPath, + _stroke: null, + _fill: null, + }, s.points); + points.show = fnOrSelf(points.show); + points.filter = fnOrSelf(points.filter); + points.fill = fnOrSelf(points.fill); + points.stroke = fnOrSelf(points.stroke); + points.paths = fnOrSelf(points.paths); + points.pxAlign = s.pxAlign; + } + + if (showLegend) { + let rowCells = initLegendRow(s, i); + legendRows.splice(i, 0, rowCells[0]); + legendCells.splice(i, 0, rowCells[1]); + legend.values.push(null); // NULL_LEGEND_VALS not yet avil here :( + } + + if (showCursor) { + activeIdxs.splice(i, 0, null); + + let pt = null; + + if (cursorOnePt) { + if (i == 0) + pt = initCursorPt(s, i); + } + else if (i > 0) + pt = initCursorPt(s, i); + + cursorPts.splice(i, 0, pt); + cursorPtsLft.splice(i, 0, 0); + cursorPtsTop.splice(i, 0, 0); + } + + fire("addSeries", i); + } + + function addSeries(opts, si) { + si = si == null ? series.length : si; + + opts = mode == 1 ? setDefault(opts, si, xSeriesOpts, ySeriesOpts) : setDefault(opts, si, {}, xySeriesOpts); + + series.splice(si, 0, opts); + initSeries(series[si], si); + } + + self.addSeries = addSeries; + + function delSeries(i) { + series.splice(i, 1); + + if (showLegend) { + legend.values.splice(i, 1); + + legendCells.splice(i, 1); + let tr = legendRows.splice(i, 1)[0]; + offMouse(null, tr.firstChild); + tr.remove(); + } + + if (showCursor) { + activeIdxs.splice(i, 1); + cursorPts.splice(i, 1)[0].remove(); + cursorPtsLft.splice(i, 1); + cursorPtsTop.splice(i, 1); + } + + // TODO: de-init no-longer-needed scales? + + fire("delSeries", i); + } + + self.delSeries = delSeries; + + const sidesWithAxes = [false, false, false, false]; + + function initAxis(axis, i) { + axis._show = axis.show; + + if (axis.show) { + let isVt = axis.side % 2; + + let sc = scales[axis.scale]; + + // this can occur if all series specify non-default scales + if (sc == null) { + axis.scale = isVt ? series[1].scale : xScaleKey; + sc = scales[axis.scale]; + } + + // also set defaults for incrs & values based on axis distr + let isTime = sc.time; + + axis.size = fnOrSelf(axis.size); + axis.space = fnOrSelf(axis.space); + axis.rotate = fnOrSelf(axis.rotate); + + if (isArr(axis.incrs)) { + axis.incrs.forEach(incr => { + !fixedDec.has(incr) && fixedDec.set(incr, guessDec(incr)); + }); + } + + axis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs))); + axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits)); + + axis.stroke = fnOrSelf(axis.stroke); + axis.grid.stroke = fnOrSelf(axis.grid.stroke); + axis.ticks.stroke = fnOrSelf(axis.ticks.stroke); + axis.border.stroke = fnOrSelf(axis.border.stroke); + + let av = axis.values; + + axis.values = ( + // static array of tick values + isArr(av) && !isArr(av[0]) ? fnOrSelf(av) : + // temporal + isTime ? ( + // config array of fmtDate string tpls + isArr(av) ? + timeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) : + // fmtDate string tpl + isStr(av) ? + timeAxisVal(_tzDate, av) : + av || _timeAxisVals + ) : av || numAxisVals + ); + + axis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 && sc.log == 10 ? log10AxisValsFilt : sc.distr == 3 && sc.log == 2 ? log2AxisValsFilt : retArg1)); + + axis.font = pxRatioFont(axis.font); + axis.labelFont = pxRatioFont(axis.labelFont); + + axis._size = axis.size(self, null, i, 0); + + axis._space = + axis._rotate = + axis._incrs = + axis._found = // foundIncrSpace + axis._splits = + axis._values = null; + + if (axis._size > 0) { + sidesWithAxes[i] = true; + axis._el = placeDiv(AXIS, wrap); + } + + // debug + // axis._el.style.background = "#" + Math.floor(Math.random()*16777215).toString(16) + '80'; + } + } + + function autoPadSide(self, side, sidesWithAxes, cycleNum) { + let [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes; + + let ori = side % 2; + let size = 0; + + if (ori == 0 && (hasLftAxis || hasRgtAxis)) + size = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0); + if (ori == 1 && (hasTopAxis || hasBtmAxis)) + size = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0); + + return size; + } + + const padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide))); + const _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0)); + + let dataLen; + + // rendered data window + let i0 = null; + let i1 = null; + const idxs = mode == 1 ? series[0].idxs : null; + + let data0 = null; + + let viaAutoScaleX = false; + + function setData(_data, _resetScales) { + data = _data == null ? [] : _data; + + self.data = self._data = data; + + if (mode == 2) { + dataLen = 0; + for (let i = 1; i < series.length; i++) + dataLen += data[i][0].length; + } + else { + if (data.length == 0) + self.data = self._data = data = [[]]; + + data0 = data[0]; + dataLen = data0.length; + + let scaleData = data; + + if (xScaleDistr == 2) { + scaleData = data.slice(); + + let _data0 = scaleData[0] = Array(dataLen); + for (let i = 0; i < dataLen; i++) + _data0[i] = i; + } + + self._data = data = scaleData; + } + + resetYSeries(true); + + fire("setData"); + + // forces x axis tick values to re-generate when neither x scale nor y scale changes + // in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data + if (xScaleDistr == 2) { + shouldConvergeSize = true; + + /* or somewhat cheaper, and uglier: + if (ready) { + // logic extracted from axesCalc() + let i = 0; + let axis = axes[i]; + let _splits = axis._splits.map(i => data0[i]); + let [_incr, _space] = axis._found; + let incr = data0[_splits[1]] - data0[_splits[0]]; + axis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr); + } + */ + } + + if (_resetScales !== false) { + let xsc = scaleX; + + if (xsc.auto(self, viaAutoScaleX)) + autoScaleX(); + else + _setScale(xScaleKey, xsc.min, xsc.max); + + shouldSetCursor = shouldSetCursor || cursor.left >= 0; + shouldSetLegend = true; + commit(); + } + } + + self.setData = setData; + + function autoScaleX() { + viaAutoScaleX = true; + + let _min, _max; + + if (mode == 1) { + if (dataLen > 0) { + i0 = idxs[0] = 0; + i1 = idxs[1] = dataLen - 1; + + _min = data[0][i0]; + _max = data[0][i1]; + + if (xScaleDistr == 2) { + _min = i0; + _max = i1; + } + else if (_min == _max) { + if (xScaleDistr == 3) + [_min, _max] = rangeLog(_min, _min, scaleX.log, false); + else if (xScaleDistr == 4) + [_min, _max] = rangeAsinh(_min, _min, scaleX.log, false); + else if (scaleX.time) + _max = _min + round(86400 / ms); + else + [_min, _max] = rangeNum(_min, _max, rangePad, true); + } + } + else { + i0 = idxs[0] = _min = null; + i1 = idxs[1] = _max = null; + } + } + + _setScale(xScaleKey, _min, _max); + } + + let ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline; + let ctxAlpha; + + function setCtxStyle(stroke, width, dash, cap, fill, join) { + stroke ??= transparent; + dash ??= EMPTY_ARR; + cap ??= "butt"; // (‿|‿) + fill ??= transparent; + join ??= "round"; + + if (stroke != ctxStroke) + ctx.strokeStyle = ctxStroke = stroke; + if (fill != ctxFill) + ctx.fillStyle = ctxFill = fill; + if (width != ctxWidth) + ctx.lineWidth = ctxWidth = width; + if (join != ctxJoin) + ctx.lineJoin = ctxJoin = join; + if (cap != ctxCap) + ctx.lineCap = ctxCap = cap; + if (dash != ctxDash) + ctx.setLineDash(ctxDash = dash); + } + + function setFontStyle(font, fill, align, baseline) { + if (fill != ctxFill) + ctx.fillStyle = ctxFill = fill; + if (font != ctxFont) + ctx.font = ctxFont = font; + if (align != ctxAlign) + ctx.textAlign = ctxAlign = align; + if (baseline != ctxBaseline) + ctx.textBaseline = ctxBaseline = baseline; + } + + function accScale(wsc, psc, facet, data, sorted = 0) { + if (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) { + let _i0 = ifNull(i0, 0); + let _i1 = ifNull(i1, data.length - 1); + + // only run getMinMax() for invalidated series data, else reuse + let minMax = facet.min == null ? getMinMax(data, _i0, _i1, sorted, wsc.distr == 3) : [facet.min, facet.max]; + + // initial min/max + wsc.min = min(wsc.min, facet.min = minMax[0]); + wsc.max = max(wsc.max, facet.max = minMax[1]); + } + } + + const AUTOSCALE = {min: null, max: null}; + + function setScales() { + // log("setScales()", arguments); + + // implicitly add auto scales, and unranged scales + for (let k in scales) { + let sc = scales[k]; + + if (pendScales[k] == null && + ( + // scales that have never been set (on init) + sc.min == null || + // or auto scales when the x scale was explicitly set + pendScales[xScaleKey] != null && sc.auto(self, viaAutoScaleX) + ) + ) { + pendScales[k] = AUTOSCALE; + } + } + + // implicitly add dependent scales + for (let k in scales) { + let sc = scales[k]; + + if (pendScales[k] == null && sc.from != null && pendScales[sc.from] != null) + pendScales[k] = AUTOSCALE; + } + + // explicitly setting the x-scale invalidates everything (acts as redraw) + if (pendScales[xScaleKey] != null) + resetYSeries(true); // TODO: only reset series on auto scales? + + let wipScales = {}; + + for (let k in pendScales) { + let psc = pendScales[k]; + + if (psc != null) { + let wsc = wipScales[k] = copy(scales[k], fastIsObj); + + if (psc.min != null) + assign(wsc, psc); + else if (k != xScaleKey || mode == 2) { + if (dataLen == 0 && wsc.from == null) { + let minMax = wsc.range(self, null, null, k); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + else { + wsc.min = inf; + wsc.max = -inf; + } + } + } + } + + if (dataLen > 0) { + // pre-range y-scales from y series' data values + series.forEach((s, i) => { + if (mode == 1) { + let k = s.scale; + let psc = pendScales[k]; + + if (psc == null) + return; + + let wsc = wipScales[k]; + + if (i == 0) { + let minMax = wsc.range(self, wsc.min, wsc.max, k); + + wsc.min = minMax[0]; + wsc.max = minMax[1]; + + i0 = closestIdx(wsc.min, data[0]); + i1 = closestIdx(wsc.max, data[0]); + + // don't try to contract same or adjacent idxs + if (i1 - i0 > 1) { + // closest indices can be outside of view + if (data[0][i0] < wsc.min) + i0++; + if (data[0][i1] > wsc.max) + i1--; + } + + s.min = data0[i0]; + s.max = data0[i1]; + } + else if (s.show && s.auto) + accScale(wsc, psc, s, data[i], s.sorted); + + s.idxs[0] = i0; + s.idxs[1] = i1; + } + else { + if (i > 0) { + if (s.show && s.auto) { + // TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale + let [ xFacet, yFacet ] = s.facets; + let xScaleKey = xFacet.scale; + let yScaleKey = yFacet.scale; + let [ xData, yData ] = data[i]; + + let wscx = wipScales[xScaleKey]; + let wscy = wipScales[yScaleKey]; + + // null can happen when only x is zoomed, but y has static range and doesnt get auto-added to pending + wscx != null && accScale(wscx, pendScales[xScaleKey], xFacet, xData, xFacet.sorted); + wscy != null && accScale(wscy, pendScales[yScaleKey], yFacet, yData, yFacet.sorted); + + // temp + s.min = yFacet.min; + s.max = yFacet.max; + } + } + } + }); + + // range independent scales + for (let k in wipScales) { + let wsc = wipScales[k]; + let psc = pendScales[k]; + + if (wsc.from == null && (psc == null || psc.min == null)) { + let minMax = wsc.range( + self, + wsc.min == inf ? null : wsc.min, + wsc.max == -inf ? null : wsc.max, + k + ); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + } + } + + // range dependent scales + for (let k in wipScales) { + let wsc = wipScales[k]; + + if (wsc.from != null) { + let base = wipScales[wsc.from]; + + if (base.min == null) + wsc.min = wsc.max = null; + else { + let minMax = wsc.range(self, base.min, base.max, k); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + } + } + + let changed = {}; + let anyChanged = false; + + for (let k in wipScales) { + let wsc = wipScales[k]; + let sc = scales[k]; + + if (sc.min != wsc.min || sc.max != wsc.max) { + sc.min = wsc.min; + sc.max = wsc.max; + + let distr = sc.distr; + + sc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : distr == 100 ? sc.fwd(sc.min) : sc.min; + sc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : distr == 100 ? sc.fwd(sc.max) : sc.max; + + changed[k] = anyChanged = true; + } + } + + if (anyChanged) { + // invalidate paths of all series on changed scales + series.forEach((s, i) => { + if (mode == 2) { + if (i > 0 && changed.y) + s._paths = null; + } + else { + if (changed[s.scale]) + s._paths = null; + } + }); + + for (let k in changed) { + shouldConvergeSize = true; + fire("setScale", k); + } + + if (showCursor && cursor.left >= 0) + shouldSetCursor = shouldSetLegend = true; + } + + for (let k in pendScales) + pendScales[k] = null; + } + + // grabs the nearest indices with y data outside of x-scale limits + function getOuterIdxs(ydata) { + let _i0 = clamp(i0 - 1, 0, dataLen - 1); + let _i1 = clamp(i1 + 1, 0, dataLen - 1); + + while (ydata[_i0] == null && _i0 > 0) + _i0--; + + while (ydata[_i1] == null && _i1 < dataLen - 1) + _i1++; + + return [_i0, _i1]; + } + + function drawSeries() { + if (dataLen > 0) { + let shouldAlpha = series.some(s => s._focus) && ctxAlpha != focus.alpha; + + if (shouldAlpha) + ctx.globalAlpha = ctxAlpha = focus.alpha; + + series.forEach((s, i) => { + if (i > 0 && s.show) { + cacheStrokeFill(i, false); + cacheStrokeFill(i, true); + + if (s._paths == null) { + let _ctxAlpha = ctxAlpha; + + if (ctxAlpha != s.alpha) + ctx.globalAlpha = ctxAlpha = s.alpha; + + let _idxs = mode == 2 ? [0, data[i][0].length - 1] : getOuterIdxs(data[i]); + s._paths = s.paths(self, i, _idxs[0], _idxs[1]); + + if (ctxAlpha != _ctxAlpha) + ctx.globalAlpha = ctxAlpha = _ctxAlpha; + } + } + }); + + series.forEach((s, i) => { + if (i > 0 && s.show) { + let _ctxAlpha = ctxAlpha; + + if (ctxAlpha != s.alpha) + ctx.globalAlpha = ctxAlpha = s.alpha; + + s._paths != null && drawPath(i, false); + + { + let _gaps = s._paths != null ? s._paths.gaps : null; + + let show = s.points.show(self, i, i0, i1, _gaps); + let idxs = s.points.filter(self, i, show, _gaps); + + if (show || idxs) { + s.points._paths = s.points.paths(self, i, i0, i1, idxs); + drawPath(i, true); + } + } + + if (ctxAlpha != _ctxAlpha) + ctx.globalAlpha = ctxAlpha = _ctxAlpha; + + fire("drawSeries", i); + } + }); + + if (shouldAlpha) + ctx.globalAlpha = ctxAlpha = 1; + } + } + + function cacheStrokeFill(si, _points) { + let s = _points ? series[si].points : series[si]; + + s._stroke = s.stroke(self, si); + s._fill = s.fill(self, si); + } + + function drawPath(si, _points) { + let s = _points ? series[si].points : series[si]; + + let { + stroke, + fill, + clip: gapsClip, + flags, + + _stroke: strokeStyle = s._stroke, + _fill: fillStyle = s._fill, + _width: width = s.width, + } = s._paths; + + width = roundDec(width * pxRatio, 3); + + let boundsClip = null; + let offset = (width % 2) / 2; + + if (_points && fillStyle == null) + fillStyle = width > 0 ? "#fff" : strokeStyle; + + let _pxAlign = s.pxAlign == 1 && offset > 0; + + _pxAlign && ctx.translate(offset, offset); + + if (!_points) { + let lft = plotLft - width / 2, + top = plotTop - width / 2, + wid = plotWid + width, + hgt = plotHgt + width; + + boundsClip = new Path2D(); + boundsClip.rect(lft, top, wid, hgt); + } + + // the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size + if (_points) + strokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip); + else + fillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip); + + _pxAlign && ctx.translate(-offset, -offset); + } + + function fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) { + let didStrokeFill = false; + + // for all bands where this series is the top edge, create upwards clips using the bottom edges + // and apply clips + fill with band fill or dfltFill + flags != 0 && bands.forEach((b, bi) => { + // isUpperEdge? + if (b.series[0] == si) { + let lowerEdge = series[b.series[1]]; + let lowerData = data[b.series[1]]; + + let bandClip = (lowerEdge._paths || EMPTY_OBJ).band; + + if (isArr(bandClip)) + bandClip = b.dir == 1 ? bandClip[0] : bandClip[1]; + + let gapsClip2; + + let _fillStyle = null; + + // hasLowerEdge? + if (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) { + _fillStyle = b.fill(self, bi) || fillStyle; + gapsClip2 = lowerEdge._paths.clip; + } + else + bandClip = null; + + strokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip); + + didStrokeFill = true; + } + }); + + if (!didStrokeFill) + strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip); + } + + const CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE; + + function strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) { + setCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle); + + if (boundsClip || gapsClip || bandClip) { + ctx.save(); + boundsClip && ctx.clip(boundsClip); + gapsClip && ctx.clip(gapsClip); + } + + if (bandClip) { + if ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) { + ctx.clip(bandClip); + gapsClip2 && ctx.clip(gapsClip2); + doFill(fillStyle, fillPath); + doStroke(strokeStyle, strokePath, lineWidth); + } + else if (flags & BAND_CLIP_STROKE) { + doFill(fillStyle, fillPath); + ctx.clip(bandClip); + doStroke(strokeStyle, strokePath, lineWidth); + } + else if (flags & BAND_CLIP_FILL) { + ctx.save(); + ctx.clip(bandClip); + gapsClip2 && ctx.clip(gapsClip2); + doFill(fillStyle, fillPath); + ctx.restore(); + doStroke(strokeStyle, strokePath, lineWidth); + } + } + else { + doFill(fillStyle, fillPath); + doStroke(strokeStyle, strokePath, lineWidth); + } + + if (boundsClip || gapsClip || bandClip) + ctx.restore(); + } + + function doStroke(strokeStyle, strokePath, lineWidth) { + if (lineWidth > 0) { + if (strokePath instanceof Map) { + strokePath.forEach((strokePath, strokeStyle) => { + ctx.strokeStyle = ctxStroke = strokeStyle; + ctx.stroke(strokePath); + }); + } + else + strokePath != null && strokeStyle && ctx.stroke(strokePath); + } + } + + function doFill(fillStyle, fillPath) { + if (fillPath instanceof Map) { + fillPath.forEach((fillPath, fillStyle) => { + ctx.fillStyle = ctxFill = fillStyle; + ctx.fill(fillPath); + }); + } + else + fillPath != null && fillStyle && ctx.fill(fillPath); + } + + function getIncrSpace(axisIdx, min, max, fullDim) { + let axis = axes[axisIdx]; + + let incrSpace; + + if (fullDim <= 0) + incrSpace = [0, 0]; + else { + let minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim); + let incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace); + incrSpace = findIncr(min, max, incrs, fullDim, minSpace); + } + + return (axis._found = incrSpace); + } + + function drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) { + let offset = (width % 2) / 2; + + pxAlign == 1 && ctx.translate(offset, offset); + + setCtxStyle(stroke, width, dash, cap, stroke); + + ctx.beginPath(); + + let x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len); + + if (ori == 0) { + y0 = pos0; + y1 = pos1; + } + else { + x0 = pos0; + x1 = pos1; + } + + for (let i = 0; i < offs.length; i++) { + if (filts[i] != null) { + if (ori == 0) + x0 = x1 = offs[i]; + else + y0 = y1 = offs[i]; + + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + } + } + + ctx.stroke(); + + pxAlign == 1 && ctx.translate(-offset, -offset); + } + + function axesCalc(cycleNum) { + // log("axesCalc()", arguments); + + let converged = true; + + axes.forEach((axis, i) => { + if (!axis.show) + return; + + let scale = scales[axis.scale]; + + if (scale.min == null) { + if (axis._show) { + converged = false; + axis._show = false; + resetYSeries(false); + } + return; + } + else { + if (!axis._show) { + converged = false; + axis._show = true; + resetYSeries(false); + } + } + + let side = axis.side; + let ori = side % 2; + + let {min, max} = scale; // // should this toggle them ._show = false + + let [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss); + + if (_space == 0) + return; + + // if we're using index positions, force first tick to match passed index + let forceMin = scale.distr == 2; + + let _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin); + + // tick labels + // BOO this assumes a specific data/series + let splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits; + let incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr; + + let values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr); + + // rotating of labels only supported on bottom x axis + axis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0; + + let oldSize = axis._size; + + axis._size = ceil(axis.size(self, values, i, cycleNum)); + + if (oldSize != null && axis._size != oldSize) // ready && ? + converged = false; + }); + + return converged; + } + + function paddingCalc(cycleNum) { + let converged = true; + + padding.forEach((p, i) => { + let _p = p(self, i, sidesWithAxes, cycleNum); + + if (_p != _padding[i]) + converged = false; + + _padding[i] = _p; + }); + + return converged; + } + + function drawAxesGrid() { + for (let i = 0; i < axes.length; i++) { + let axis = axes[i]; + + if (!axis.show || !axis._show) + continue; + + let side = axis.side; + let ori = side % 2; + + let x, y; + + let fillStyle = axis.stroke(self, i); + + let shiftDir = side == 0 || side == 3 ? -1 : 1; + + let [_incr, _space] = axis._found; + + // axis label + if (axis.label != null) { + let shiftAmt = axis.labelGap * shiftDir; + let baseLpos = round((axis._lpos + shiftAmt) * pxRatio); + + setFontStyle(axis.labelFont[0], fillStyle, "center", side == 2 ? TOP : BOTTOM); + + ctx.save(); + + if (ori == 1) { + x = y = 0; + + ctx.translate( + baseLpos, + round(plotTop + plotHgt / 2), + ); + ctx.rotate((side == 3 ? -PI : PI) / 2); + + } + else { + x = round(plotLft + plotWid / 2); + y = baseLpos; + } + + let _label = isFn(axis.label) ? axis.label(self, i, _incr, _space) : axis.label; + + ctx.fillText(_label, x, y); + + ctx.restore(); + } + + if (_space == 0) + continue; + + let scale = scales[axis.scale]; + + let plotDim = ori == 0 ? plotWid : plotHgt; + let plotOff = ori == 0 ? plotLft : plotTop; + + let _splits = axis._splits; + + // tick labels + // BOO this assumes a specific data/series + let splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits; + let incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr; + + let ticks = axis.ticks; + let border = axis.border; + let _tickSize = ticks.show ? ticks.size : 0; + let tickSize = round(_tickSize * pxRatio); + let axisGap = round((axis.alignTo == 2 ? axis._size - _tickSize - axis.gap : axis.gap) * pxRatio); + + // rotating of labels only supported on bottom x axis + let angle = axis._rotate * -PI/180; + + let basePos = pxRound(axis._pos * pxRatio); + let shiftAmt = (tickSize + axisGap) * shiftDir; + let finalPos = basePos + shiftAmt; + y = ori == 0 ? finalPos : 0; + x = ori == 1 ? finalPos : 0; + + let font = axis.font[0]; + let textAlign = axis.align == 1 ? LEFT : + axis.align == 2 ? RIGHT : + angle > 0 ? LEFT : + angle < 0 ? RIGHT : + ori == 0 ? "center" : side == 3 ? RIGHT : LEFT; + let textBaseline = angle || + ori == 1 ? "middle" : side == 2 ? TOP : BOTTOM; + + setFontStyle(font, fillStyle, textAlign, textBaseline); + + let lineHeight = axis.font[1] * axis.lineGap; + + let canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff))); + + let _values = axis._values; + + for (let i = 0; i < _values.length; i++) { + let val = _values[i]; + + if (val != null) { + if (ori == 0) + x = canOffs[i]; + else + y = canOffs[i]; + + val = "" + val; + + let _parts = val.indexOf("\n") == -1 ? [val] : val.split(/\n/gm); + + for (let j = 0; j < _parts.length; j++) { + let text = _parts[j]; + + if (angle) { + ctx.save(); + ctx.translate(x, y + j * lineHeight); // can this be replaced with position math? + ctx.rotate(angle); // can this be done once? + ctx.fillText(text, 0, 0); + ctx.restore(); + } + else + ctx.fillText(text, x, y + j * lineHeight); + } + } + } + + // ticks + if (ticks.show) { + drawOrthoLines( + canOffs, + ticks.filter(self, splits, i, _space, incr), + ori, + side, + basePos, + tickSize, + roundDec(ticks.width * pxRatio, 3), + ticks.stroke(self, i), + ticks.dash, + ticks.cap, + ); + } + + // grid + let grid = axis.grid; + + if (grid.show) { + drawOrthoLines( + canOffs, + grid.filter(self, splits, i, _space, incr), + ori, + ori == 0 ? 2 : 1, + ori == 0 ? plotTop : plotLft, + ori == 0 ? plotHgt : plotWid, + roundDec(grid.width * pxRatio, 3), + grid.stroke(self, i), + grid.dash, + grid.cap, + ); + } + + if (border.show) { + drawOrthoLines( + [basePos], + [1], + ori == 0 ? 1 : 0, + ori == 0 ? 1 : 2, + ori == 1 ? plotTop : plotLft, + ori == 1 ? plotHgt : plotWid, + roundDec(border.width * pxRatio, 3), + border.stroke(self, i), + border.dash, + border.cap, + ); + } + } + + fire("drawAxes"); + } + + function resetYSeries(minMax) { + // log("resetYSeries()", arguments); + + series.forEach((s, i) => { + if (i > 0) { + s._paths = null; + + if (minMax) { + if (mode == 1) { + s.min = null; + s.max = null; + } + else { + s.facets.forEach(f => { + f.min = null; + f.max = null; + }); + } + } + } + }); + } + + let queuedCommit = false; + let deferHooks = false; + let hooksQueue = []; + + function flushHooks() { + deferHooks = false; + + for (let i = 0; i < hooksQueue.length; i++) + fire(...hooksQueue[i]); + + hooksQueue.length = 0; + } + + function commit() { + if (!queuedCommit) { + microTask(_commit); + queuedCommit = true; + } + } + + // manual batching (aka immediate mode), skips microtask queue + function batch(fn, _deferHooks = false) { + queuedCommit = true; + deferHooks = _deferHooks; + + fn(self); + _commit(); + + if (_deferHooks && hooksQueue.length > 0) + queueMicrotask(flushHooks); + } + + self.batch = batch; + + function _commit() { + // log("_commit()", arguments); + + if (shouldSetScales) { + setScales(); + shouldSetScales = false; + } + + if (shouldConvergeSize) { + convergeSize(); + shouldConvergeSize = false; + } + + if (shouldSetSize) { + setStylePx(under, LEFT, plotLftCss); + setStylePx(under, TOP, plotTopCss); + setStylePx(under, WIDTH, plotWidCss); + setStylePx(under, HEIGHT, plotHgtCss); + + setStylePx(over, LEFT, plotLftCss); + setStylePx(over, TOP, plotTopCss); + setStylePx(over, WIDTH, plotWidCss); + setStylePx(over, HEIGHT, plotHgtCss); + + setStylePx(wrap, WIDTH, fullWidCss); + setStylePx(wrap, HEIGHT, fullHgtCss); + + // NOTE: mutating this during print preview in Chrome forces transparent + // canvas pixels to white, even when followed up with clearRect() below + can.width = round(fullWidCss * pxRatio); + can.height = round(fullHgtCss * pxRatio); + + axes.forEach(({ _el, _show, _size, _pos, side }) => { + if (_el != null) { + if (_show) { + let posOffset = (side === 3 || side === 0 ? _size : 0); + let isVt = side % 2 == 1; + + setStylePx(_el, isVt ? "left" : "top", _pos - posOffset); + setStylePx(_el, isVt ? "width" : "height", _size); + setStylePx(_el, isVt ? "top" : "left", isVt ? plotTopCss : plotLftCss); + setStylePx(_el, isVt ? "height" : "width", isVt ? plotHgtCss : plotWidCss); + + remClass(_el, OFF); + } + else + addClass(_el, OFF); + } + }); + + // invalidate ctx style cache + ctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null; + ctxAlpha = 1; + + syncRect(true); + + if ( + plotLftCss != _plotLftCss || + plotTopCss != _plotTopCss || + plotWidCss != _plotWidCss || + plotHgtCss != _plotHgtCss + ) { + resetYSeries(false); + + let pctWid = plotWidCss / _plotWidCss; + let pctHgt = plotHgtCss / _plotHgtCss; + + if (showCursor && !shouldSetCursor && cursor.left >= 0) { + cursor.left *= pctWid; + cursor.top *= pctHgt; + + vCursor && elTrans(vCursor, round(cursor.left), 0, plotWidCss, plotHgtCss); + hCursor && elTrans(hCursor, 0, round(cursor.top), plotWidCss, plotHgtCss); + + for (let i = 0; i < cursorPts.length; i++) { + let pt = cursorPts[i]; + + if (pt != null) { + cursorPtsLft[i] *= pctWid; + cursorPtsTop[i] *= pctHgt; + elTrans(pt, ceil(cursorPtsLft[i]), ceil(cursorPtsTop[i]), plotWidCss, plotHgtCss); + } + } + } + + if (select.show && !shouldSetSelect && select.left >= 0 && select.width > 0) { + select.left *= pctWid; + select.width *= pctWid; + select.top *= pctHgt; + select.height *= pctHgt; + + for (let prop in _hideProps) + setStylePx(selectDiv, prop, select[prop]); + } + + _plotLftCss = plotLftCss; + _plotTopCss = plotTopCss; + _plotWidCss = plotWidCss; + _plotHgtCss = plotHgtCss; + } + + fire("setSize"); + + shouldSetSize = false; + } + + if (fullWidCss > 0 && fullHgtCss > 0) { + ctx.clearRect(0, 0, can.width, can.height); + fire("drawClear"); + drawOrder.forEach(fn => fn()); + fire("draw"); + } + + if (select.show && shouldSetSelect) { + setSelect(select); + shouldSetSelect = false; + } + + if (showCursor && shouldSetCursor) { + updateCursor(null, true, false); + shouldSetCursor = false; + } + + if (legend.show && legend.live && shouldSetLegend) { + setLegend(); + shouldSetLegend = false; // redundant currently + } + + if (!ready) { + ready = true; + self.status = 1; + + fire("ready"); + } + + viaAutoScaleX = false; + + queuedCommit = false; + } + + self.redraw = (rebuildPaths, recalcAxes) => { + shouldConvergeSize = recalcAxes || false; + + if (rebuildPaths !== false) + _setScale(xScaleKey, scaleX.min, scaleX.max); + else + commit(); + }; + + // redraw() => setScale('x', scales.x.min, scales.x.max); + + // explicit, never re-ranged (is this actually true? for x and y) + function setScale(key, opts) { + let sc = scales[key]; + + if (sc.from == null) { + if (dataLen == 0) { + let minMax = sc.range(self, opts.min, opts.max, key); + opts.min = minMax[0]; + opts.max = minMax[1]; + } + + if (opts.min > opts.max) { + let _min = opts.min; + opts.min = opts.max; + opts.max = _min; + } + + if (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16) + return; + + if (key == xScaleKey) { + if (sc.distr == 2 && dataLen > 0) { + opts.min = closestIdx(opts.min, data[0]); + opts.max = closestIdx(opts.max, data[0]); + + if (opts.min == opts.max) + opts.max++; + } + } + + // log("setScale()", arguments); + + pendScales[key] = opts; + + shouldSetScales = true; + commit(); + } + } + + self.setScale = setScale; + +// INTERACTION + + let xCursor; + let yCursor; + let vCursor; + let hCursor; + + // starting position before cursor.move + let rawMouseLeft0; + let rawMouseTop0; + + // starting position + let mouseLeft0; + let mouseTop0; + + // current position before cursor.move + let rawMouseLeft1; + let rawMouseTop1; + + // current position + let mouseLeft1; + let mouseTop1; + + let dragging = false; + + const drag = cursor.drag; + + let dragX = drag.x; + let dragY = drag.y; + + if (showCursor) { + if (cursor.x) + xCursor = placeDiv(CURSOR_X, over); + if (cursor.y) + yCursor = placeDiv(CURSOR_Y, over); + + if (scaleX.ori == 0) { + vCursor = xCursor; + hCursor = yCursor; + } + else { + vCursor = yCursor; + hCursor = xCursor; + } + + mouseLeft1 = cursor.left; + mouseTop1 = cursor.top; + } + + const select = self.select = assign({ + show: true, + over: true, + left: 0, + width: 0, + top: 0, + height: 0, + }, opts.select); + + const selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null; + + function setSelect(opts, _fire) { + if (select.show) { + for (let prop in opts) { + select[prop] = opts[prop]; + + if (prop in _hideProps) + setStylePx(selectDiv, prop, opts[prop]); + } + + _fire !== false && fire("setSelect"); + } + } + + self.setSelect = setSelect; + + function toggleDOM(i) { + let s = series[i]; + + if (s.show) + showLegend && remClass(legendRows[i], OFF); + else { + showLegend && addClass(legendRows[i], OFF); + + if (showCursor) { + let pt = cursorOnePt ? cursorPts[0] : cursorPts[i]; + pt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + } + } + } + + function _setScale(key, min, max) { + setScale(key, {min, max}); + } + + function setSeries(i, opts, _fire, _pub) { + // log("setSeries()", arguments); + + if (opts.focus != null) + setFocus(i); + + if (opts.show != null) { + series.forEach((s, si) => { + if (si > 0 && (i == si || i == null)) { + s.show = opts.show; + toggleDOM(si); + + if (mode == 2) { + _setScale(s.facets[0].scale, null, null); + _setScale(s.facets[1].scale, null, null); + } + else + _setScale(s.scale, null, null); + + commit(); + } + }); + } + + _fire !== false && fire("setSeries", i, opts); + + _pub && pubSync("setSeries", self, i, opts); + } + + self.setSeries = setSeries; + + function setBand(bi, opts) { + assign(bands[bi], opts); + } + + function addBand(opts, bi) { + opts.fill = fnOrSelf(opts.fill || null); + opts.dir = ifNull(opts.dir, -1); + bi = bi == null ? bands.length : bi; + bands.splice(bi, 0, opts); + } + + function delBand(bi) { + if (bi == null) + bands.length = 0; + else + bands.splice(bi, 1); + } + + self.addBand = addBand; + self.setBand = setBand; + self.delBand = delBand; + + function setAlpha(i, value) { + series[i].alpha = value; + + if (showCursor && cursorPts[i] != null) + cursorPts[i].style.opacity = value; + + if (showLegend && legendRows[i]) + legendRows[i].style.opacity = value; + } + + // y-distance + let closestDist; + let closestSeries; + let focusedSeries; + const FOCUS_TRUE = {focus: true}; + + function setFocus(i) { + if (i != focusedSeries) { + // log("setFocus()", arguments); + + let allFocused = i == null; + + let _setAlpha = focus.alpha != 1; + + series.forEach((s, i2) => { + if (mode == 1 || i2 > 0) { + let isFocused = allFocused || i2 == 0 || i2 == i; + s._focus = allFocused ? null : isFocused; + _setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha); + } + }); + + focusedSeries = i; + _setAlpha && commit(); + } + } + + if (showLegend && cursorFocus) { + onMouse(mouseleave, legendTable, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + if (focusedSeries != null) + setSeries(null, FOCUS_TRUE, true, syncOpts.setSeries); + }); + } + + function posToVal(pos, scale, can) { + let sc = scales[scale]; + + if (can) + pos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss); + + let dim = plotWidCss; + + if (sc.ori == 1) { + dim = plotHgtCss; + pos = dim - pos; + } + + if (sc.dir == -1) + pos = dim - pos; + + let _min = sc._min, + _max = sc._max, + pct = pos / dim; + + let sv = _min + (_max - _min) * pct; + + let distr = sc.distr; + + return ( + distr == 3 ? pow(10, sv) : + distr == 4 ? sinh(sv, sc.asinh) : + distr == 100 ? sc.bwd(sv) : + sv + ); + } + + function closestIdxFromXpos(pos, can) { + let v = posToVal(pos, xScaleKey, can); + return closestIdx(v, data[0], i0, i1); + } + + self.valToIdx = val => closestIdx(val, data[0]); + self.posToIdx = closestIdxFromXpos; + self.posToVal = posToVal; + self.valToPos = (val, scale, can) => ( + scales[scale].ori == 0 ? + getHPos(val, scales[scale], + can ? plotWid : plotWidCss, + can ? plotLft : 0, + ) : + getVPos(val, scales[scale], + can ? plotHgt : plotHgtCss, + can ? plotTop : 0, + ) + ); + + self.setCursor = (opts, _fire, _pub) => { + mouseLeft1 = opts.left; + mouseTop1 = opts.top; + // assign(cursor, opts); + updateCursor(null, _fire, _pub); + }; + + function setSelH(off, dim) { + setStylePx(selectDiv, LEFT, select.left = off); + setStylePx(selectDiv, WIDTH, select.width = dim); + } + + function setSelV(off, dim) { + setStylePx(selectDiv, TOP, select.top = off); + setStylePx(selectDiv, HEIGHT, select.height = dim); + } + + let setSelX = scaleX.ori == 0 ? setSelH : setSelV; + let setSelY = scaleX.ori == 1 ? setSelH : setSelV; + + function syncLegend() { + if (showLegend && legend.live) { + for (let i = mode == 2 ? 1 : 0; i < series.length; i++) { + if (i == 0 && multiValLegend) + continue; + + let vals = legend.values[i]; + + let j = 0; + + for (let k in vals) + legendCells[i][j++].firstChild.nodeValue = vals[k]; + } + } + } + + function setLegend(opts, _fire) { + if (opts != null) { + if (opts.idxs) { + opts.idxs.forEach((didx, sidx) => { + activeIdxs[sidx] = didx; + }); + } + else if (!isUndef(opts.idx)) + activeIdxs.fill(opts.idx); + + legend.idx = activeIdxs[0]; + } + + if (showLegend && legend.live) { + for (let sidx = 0; sidx < series.length; sidx++) { + if (sidx > 0 || mode == 1 && !multiValLegend) + setLegendValues(sidx, activeIdxs[sidx]); + } + + syncLegend(); + } + + shouldSetLegend = false; + + _fire !== false && fire("setLegend"); + } + + self.setLegend = setLegend; + + function setLegendValues(sidx, idx) { + let s = series[sidx]; + let src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx]; + let val; + + if (multiValLegend) + val = s.values(self, sidx, idx) ?? NULL_LEGEND_VALUES; + else { + val = s.value(self, idx == null ? null : src[idx], sidx, idx); + val = val == null ? NULL_LEGEND_VALUES : {_: val}; + } + + legend.values[sidx] = val; + } + + function updateCursor(src, _fire, _pub) { + // ts == null && log("updateCursor()", arguments); + + rawMouseLeft1 = mouseLeft1; + rawMouseTop1 = mouseTop1; + + [mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1); + + cursor.left = mouseLeft1; + cursor.top = mouseTop1; + + if (showCursor) { + vCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss); + hCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss); + } + + let idx; + + // when zooming to an x scale range between datapoints the binary search + // for nearest min/max indices results in this condition. cheap hack :D + let noDataInRange = i0 > i1; // works for mode 1 only + + closestDist = inf; + closestSeries = null; + + // TODO: extract + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss; + let yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss; + + // if cursor hidden, hide points & clear legend vals + if (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) { + idx = cursor.idx = null; + + for (let i = 0; i < series.length; i++) { + let pt = cursorPts[i]; + pt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + } + + if (cursorFocus) + setSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries); + + if (legend.live) { + activeIdxs.fill(idx); + shouldSetLegend = true; + } + } + else { + // let pctY = 1 - (y / rect.height); + + let mouseXPos, valAtPosX, xPos; + + if (mode == 1) { + mouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1; + valAtPosX = posToVal(mouseXPos, xScaleKey); + idx = cursor.idx = closestIdx(valAtPosX, data[0], i0, i1); + xPos = valToPosX(data[0][idx], scaleX, xDim, 0); + } + + // closest pt values + let _ptLft = -10; + let _ptTop = -10; + let _ptWid = 0; + let _ptHgt = 0; + let _centered = true; + let _ptFill = ''; + let _ptStroke = ''; + + for (let i = mode == 2 ? 1 : 0; i < series.length; i++) { + let s = series[i]; + + let idx1 = activeIdxs[i]; + let yVal1 = idx1 == null ? null : (mode == 1 ? data[i][idx1] : data[i][1][idx1]); + + let idx2 = cursor.dataIdx(self, i, idx, valAtPosX); + let yVal2 = idx2 == null ? null : (mode == 1 ? data[i][idx2] : data[i][1][idx2]); + + shouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1; + + activeIdxs[i] = idx2; + + if (i > 0 && s.show) { + let xPos2 = idx2 == null ? -10 : idx2 == idx ? xPos : valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0); + + // this doesnt really work for state timeline, heatmap, status history (where the value maps to color, not y coords) + let yPos = yVal2 == null ? -10 : valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0); + + if (cursorFocus && yVal2 != null) { + let mouseYPos = scaleX.ori == 1 ? mouseLeft1 : mouseTop1; + let dist = abs(focus.dist(self, i, idx2, yPos, mouseYPos)); + + if (dist < closestDist) { + let bias = focus.bias; + + if (bias != 0) { + let mouseYVal = posToVal(mouseYPos, s.scale); + + let seriesYValSign = yVal2 >= 0 ? 1 : -1; + let mouseYValSign = mouseYVal >= 0 ? 1 : -1; + + // with a focus bias, we will never cross zero when prox testing + // it's either closest towards zero, or closest away from zero + if (mouseYValSign == seriesYValSign && ( + mouseYValSign == 1 ? + (bias == 1 ? yVal2 >= mouseYVal : yVal2 <= mouseYVal) : // >= 0 + (bias == 1 ? yVal2 <= mouseYVal : yVal2 >= mouseYVal) // < 0 + )) { + closestDist = dist; + closestSeries = i; + } + } + else { + closestDist = dist; + closestSeries = i; + } + } + } + + if (shouldSetLegend || cursorOnePt) { + let hPos, vPos; + + if (scaleX.ori == 0) { + hPos = xPos2; + vPos = yPos; + } + else { + hPos = yPos; + vPos = xPos2; + } + + let ptWid, ptHgt, ptLft, ptTop, + ptStroke, ptFill, + centered = true, + getBBox = points.bbox; + + if (getBBox != null) { + centered = false; + + let bbox = getBBox(self, i); + + ptLft = bbox.left; + ptTop = bbox.top; + ptWid = bbox.width; + ptHgt = bbox.height; + } + else { + ptLft = hPos; + ptTop = vPos; + ptWid = ptHgt = points.size(self, i); + } + + ptFill = points.fill(self, i); + ptStroke = points.stroke(self, i); + + if (cursorOnePt) { + if (i == closestSeries && closestDist <= focus.prox) { + _ptLft = ptLft; + _ptTop = ptTop; + _ptWid = ptWid; + _ptHgt = ptHgt; + _centered = centered; + _ptFill = ptFill; + _ptStroke = ptStroke; + } + } + else { + let pt = cursorPts[i]; + + if (pt != null) { + cursorPtsLft[i] = ptLft; + cursorPtsTop[i] = ptTop; + + elSize(pt, ptWid, ptHgt, centered); + elColor(pt, ptFill, ptStroke); + elTrans(pt, ceil(ptLft), ceil(ptTop), plotWidCss, plotHgtCss); + } + } + } + } + } + + // if only using single hover point (at cursorPts[0]) + // we have trigger styling at last visible series (once closestSeries is settled) + if (cursorOnePt) { + // some of this logic is similar to series focus below, since it matches the behavior by design + + let p = focus.prox; + + let focusChanged = focusedSeries == null ? closestDist <= p : (closestDist > p || closestSeries != focusedSeries); + + if (shouldSetLegend || focusChanged) { + let pt = cursorPts[0]; + + if (pt != null) { + cursorPtsLft[0] = _ptLft; + cursorPtsTop[0] = _ptTop; + + elSize(pt, _ptWid, _ptHgt, _centered); + elColor(pt, _ptFill, _ptStroke); + elTrans(pt, ceil(_ptLft), ceil(_ptTop), plotWidCss, plotHgtCss); + } + } + } + } + + // nit: cursor.drag.setSelect is assumed always true + if (select.show && dragging) { + if (src != null) { + let [xKey, yKey] = syncOpts.scales; + let [matchXKeys, matchYKeys] = syncOpts.match; + let [xKeySrc, yKeySrc] = src.cursor.sync.scales; + + // match the dragX/dragY implicitness/explicitness of src + let sdrag = src.cursor.drag; + dragX = sdrag._x; + dragY = sdrag._y; + + if (dragX || dragY) { + let { left, top, width, height } = src.select; + + let sori = src.scales[xKeySrc].ori; + let sPosToVal = src.posToVal; + + let sOff, sDim, sc, a, b; + + let matchingX = xKey != null && matchXKeys(xKey, xKeySrc); + let matchingY = yKey != null && matchYKeys(yKey, yKeySrc); + + if (matchingX && dragX) { + if (sori == 0) { + sOff = left; + sDim = width; + } + else { + sOff = top; + sDim = height; + } + + sc = scales[xKey]; + + a = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0); + b = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0); + + setSelX(min(a,b), abs(b-a)); + } + else + setSelX(0, xDim); + + if (matchingY && dragY) { + if (sori == 1) { + sOff = left; + sDim = width; + } + else { + sOff = top; + sDim = height; + } + + sc = scales[yKey]; + + a = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0); + b = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0); + + setSelY(min(a,b), abs(b-a)); + } + else + setSelY(0, yDim); + } + else + hideSelect(); + } + else { + let rawDX = abs(rawMouseLeft1 - rawMouseLeft0); + let rawDY = abs(rawMouseTop1 - rawMouseTop0); + + if (scaleX.ori == 1) { + let _rawDX = rawDX; + rawDX = rawDY; + rawDY = _rawDX; + } + + dragX = drag.x && rawDX >= drag.dist; + dragY = drag.y && rawDY >= drag.dist; + + let uni = drag.uni; + + if (uni != null) { + // only calc drag status if they pass the dist thresh + if (dragX && dragY) { + dragX = rawDX >= uni; + dragY = rawDY >= uni; + + // force unidirectionality when both are under uni limit + if (!dragX && !dragY) { + if (rawDY > rawDX) + dragY = true; + else + dragX = true; + } + } + } + else if (drag.x && drag.y && (dragX || dragY)) + // if omni with no uni then both dragX / dragY should be true if either is true + dragX = dragY = true; + + let p0, p1; + + if (dragX) { + if (scaleX.ori == 0) { + p0 = mouseLeft0; + p1 = mouseLeft1; + } + else { + p0 = mouseTop0; + p1 = mouseTop1; + } + + setSelX(min(p0, p1), abs(p1 - p0)); + + if (!dragY) + setSelY(0, yDim); + } + + if (dragY) { + if (scaleX.ori == 1) { + p0 = mouseLeft0; + p1 = mouseLeft1; + } + else { + p0 = mouseTop0; + p1 = mouseTop1; + } + + setSelY(min(p0, p1), abs(p1 - p0)); + + if (!dragX) + setSelX(0, xDim); + } + + // the drag didn't pass the dist requirement + if (!dragX && !dragY) { + setSelX(0, 0); + setSelY(0, 0); + } + } + } + + drag._x = dragX; + drag._y = dragY; + + if (src == null) { + if (_pub) { + if (syncKey != null) { + let [xSyncKey, ySyncKey] = syncOpts.scales; + + syncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null; + syncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null; + } + + pubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx); + } + + if (cursorFocus) { + let shouldPub = _pub && syncOpts.setSeries; + let p = focus.prox; + + if (focusedSeries == null) { + if (closestDist <= p) + setSeries(closestSeries, FOCUS_TRUE, true, shouldPub); + } + else { + if (closestDist > p) + setSeries(null, FOCUS_TRUE, true, shouldPub); + else if (closestSeries != focusedSeries) + setSeries(closestSeries, FOCUS_TRUE, true, shouldPub); + } + } + } + + if (shouldSetLegend) { + legend.idx = idx; + setLegend(); + } + + _fire !== false && fire("setCursor"); + } + + let rect = null; + + Object.defineProperty(self, 'rect', { + get() { + if (rect == null) + syncRect(false); + + return rect; + }, + }); + + function syncRect(defer = false) { + if (defer) + rect = null; + else { + rect = over.getBoundingClientRect(); + fire("syncRect", rect); + } + } + + function mouseMove(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + // Chrome on Windows has a bug which triggers a stray mousemove event after an initial mousedown event + // when clicking into a plot as part of re-focusing the browser window. + // we gotta ignore it to avoid triggering a phantom drag / setSelect + // However, on touch-only devices Chrome-based browsers trigger a 0-distance mousemove before mousedown + // so we don't ignore it when mousedown has set the dragging flag + if (dragging && e != null && e.movementX == 0 && e.movementY == 0) + return; + + cacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null); + + if (e != null) + updateCursor(null, true, true); + else + updateCursor(src, true, false); + } + + function cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) { + if (rect == null) + syncRect(false); + + setCursorEvent(e); + + if (e != null) { + _l = e.clientX - rect.left; + _t = e.clientY - rect.top; + } + else { + if (_l < 0 || _t < 0) { + mouseLeft1 = -10; + mouseTop1 = -10; + return; + } + + let [xKey, yKey] = syncOpts.scales; + + let syncOptsSrc = src.cursor.sync; + let [xValSrc, yValSrc] = syncOptsSrc.values; + let [xKeySrc, yKeySrc] = syncOptsSrc.scales; + let [matchXKeys, matchYKeys] = syncOpts.match; + + let rotSrc = src.axes[0].side % 2 == 1; + + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss, + yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss, + _xDim = rotSrc ? _h : _w, + _yDim = rotSrc ? _w : _h, + _xPos = rotSrc ? _t : _l, + _yPos = rotSrc ? _l : _t; + + if (xKeySrc != null) + _l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10; + else + _l = xDim * (_xPos/_xDim); + + if (yKeySrc != null) + _t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10; + else + _t = yDim * (_yPos/_yDim); + + if (scaleX.ori == 1) { + let __l = _l; + _l = _t; + _t = __l; + } + } + + if (snap && (src == null || src.cursor.event.type == mousemove)) { + if (_l <= 1 || _l >= plotWidCss - 1) + _l = incrRound(_l, plotWidCss); + + if (_t <= 1 || _t >= plotHgtCss - 1) + _t = incrRound(_t, plotHgtCss); + } + + if (initial) { + rawMouseLeft0 = _l; + rawMouseTop0 = _t; + + [mouseLeft0, mouseTop0] = cursor.move(self, _l, _t); + } + else { + mouseLeft1 = _l; + mouseTop1 = _t; + } + } + + const _hideProps = { + width: 0, + height: 0, + left: 0, + top: 0, + }; + + function hideSelect() { + setSelect(_hideProps, false); + } + + let downSelectLeft; + let downSelectTop; + let downSelectWidth; + let downSelectHeight; + + function mouseDown(e, src, _l, _t, _w, _h, _i) { + dragging = true; + dragX = dragY = drag._x = drag._y = false; + + cacheMouse(e, src, _l, _t, _w, _h, _i, true, false); + + if (e != null) { + onMouse(mouseup, doc, mouseUp, false); + pubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null); + } + + let { left, top, width, height } = select; + + downSelectLeft = left; + downSelectTop = top; + downSelectWidth = width; + downSelectHeight = height; + + // hideSelect(); + } + + function mouseUp(e, src, _l, _t, _w, _h, _i) { + dragging = drag._x = drag._y = false; + + cacheMouse(e, src, _l, _t, _w, _h, _i, false, true); + + let { left, top, width, height } = select; + + let hasSelect = width > 0 || height > 0; + let chgSelect = ( + downSelectLeft != left || + downSelectTop != top || + downSelectWidth != width || + downSelectHeight != height + ); + + hasSelect && chgSelect && setSelect(select); + + if (drag.setScale && hasSelect && chgSelect) { + // if (syncKey != null) { + // dragX = drag.x; + // dragY = drag.y; + // } + + let xOff = left, + xDim = width, + yOff = top, + yDim = height; + + if (scaleX.ori == 1) { + xOff = top, + xDim = height, + yOff = left, + yDim = width; + } + + if (dragX) { + _setScale(xScaleKey, + posToVal(xOff, xScaleKey), + posToVal(xOff + xDim, xScaleKey) + ); + } + + if (dragY) { + for (let k in scales) { + let sc = scales[k]; + + if (k != xScaleKey && sc.from == null && sc.min != inf) { + _setScale(k, + posToVal(yOff + yDim, k), + posToVal(yOff, k) + ); + } + } + } + + hideSelect(); + } + else if (cursor.lock) { + cursor._lock = !cursor._lock; + updateCursor(src, true, e != null); + } + + if (e != null) { + offMouse(mouseup, doc); + pubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); + } + } + + function mouseLeave(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + setCursorEvent(e); + + let _dragging = dragging; + + if (dragging) { + // handle case when mousemove aren't fired all the way to edges by browser + let snapH = true; + let snapV = true; + let snapProx = 10; + + let dragH, dragV; + + if (scaleX.ori == 0) { + dragH = dragX; + dragV = dragY; + } + else { + dragH = dragY; + dragV = dragX; + } + + if (dragH && dragV) { + // maybe omni corner snap + snapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx; + snapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx; + } + + if (dragH && snapH) + mouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss; + + if (dragV && snapV) + mouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss; + + updateCursor(null, true, true); + + dragging = false; + } + + mouseLeft1 = -10; + mouseTop1 = -10; + + activeIdxs.fill(null); + + // passing a non-null timestamp to force sync/mousemove event + updateCursor(null, true, true); + + if (_dragging) + dragging = _dragging; + } + + function dblClick(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + setCursorEvent(e); + + autoScaleX(); + + hideSelect(); + + if (e != null) + pubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); + } + + function syncPxRatio() { + axes.forEach(syncFontSize); + _setSize(self.width, self.height, true); + } + + on(dppxchange, win, syncPxRatio); + + // internal pub/sub + const events = {}; + + events.mousedown = mouseDown; + events.mousemove = mouseMove; + events.mouseup = mouseUp; + events.dblclick = dblClick; + events["setSeries"] = (e, src, idx, opts) => { + let seriesIdxMatcher = syncOpts.match[2]; + idx = seriesIdxMatcher(self, src, idx); + idx != -1 && setSeries(idx, opts, true, false); + }; + + if (showCursor) { + onMouse(mousedown, over, mouseDown); + onMouse(mousemove, over, mouseMove); + onMouse(mouseenter, over, e => { + setCursorEvent(e); + syncRect(false); + }); + onMouse(mouseleave, over, mouseLeave); + + onMouse(dblclick, over, dblClick); + + cursorPlots.add(self); + + self.syncRect = syncRect; + } + + // external on/off + const hooks = self.hooks = opts.hooks || {}; + + function fire(evName, a1, a2) { + if (deferHooks) + hooksQueue.push([evName, a1, a2]); + else { + if (evName in hooks) { + hooks[evName].forEach(fn => { + fn.call(null, self, a1, a2); + }); + } + } + } + + (opts.plugins || []).forEach(p => { + for (let evName in p.hooks) + hooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]); + }); + + const seriesIdxMatcher = (self, src, srcSeriesIdx) => srcSeriesIdx; + + const syncOpts = assign({ + key: null, + setSeries: false, + filters: { + pub: retTrue, + sub: retTrue, + }, + scales: [xScaleKey, series[1] ? series[1].scale : null], + match: [retEq, retEq, seriesIdxMatcher], + values: [null, null], + }, cursor.sync); + + if (syncOpts.match.length == 2) + syncOpts.match.push(seriesIdxMatcher); + + cursor.sync = syncOpts; + + const syncKey = syncOpts.key; + + const sync = _sync(syncKey); + + function pubSync(type, src, x, y, w, h, i) { + if (syncOpts.filters.pub(type, src, x, y, w, h, i)) + sync.pub(type, src, x, y, w, h, i); + } + + sync.sub(self); + + function pub(type, src, x, y, w, h, i) { + if (syncOpts.filters.sub(type, src, x, y, w, h, i)) + events[type](null, src, x, y, w, h, i); + } + + self.pub = pub; + + function destroy() { + sync.unsub(self); + cursorPlots.delete(self); + mouseListeners.clear(); + off(dppxchange, win, syncPxRatio); + root.remove(); + legendTable?.remove(); // in case mounted outside of root + fire("destroy"); + } + + self.destroy = destroy; + + function _init() { + fire("init", opts, data); + + setData(data || opts.data, false); + + if (pendScales[xScaleKey]) + setScale(xScaleKey, pendScales[xScaleKey]); + else + autoScaleX(); + + shouldSetSelect = select.show && (select.width > 0 || select.height > 0); + shouldSetCursor = shouldSetLegend = true; + + _setSize(opts.width, opts.height); + } + + series.forEach(initSeries); + + axes.forEach(initAxis); + + if (then) { + if (then instanceof HTMLElement) { + then.appendChild(root); + _init(); + } + else + then(self, _init); + } + else + _init(); + + return self; +} + +uPlot.assign = assign; +uPlot.fmtNum = fmtNum; +uPlot.rangeNum = rangeNum; +uPlot.rangeLog = rangeLog; +uPlot.rangeAsinh = rangeAsinh; +uPlot.orient = orient; +uPlot.pxRatio = pxRatio; + +{ + uPlot.join = join; +} + +{ + uPlot.fmtDate = fmtDate; + uPlot.tzDate = tzDate; +} + +uPlot.sync = _sync; + +{ + uPlot.addGap = addGap; + uPlot.clipGaps = clipGaps; + + let paths = uPlot.paths = { + points, + }; + + (paths.linear = linear); + (paths.stepped = stepped); + (paths.bars = bars); + (paths.spline = monotoneCubic); +} + +export { uPlot as default }; diff --git a/web/vite.config.ts b/web/vite.config.ts deleted file mode 100644 index 36530a2..0000000 --- a/web/vite.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from 'vite' -import { svelte } from '@sveltejs/vite-plugin-svelte' - -export default defineConfig({ - plugins: [svelte()], - server: { - proxy: { - '/api': 'http://localhost:8080', - '/healthz': 'http://localhost:8080', - '/ws': { - target: 'ws://localhost:8080', - ws: true, - }, - }, - }, -}) diff --git a/workspace/data/demo.xml b/workspace/data/demo.xml new file mode 100644 index 0000000..278ed5c --- /dev/null +++ b/workspace/data/demo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +