diff --git a/.claude/skills/datapipe-examples/SKILL.md b/.claude/skills/datapipe-examples/SKILL.md index 6170ec0d5..bcc83f7fd 100644 --- a/.claude/skills/datapipe-examples/SKILL.md +++ b/.claude/skills/datapipe-examples/SKILL.md @@ -18,7 +18,7 @@ Each `examples/*` pipeline has a dedicated setup skill — pick by what it does: | `e2e_template/image_detection` | YOLO detection + Label Studio human-in-the-loop → train → FiftyOne | **setup-e2e-template** | | `e2e_template/image_keypoints` | YOLO-pose keypoints + Label Studio → train → FiftyOne | **setup-e2e-template** | | `sam_cvat` | SAM3 text-prompt boxes+masks → CVAT pre-annotations | **setup-sam-cvat** | -| `detection_tags` | YOLO detection + **tags** (per-scenario metrics), no Label Studio / FiftyOne, GT injected | **setup-detection-tags** | +| `detection_tags` | YOLO detection + **tags** (per-scenario metrics), injected GT, FiftyOne A/B view | **setup-detection-tags** | | `ocr` | Multi-LLM structured OCR (OpenAI/Gemini/Qwen) on passport/id-doc images → FiftyOne | **setup-ocr** | ## Ask first — don't assume (only the unresolved) @@ -38,8 +38,8 @@ useful results. The per-example skill lists the exact knobs. ## Universal prerequisites (every example) 1. **PostgreSQL** at `DB_URL`. embedder + sam_cvat + ocr need an EXTERNAL Postgres (they don't start one); - e2e_template / detection_tags bundle Postgres in `docker compose`. Empty DB is fine; tables auto-create via - `datapipe db create-all`. `.env.example` default `...postgres:postgres@localhost:5432/postgres`. + e2e_template / detection_tags bundle Postgres (+ ClickHouse for ops run logs) in `docker compose`. Empty DB is fine; tables auto-create via + `datapipe db create-all`. `.env.example` sets `DB_URL` and `CLICKHOUSE_RUN_LOGS_URL` (required for `datapipe --pipeline app api`). External quick start: `docker run -d -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres -p 5432:5432 postgres:16` (k8s pod / no docker → conda postgres, `initdb` as non-root with `--locale=C`.) 2. **A GPU big enough** (`nvidia-smi`): DINOv2/YOLO fit ~8 GB; SAM3 wants >8 GB (OOM'd on an 8 GB Pascal in our tests). @@ -48,6 +48,11 @@ useful results. The per-example skill lists the exact knobs. needs an external CVAT you provide (URL + creds + a project whose labels match its config). 4. **`uv` + Python ≥3.10,<3.13.** Each example has a `pyproject.toml` → `uv sync` (cu124 torch pinned, CUDA OOTB; no manual venv/pip). Read-only/small `$HOME`: `export UV_CACHE_DIR=/tmp/uvcache HF_HOME=/tmp/hf`. + **ML UI / ops specs:** examples with `datapipe-app` + metrics/training panels also pull + **`datapipe-app-ml-ops`** (ops specs, image records, observability routes — not `datapipe-ml`). + Pipeline code imports `datapipe_app_ml_ops.ops_specs`; the observability plugin entry point lives there too. + **Legacy CPU (pre-AVX2, e.g. epoch8 gpu5):** on `e2e_template` / `detection_tags` only — + `uv sync --extra old-cpu` then force `polars-lts-cpu` (see those skills' Troubleshooting). 5. **Human-in-the-loop** (e2e_template, sam_cvat): a human reviews and marks tasks completed before the pipeline advances. diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 088b899b4..ad540b9a5 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -3,9 +3,10 @@ name: setup-detection-tags description: > Use when setting up or running examples/detection_tags — a self-contained datapipe detection demo built around tags (per-scenario metrics), split into two parts around a checkpoint (train a - baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), with a - FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged batch, retrain, - watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. + baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), served under the + datapipe-app UI front (graph + observability + the cat_dog ops-spec; training triggered + from the UI) with a FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged + batch, retrain, watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. --- # detection_tags (tags demo — two-part, FiftyOne, no Label Studio) @@ -29,6 +30,15 @@ and present/rehearse part 2 (the retraining) as often as you like: the tagged TRAIN batch `night-train` → retrain **model B** → show the metrics again: `night` recall rises from A to B. Rehearse by resetting to the checkpoint. +> **Training runs on the UI side (integrated datapipe-app setup).** This skill **sets everything up +> itself**: it deploys the stack, checks prerequisites (`uv`, `docker compose`, GPU), loads the data, +> and **verifies the data is in the pipe** — then **stops**. It does **not** run training. **You +> trigger each training run yourself from the datapipe-app front** (the pipeline graph's +> `stage=train` steps, port 8000): model A in part 1, then — after the skill tops up `night-train` — +> model B in part 2. The `datapipe --executor RayExecutor step --labels=stage=train run` commands below are the +> standalone/CLI equivalent for a no-UI setup; in the UI setup you (the human) press run in the front +> instead. + ## Ask first — don't assume (only the unresolved) 1. **Demo (test) or real data?** — the whole flow branches on this (see "Real data" at the end). @@ -54,19 +64,44 @@ A is measured once on the full frozen val and its numbers are stable, and B is c same val. `add_request.py --subset train|val` pins a batch; the load step emits `image__subset_hint` and the split step honors it (random split only fills images without a hint). -Batches (COCO cat/dog; the pre-staged cache holds **500 images**, so keep the total ≤ 500 or expand -the cache — see Troubleshooting): +Batches (COCO cat/dog; the pre-staged cache holds **1000 images** — fetch it from the public bucket +or build it, see Troubleshooting; keep the total ≤ the cache size). Part 1 = **700** images (train 400 +/ val 300); part 2 adds **300** night-train → **1000** total (train 700 / val 300, val unchanged): | batch | n | offset | subset | tag | darken | when | |-------|---|--------|--------|-----|--------|------| -| `base-train` | 325 | 0 | train | — | — | part 1 | -| `base-val` | 100 | 325 | val | — | — | part 1 | -| `night-val` | 25 | 425 | val | night | 0.25 | part 1 | -| `night-train`| 50 | 450 | train | night | 0.25 | part 2 | - -Validated on gpu5: model A → train recall ~0.95, night/val recall ~0.09 (blind in the dark); after -part 2, model B → night/train recall ~0.86. Keep night/val small but not tiny (25 imgs / ~45 GT) — -below ~20 the val payoff is pure ±1-box noise and can even go the wrong way. +| `base-train` | 400 | 0 | train | — | — | part 1 | +| `base-val` | 150 | 400 | val | — | — | part 1 | +| `night-val` | 150 | 550 | val | night | 0.40 | part 1 | +| `night-train-a`| 100 | 700 | train | night | 0.30 | part 2 | +| `night-train-b`| 100 | 800 | train | night | 0.40 | part 2 | +| `night-train-c`| 100 | 900 | train | night | 0.55 | part 2 | + +**Why THREE night-train batches with different gammas (0.30/0.40/0.55 around val's 0.40):** a single +gamma makes model B memorize that exact darkness (night/train high, night/val flat); gamma DIVERSITY +forces it to generalize "low light", which is what lifts the held-out val. More epochs does NOT fix +this (deeper memorization, val drops) — the lever is data diversity, keep epochs=5. + +**Why 1000 images / batch=32 / epochs=5 / freeze=10 / prediction_threshold=0.10** (validated by a +130+-run sweep + multi-seed full-pipe cycles; the headline metric is **weighted F1 on val**): +`batch=32` kills the gradient-noise margin flips of `batch=10`; `epochs=5` keeps the fitness curve +still rising at the last epoch (best.pt≡last.pt, no epoch-selection jitter); `freeze=10` (frozen +backbone, only the head trains) is the biggest stability lever — per-seed/per-machine F1 spread drops +from 12-15pp to ≤5pp; `prediction_threshold=0.10` on the Inference step pins ONE operating point for +all models/machines instead of each model's own `best_threshold` (a noisy 0.06-0.15 that both jitters +the reported metrics and flatters the weak baseline, shrinking the B−A gap to noise on unlucky seeds). + +**Cross-machine numbers:** training is bit-reproducible on one machine, but weights (and hence +metrics) legitimately differ across GPU/CPU models — float arithmetic on different chips, not a bug +(verified down to byte-identical augmented batches). With this config the weighted-F1 spread across +seeds (proxy upper bound for machines) is ≤5pp for both models on both val sets. + +**Deterministic reference** (seed=42, batch=32, epochs=5, freeze=10, thr=0.10, 1000 images; +weighted F1 / recall on val): model A → overall 0.483/0.348, night 0.408/0.285; model B → overall +**0.610/0.536**, night **0.551/0.469**. **B beats A on BOTH val sets on every seed tested** (F1 +margin across seeds 2/7/42: overall +0.081..+0.127, night +0.082..+0.143; per-model F1 spread +≤4.6pp). Exact numbers reproduce bit-for-bit on the same GPU/CUDA/torch stack; data/splits/tags +reproduce byte-identically on any machine (seeded canonical cache). ## Pre-flight — CHECK what's already there, then ASK (do this before deploying) @@ -75,8 +110,8 @@ if it's occupied, ASK the user what to do (reuse / different port / different sc don't silently claim it or clobber someone else's work. ```bash -# 1) ports free? (host) — postgres 5432, minio 9000/9001, mongo 27017, fiftyone 5151, app 8000 -ss -ltn | grep -E ':(5432|9000|9001|27017|5151|8000)\b' || echo "all free" +# 1) ports free? (host) — postgres 5432, minio 9000/9001, mongo 27017, fiftyone 5151, clickhouse 8123, app 8000 +ss -ltn | grep -E ':(5432|9000|9001|27017|5151|8123|8000)\b' || echo "all free" # 2) is a stack already up? docker compose ls ; docker ps --format '{{.Names}}\t{{.Ports}}' # 3) does the target DB/schema already hold this pipeline's tables? @@ -92,48 +127,80 @@ port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), d ## Deploy from scratch (standard ports; skip pieces already up) ```bash -cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI -docker compose up -d # postgres + minio + mongo (mongo is for FiftyOne). No Label Studio. -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif -# On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): +cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI, CLICKHOUSE_RUN_LOGS_URL +HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151) + clickhouse (:8123); HOST_UID/GID avoid sudo perms. No Label Studio. +uv sync --extra ray # modern hosts: THIS, unmodified. Do NOT edit dependencies/re-lock — + # that drifts lib versions across machines (e.g. a different ultralytics) + # and changes training results. The lock pins everyone to the same stack. + # Declares datapipe-app[clickhouse,ml] + datapipe-ui-ml + datapipe-app-ml-ops + # + datapipe-ml[torch,fiftyone] (see pyproject.toml / README). +# Legacy host (e.g. epoch8 gpu5: pre-AVX2 CPU) ONLY — extras + force the lts polars to win: +uv sync --extra ray --extra old-cpu uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 +# Ops UI static assets (needed once so `datapipe api` serves `/`): +cd ../.. && yarn install && yarn workspace @datapipe/ui build:package && cd examples/detection_tags cd detection # DB_SCHEMA defaults to `public` (already exists). Only if you set a dedicated schema (to share the # Postgres with other pipelines) create it first: psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" datapipe db create-all ``` -## Part 1 — baseline to checkpoint +Then bring up the **datapipe-app UI front** — it serves the pipeline graph, the observability panels +(training status/curves + the `cat_dog` ops-spec with the `model_metrics` and `tag_metrics` +tables), and the **run triggers** you use to launch training: + +```bash +# from examples/detection_tags/detection, .env sourced; run under tmux/nohup so it survives ssh drops +set -a && source ../.env && set +a +uv run datapipe --executor RayExecutor --pipeline app api --host 127.0.0.1 --port 8000 +``` -Run `stage=train` as ONE step (it internally does split→freeze→train→inference); surface each stage -from its log and by querying the tables after — do NOT invoke `stage=train-prepare` separately before -`stage=train`, or the intermediate re-freeze retrains the model twice (see Troubleshooting). +Bind to `127.0.0.1` (not `0.0.0.0`) and reach it over an SSH tunnel `-L 8000:localhost:8000`; open +`http://localhost:8000`. The `app.add_specs([...])` block in `detection/app.py` (imports +`datapipe_app_ml_ops.ops.ops_specs`) registers the `cat_dog` spec; observability enrichers load via the +`datapipe-app-ml-ops` plugin entry point (`datapipe.observability`). + +## Part 1 — set up + load + verify, then STOP (you trigger model-A training from the UI) + +The skill's job in part 1: load the baseline data (val frozen up front) and **verify it's in the +pipe** — then stop. Training is **yours to trigger from the datapipe-app front** (port 8000). ```bash -# from examples/detection_tags/detection, with .env sourced -python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train -python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val -python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 -datapipe step --labels=stage=load run # 450 images; val frozen (100 base + 25 night) -# show the frozen split: SELECT subset_id, count(*) FROM image__subset_hint GROUP BY subset_id - -datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference (SHOW every epoch) -datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics -# count-metrics can print "Batches to process 0" right after training (it hasn't seen the fresh -# predictions yet) — RE-RUN it once; then the tables fill. (See Troubleshooting.) - -# SHOW THE FULL TABLES (see the Rule below). To rehearse part 2 later, snapshot the post-A state -# BEFORE the fiftyone stage (demo-only convenience; skip for real use): -docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql +# SKILL DOES — from examples/detection_tags/detection, with .env sourced: +set -a && source ../.env && set +a +# Prefer `uv run python` (bare `python` misses venv deps like pathy). The cache must already be in +# $DATAPIPE_TAGS_CACHE_DIR (from .env) — see Troubleshooting "Getting the cache". +uv run python ../scripts/add_request.py --id base-train --n 400 --offset 0 --subset train +uv run python ../scripts/add_request.py --id base-val --n 150 --offset 400 --subset val +uv run python ../scripts/add_request.py --id night-val --n 150 --offset 550 --subset val --tag night --darken 0.40 +uv run datapipe --executor RayExecutor step --labels=stage=load run # 700 images; val frozen (150 base + 150 night) + +# VERIFY the data is in the pipe before handing off: +# SELECT subset_id, count(*) FROM image__subset_hint GROUP BY subset_id -- expect train=400, val=300 +# SELECT count(*) FROM image__ground_truth -- expect 700 (one row per image) +``` -datapipe step --labels=stage=fiftyone run # download_images -> GT + model-A predictions +**Stop here and hand off.** You now trigger **model-A training from the datapipe-app front** (port +8000) — the `stage=train` steps in the graph (split→freeze→train→inference). Watch it in the +observability panels (training status/curves). When it finishes, compute metrics + the FiftyOne view +(from the UI, or the CLI equivalents): + +```bash +# CLI equivalent (no-UI) of what you trigger in the front: +uv run datapipe --executor RayExecutor step --labels=stage=train run # split -> freeze -> train model A -> inference +uv run datapipe --executor RayExecutor step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics +# count-metrics can print "Batches to process 0" right after training — RE-RUN it once. (Troubleshooting.) +uv run datapipe --executor RayExecutor step --labels=stage=fiftyone run # download_images -> GT + model-A predictions +# (demo-only) snapshot the post-A state to rehearse part 2 later: +docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql ``` -**Stop here (end of stage 1) and hand the baseline over to the user:** -- show the full training log (all epochs) and the **full** metric tables (`metrics_on_subset` + - `tag_metrics`) — `tag_metrics` for model A at `night/val` is **low** (baseline blind in the dark); -- bring up the **FiftyOne App** service so they can browse GT vs model-A predictions, and give them - its address / how to reach it (see "Let the user watch" — specifics depend on the setup); +**After model A, hand the baseline over:** +- show the **full** metric tables (`model_metrics` / `metrics_on_subset` + `tag_metrics`) — in the + front's `cat_dog` spec or via the RULE query below; `tag_metrics` for model A at + `night/val` is **low** (baseline blind in the dark); +- point the user at the **datapipe-app front** (graph + observability + the two metric tables) and the + **FiftyOne App** (GT vs model-A predictions) — give the addresses / tunnels (see "Let the user watch"); - then ask whether to proceed to part 2 (retrain). That's the problem part 2 fixes. Surface every epoch from the training log (it streams to a file, e.g. `/tmp/train_A.log`): @@ -142,20 +209,34 @@ grep -oE "[0-9]+/[0-9]+ +[0-9.]+G +[0-9.]+ +[0-9.]+ +[0-9.]+" /tmp/train_A.log grep -E "^ +all +[0-9]+ +[0-9]+" /tmp/train_A.log # per-epoch val P/R/mAP50/mAP50-95 ``` -## Part 2 — retrain and watch the tag metric rise +## Part 2 — skill tops up the tagged batch, then you retrain model B from the UI + +The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retrain from the front**. ```bash -python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 -datapipe step --labels=stage=load run # 500 images total -datapipe step --labels=stage=train run # split (night -> TRAIN, val UNCHANGED) + train model B (SHOW every epoch) -# verify val stayed frozen after the split: -# SELECT subset_id, count(*) FILTER (WHERE image_name LIKE '%night%') night, count(*) total -# FROM image__subset s JOIN image__ground_truth USING(image_name) GROUP BY subset_id -datapipe step --labels=stage=count-metrics run # re-run if "0 batches" -datapipe step --labels=stage=fiftyone run # adds predictions_model_b +# SKILL DOES — add the tagged TRAIN batch and load it (val stays frozen): +set -a && source ../.env && set +a +uv run python ../scripts/add_request.py --id night-train-a --n 100 --offset 700 --subset train --tag night --darken 0.30 +uv run python ../scripts/add_request.py --id night-train-b --n 100 --offset 800 --subset train --tag night --darken 0.40 +uv run python ../scripts/add_request.py --id night-train-c --n 100 --offset 900 --subset train --tag night --darken 0.55 +uv run datapipe --executor RayExecutor step --labels=stage=load run # 1000 images total +# VERIFY val stayed frozen (night went to TRAIN only; tag_id IS the tag name): +# SELECT h.subset_id, count(*) FROM image__tag it +# JOIN image__subset_hint h USING(image_name) WHERE it.tag_id='night' GROUP BY h.subset_id +# -- expect train=300, val=150 ``` -`night/val` recall rises from model A to model B — the payoff. Show the full tables again. +**Stop here and hand off — you trigger model-B training from the datapipe-app front** (`stage=train`; +night is now in TRAIN, val unchanged). Then metrics + FiftyOne (front or CLI equivalent): + +```bash +uv run datapipe --executor RayExecutor step --labels=stage=train run # model B (night in training) +uv run datapipe --executor RayExecutor step --labels=stage=count-metrics run # re-run if "0 batches" +uv run datapipe --executor RayExecutor step --labels=stage=fiftyone run # adds predictions_model_b +``` + +`night/val` recall rises from model A to model B — the payoff. Show the full tables again (in the +front's `cat_dog` metrics tables, or the RULE query below). ## Rehearse part 2 from the snapshot (demo-only) @@ -174,30 +255,38 @@ When you show metrics, dump the **whole** table, not a truncated view. Both of t ```bash docker exec psql -U postgres -x -c \ - "SELECT * FROM $DB_SCHEMA.detection_model_train__metrics_on_subset ORDER BY detection_model_id, subset_id" + "SELECT * FROM $DB_SCHEMA.pipeline_model__metrics_on_subset ORDER BY detection_model_id, subset_id" docker exec psql -U postgres -x -c \ - "SELECT tm.*, t.tag_name FROM $DB_SCHEMA.tag_metrics tm JOIN $DB_SCHEMA.tag t USING(tag_id) \ - ORDER BY tm.detection_model_id, tm.tag_id, tm.subset_id" + "SELECT * FROM $DB_SCHEMA.pipeline_model__metrics_by_tag_on_subset ORDER BY detection_model_id, tag_id, subset_id" ``` -`tag_id` is a numeric surrogate key (deterministic map in `config.TAG_IDS`, e.g. `night`→1); the -`tag` dimension holds `tag_name`/`tag_description`, so join it to show the readable name. +Metrics live in `pipeline_model__metrics_on_subset` (overall, shown as **Model metrics** in the front) +and `pipeline_model__metrics_by_tag_on_subset` (per-tag, **Tag metrics**). `calc__support` is the GT +**box** count (≥ image count — an image can hold several cat/dog boxes); recall/precision have +`weighted`/`macro` variants. `tag_id` **is the tag name itself** (text, e.g. `night`) — no numeric +surrogate, no join. The `tag` dimension is two columns: `tag_id` (name) + `tag_description`. -The payoff comparison: `tag_metrics` at `tag=night, subset=val`, model A vs model B — recall rises. -The night/val set is small (25 images), so treat the rise as **directional**. +The payoff: `pipeline_model__metrics_by_tag_on_subset` at `tag=night`, model A vs B. The **reliable +signal is night/train** (rises sharply once night is in training). **night/val is directional** — it +rises only if the model *generalizes* the low-light scenario (needs enough night-train + epochs); +with too few, model B memorizes night-train and night/val stays flat. ## Let the user watch (offer it — work out the specifics per setup) -The user can watch three things; make them available and hand over whatever access they need — don't -prescribe fixed commands here and don't leave a committed file behind (it would bake in one machine's -host/ports/paths and mislead on the next). Compute the specifics for the ACTUAL setup at runtime -(local vs remote host, which ports are free, tunnels if remote) and give the user the commands +The user watches (and drives) several things; make them available and hand over whatever access they +need — don't prescribe fixed commands here and don't leave a committed file behind (it would bake in +one machine's host/ports/paths and mislead on the next). Compute the specifics for the ACTUAL setup at +runtime (local vs remote host, which ports are free, tunnels if remote) and give the user the commands directly in chat: -- **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `tag_metrics`, - `detection_model_train__metrics_on_subset`, `detection_training_status`. -- **images** in the FiftyOne App: `ground_truth` vs `predictions_model_a` vs `predictions_model_b`, - filterable by `tag`/`subset`. +- **the datapipe-app front** (`uv run datapipe --executor RayExecutor --pipeline app api --host 127.0.0.1 --port 8000`, tunnel 8000) + — the pipeline graph, observability panels (training status/curves), the `cat_dog` + ops-spec with the `model_metrics` + `tag_metrics` tables, and the **run triggers** the user presses + to launch model A / model B. This is the primary surface in the UI setup. +- **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `pipeline_model__metrics_on_subset`, + `pipeline_model__metrics_by_tag_on_subset`, `detection_training_status`. +- **images** in the FiftyOne App: `annotations` vs `predictions_model_a` vs `predictions_model_b`, + filterable by sample fields `tag_id` / `subset_id`. - **training progress**: the run streams to a log file — tail it; trust `detection_training_status.status`, not exit codes. @@ -212,20 +301,23 @@ different left-hand port rather than killing whatever holds it. ## FiftyOne `stage=fiftyone` downloads images locally then publishes to one dataset (`FIFTYONE_DATASET_NAME`, -metadata in MongoDB): fields `ground_truth`, `predictions_model_a` (baseline), `predictions_model_b` -(retrained), plus sample fields `tag` and `subset`. Ported straight from +metadata in MongoDB): fields `annotations` (GT), `predictions_model_a` (baseline), +`predictions_model_b` (retrained), plus sample fields `tag_id` and `subset_id`. Ported straight from `examples/e2e_template/image_detection` (same `download_images` + `publish_to_fiftyone` + `FiftyOneImagesDataTableStore`); the two model fields are assigned by sorted model-id (earliest = -`model_a`). Launch: `fiftyone app launch "$FIFTYONE_DATASET_NAME" --port 5151 --address 0.0.0.0`, -tunnel 5151 (local port MUST equal remote port — the App's WebSocket calls the same port). - -`tag` and `subset` are ordinary **sample fields** (set in-pipeline by `publish_gt_to_fiftyone`, no -scripts) — NOT FiftyOne's native "sample tags". Filter by the **fields** in the sidebar: pick -`tag = night` and `subset = val` — different fields AND together, so you get exactly the night-val -set. (Selecting multiple values inside FiftyOne's native TAGS panel ORs them, which is why we do NOT -mirror tag/subset into native tags.) That isolates where model A misses in the dark; after part 2, -`predictions_model_b` shows model B catching it. Fields stay `predictions_model_a` (baseline, -earliest model id) / `predictions_model_b` (retrained); the exact model ids are in the DB tables. +`model_a`). The FiftyOne App is a **docker-compose service** (`fiftyone` on :5151) — no manual +`fiftyone app launch`; after `stage=fiftyone`, open `http://localhost:5151` (tunnel 5151; local port +MUST equal remote — the App's WebSocket calls the same port). Compose mounts `DATAPIPE_TAGS_TMP_DIR` +(default `/tmp/datapipe-tags`); local images land in `$DATAPIPE_TAGS_TMP_DIR/local_images`. + +`tag_id` and `subset_id` are ordinary **sample fields** (set in-pipeline by +`publish_to_fiftyone_ground_truth`, no scripts) — NOT FiftyOne's native "sample tags". Filter by the +**fields** in the sidebar: pick `tag_id = night` and `subset_id = val` — different fields AND +together, so you get exactly the night-val set. (Selecting multiple values inside FiftyOne's native +TAGS panel ORs them, which is why we do NOT mirror tag/subset into native tags.) That isolates where +model A misses in the dark; after part 2, `predictions_model_b` shows model B catching it. Fields +stay `predictions_model_a` (baseline, earliest model id) / `predictions_model_b` (retrained); the +exact model ids are in the DB tables. ## How to work @@ -235,17 +327,35 @@ to a file + `grep`, not inline. ## Troubleshooting (verify against current files) -- **Pre-staged cache is exactly 500 images** → `gt.json` in the cache dir caps the pool. An `offset` - past 500 yields an empty batch silently. Keep the batch total ≤ 500, or rebuild the cache larger - (or point `DATAPIPE_TAGS_CACHE_DIR` at a fresh dir to force a full COCO download). +- **Getting the cache (fresh host)** → easiest: fetch the pre-built 1000-image cache from the public + bucket (no auth, works from RU) into `$DATAPIPE_TAGS_CACHE_DIR` (set in `.env`; defaults to + `/tmp/datapipe-tags-cache` — the SAME dir the pipe reads, so fetch and load agree): + ```bash + set -a && source ../.env && set +a # exports DATAPIPE_TAGS_CACHE_DIR + BASE=https://storage.yandexcloud.net/e8-demo/datasets/coco-cat-dog-1000 + mkdir -p "$DATAPIPE_TAGS_CACHE_DIR/images" && cd "$DATAPIPE_TAGS_CACHE_DIR" + curl -sf "$BASE/gt.json" -o gt.json + python -c "import json; print('\n'.join(json.load(open('gt.json'))))" \ + | xargs -P 16 -I{} curl -sf -o "images/{}" "$BASE/images/{}" + ls images | wc -l # expect 1000 + ``` + Also on the bucket: `datasets/coco-cat-dog-500/` and `datasets/coco-annotations/annotations_trainval2017.zip`. + Alternative on a COCO-reachable host: `uv run python ../scripts/build_cache.py 1000` — byte-identical + result (canonical order; gt.json md5 must match the bucket's). The cache caps the pool at its size, so + keep the batch total ≤ N. From RU `images.cocodataset.org` is unreachable — use the bucket. - **`SIGILL` / `Illegal instruction` in training** → `polars` built for a newer CPU than the host (pre-AVX2). The `polars-lts-cpu` pin isn't enough alone; the regular `polars` comes in transitively. After `uv sync`: `uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1`, then verify `python -c "import polars; print(polars.__version__)"` is the lts one. - **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. - **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated - the fresh predictions in the same pass. Re-run `count-metrics` once; then `metrics_on_image/subset` - and `tag_metrics` fill. + the fresh predictions in the same pass. Re-run `count-metrics` once; then the metric tables fill. +- **Model B didn't retrain / trains on the OLD frozen dataset** → the freeze step has a time debounce: + `DetectionFreezeDataset(min_within_time=...)` refuses to create a new frozen dataset if the last one is + younger than that ("Not enough time passed since last frozen dataset" in the log). The demo app sets + `min_within_time="1s"` so part 2 retrains immediately; if you see the error (e.g. a config with "5min"), + either lower it or wait it out, then re-run `stage=train`. Verify via + `detection_frozen_dataset__train_images_count` growing (a second `detection_frozen_dataset` row). - **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` separately; the split between them changes `image__subset`, which re-freezes the dataset and retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. @@ -256,7 +366,7 @@ to a file + `grep`, not inline. local images under a writable path like `/var/tmp`; `/tmp` and `/var/tmp` are writable. - **Flaky link to the cluster** (Moscow/RU hosts) → SSH may time out transiently; retry. - **Metrics 0 on a trained model** → tiny/noisy val latches an early "best" checkpoint; use enough - data (~450 total) and the shipped epoch config. + data (~500 total with the shipped batches) and the shipped epoch config. - **Training exits 0 but no model** → datapipe swallows step errors; check `detection_training_status`. ## Real data diff --git a/.claude/skills/setup-e2e-template/SKILL.md b/.claude/skills/setup-e2e-template/SKILL.md index 112cc9616..b75d95800 100644 --- a/.claude/skills/setup-e2e-template/SKILL.md +++ b/.claude/skills/setup-e2e-template/SKILL.md @@ -1,75 +1,110 @@ --- name: setup-e2e-template description: > - Use when setting up or running examples/e2e_template (image_detection or image_keypoints) — - datapipe YOLO/Label Studio pipelines — or debugging their install, stages, training, or FiftyOne output. + Use when setting up or running examples/e2e_template (image_detection, image_keypoints, or + image_classification) — datapipe YOLO/TF + Label Studio pipelines — or debugging their install, + stages, training, or FiftyOne output. --- -# e2e_template (detection + keypoints YOLO/Label-Studio pipeline) +# e2e_template (detection + keypoints + classification) -This skill = run the YOLO/Label-Studio detection/keypoints pipeline on YOUR images. The COCO seed sample is just a smoke-test; the real goal is your own images — set the knobs below first. +This skill = run the Label-Studio e2e pipelines on YOUR images. The COCO seed sample is just a +smoke-test; the real goal is your own images — set the knobs below first. -**Ask first — don't assume (only the unresolved):** demo or your own data? bring up the bundled `docker compose` services or reuse existing? **which Postgres + which database** for `DB_URL` — never point it at an existing DB without confirming; reuse an existing venv / `uv` env or create a fresh one? GPU? **annotate for real in Label Studio, or inject ready-made ground truth** (reuse existing labels / a labelled dataset) to skip the human `annotation` step? surface stage logs or run quiet? (per-tag scenario metrics live in a separate example → **setup-detection-tags**) +Templates: +- `image_detection` — YOLO bbox (Cat/Dog) +- `image_keypoints` — YOLO pose (Person) +- `image_classification` — TF classification (`Has Animal` / `No Animals`) -**How to work:** read the setup, then propose a short plan and get a go-ahead before touching anything. Prepare `.env` and **pause for the user to verify it** before running. Run each stage with its logs shown and, after each, say what you did and what changed — don't run the pipeline silently. If a stage fails and the cause isn't clear from the normal logs, re-run it with `datapipe --debug … run` (or `--debug-sql` for SQL errors); debug is very verbose, so send it to a file and `grep` it (e.g. `datapipe --debug run > /tmp/dp_debug.log 2>&1; grep -nEi "error|traceback" /tmp/dp_debug.log`) rather than dumping it inline. +**Ask first — don't assume (only the unresolved):** demo or your own data? which template? +bring up the bundled `docker compose` services or reuse existing? **which Postgres + which +database** for `DB_URL` — never point it at an existing DB without confirming; reuse an existing +venv / `uv` env or create a fresh one? GPU? **annotate for real in Label Studio, or inject +ready-made ground truth** (reuse existing labels / a labelled dataset) to skip the human +`annotation` step? surface stage logs or run quiet? (per-tag scenario metrics live in a +separate example → **setup-detection-tags**) + +**How to work:** read the setup, then propose a short plan and get a go-ahead before touching +anything. Prepare `.env` and **pause for the user to verify it** before running. Run each stage +with its logs shown and, after each, say what you did and what changed — don't run the pipeline +silently. If a stage fails and the cause isn't clear from the normal logs, re-run it with +`datapipe --debug … run` (or `--debug-sql` for SQL errors); debug is very verbose, so send it to +a file and `grep` it (e.g. `datapipe --debug run > /tmp/dp_debug.log 2>&1; grep -nEi +"error|traceback" /tmp/dp_debug.log`) rather than dumping it inline. ## Run on YOUR data -- **Align your class everywhere** (mismatch → 0 useful results): `LABEL_CONFIG` names == `CLASSES_TO_KEEP`. Detection also `COCO_CLASSES`/`DETECTION_MODEL_CONFIG`; keypoints also `KEYPOINTS_LABELS` (order matters), `COCO_PERSON_KEYPOINT_FLIP_IDX`, `KEYPOINTS_MODEL_CONFIG`. -- **Where YOUR images go:** put them under `$DATAPIPE_E2E_DIR/images` (`DATAPIPE_E2E_DIR` defaults to `s3://datapipe-e2e`; the pipeline writes its own artifacts under `$DATAPIPE_E2E_DIR/datapipe`, a sibling — input and working dir don't overlap). Set `AWS_*`, `S3_ENDPOINT_URL`, and `S3_PUBLIC_URL` (browser-reachable — Label Studio loads images from it). Label Studio reaches S3 via its own `LABEL_STUDIO_S3_ENDPOINT_URL` (`minio:9000`), not `S3_ENDPOINT_URL`. +- **Align your class everywhere** (mismatch → 0 useful results): `LABEL_CONFIG` names == class + constants. Detection: `CLASSES_TO_KEEP` + `COCO_CLASSES`/`DETECTION_MODEL_CONFIG`. Keypoints: + `KEYPOINTS_LABELS` (order matters), `COCO_PERSON_KEYPOINT_FLIP_IDX`, `KEYPOINTS_MODEL_CONFIG`. + Classification: `CLASSIFICATION_CLASSES` = `Has Animal` / `No Animals` (Choices, not rectangles). +- **Where YOUR images go:** put them under `$DATAPIPE_E2E_DIR/images` (`DATAPIPE_E2E_DIR` defaults + to `s3://datapipe-e2e`; the pipeline writes its own artifacts under `$DATAPIPE_E2E_DIR/datapipe`, + a sibling — input and working dir don't overlap). Set `AWS_*`, `S3_ENDPOINT_URL`, and + `S3_PUBLIC_URL` (browser-reachable — Label Studio loads images from it). Label Studio reaches S3 + via its own `LABEL_STUDIO_S3_ENDPOINT_URL` (`minio:9000`), not `S3_ENDPOINT_URL`. ## Prerequisites -- **Python 3.10–3.12** (hard pin `>=3.10,<3.13`). **Install:** `cd examples/e2e_template && uv sync` - (`pyproject.toml` declares editable workspace libs + cu124 `torch==2.6.0`). +- **Python 3.10–3.12** (hard pin `>=3.10,<3.13`). **Install:** `cd examples/e2e_template && uv sync --extra ray` + (`pyproject.toml`: editable `datapipe-app`, **`datapipe-app-ml-ops`**, `datapipe-ml[torch,fiftyone,tensorflow]`, + cu124 `torch==2.6.0`). + Modern hosts: run `uv sync --extra ray` unmodified — do NOT edit/re-lock deps (drifts training across machines). + **Legacy host (pre-AVX2 CPU, e.g. epoch8 gpu5):** `uv sync --extra ray --extra old-cpu`, then force lts polars + (`uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1`) — see detection_tags Troubleshooting. +- **Ops specs / app UI:** `image_*/app.py` registers specs via `datapipe_app_ml_ops.ops.ops_specs` + + `app.add_specs([...])`. Run the front with `uv run datapipe --executor RayExecutor --pipeline app api` + after `uv sync --extra ray` (ports: detection 8001, keypoints 8002, classification 8003). - **Services:** `docker compose up` → Postgres 5432, MinIO (9000/9001, bucket `datapipe-e2e`, - anon-download for browser images), MongoDB 27017, Label Studio :8080. + anon-download for browser images), MongoDB 27017, Label Studio :8080, ClickHouse :8123 (ops run logs). - **Env:** `cp .env.example .env` then `set -a && source .env && set +a` before any `datapipe` command - (`config.py` raises if `DB_URL` unset). Detection/keypoints use separate schemas. + (`config.py` raises if `DB_URL` or `CLICKHOUSE_RUN_LOGS_URL` unset). Separate schemas: + `DB_SCHEMA_DETECTION`, `DB_SCHEMA_KEYPOINTS`, `DB_SCHEMA_CLASSIFICATION`. - **LS API token:** :8080 → Account & Settings → Access Token → `LABEL_STUDIO_API_KEY=...` in `.env` (or `scripts/label_studio_token.py`). -- **GPU for training** (no CPU knob). **≥10 annotated images** to freeze a dataset (`min_delta=10`). +- **GPU for training.** YOLO has no CPU knob. TF classification needs GPU **or** + `CUDA_VISIBLE_DEVICES=` (empty) so `cpu_training_allowed` passes. **≥10 annotated images** to + freeze (`min_delta=10`). - Read-only/small `/home`: `export UV_CACHE_DIR=/tmp/uvcache HF_HOME=/tmp/hf` before `uv sync`. -- Stages: `annotation`, `ls-sync`, `train`, `fiftyone`. +- Stages: `annotation`, `train`, `fiftyone`. ## Quick demo to verify setup -Skip if you have data: `uv run python scripts/seed_sample_data.py` downloads ~20 COCO images (10 cat/dog + 10 person keypoints; `--detection-limit`/`--keypoints-limit` to change) and uploads them to MinIO; then run §Run as-is. +Skip if you have data: `uv run python scripts/seed_sample_data.py` downloads COCO images (cat/dog, +person keypoints; limit flags to change) and uploads them to MinIO; then run §Run as-is. +For classification add `--classification-animal-limit 12 --classification-no-animal-limit 12` +to seed mixed Has Animal / No Animals images for Label Studio. ## Run (from the project subdir) ```bash -cd image_detection # or image_keypoints -source ../.venv/bin/activate # else prefix every command with `uv run` +cd image_detection # or image_keypoints / image_classification set -a && source ../.env && set +a # config raises w/o DB_URL -datapipe db create-all -datapipe step --labels=stage=annotation run # LS tasks + pre-annotations +uv run datapipe db create-all +uv run datapipe --executor RayExecutor step --labels=stage=annotation run # LS tasks (+ YOLO pre-anns for det/kp) # → annotate ≥10 images in LS (:8080), mark completed → -datapipe step --labels=stage=ls-sync run # → image__ground_truth -datapipe step --labels=stage=train run # freeze + train YOLO + metrics + best -datapipe step --labels=stage=fiftyone run -fiftyone app launch datapipe_detection_e2e # or datapipe_keypoints_e2e +uv run datapipe --executor RayExecutor step --labels=stage=annotation run # sync annotations → image__ground_truth +uv run datapipe --executor RayExecutor step --labels=stage=train run +uv run datapipe --executor RayExecutor step --labels=stage=fiftyone run +uv run fiftyone app launch datapipe_detection_e2e # or datapipe_keypoints_e2e / datapipe_classification_e2e ``` -Train uses `yolov8n*.pt` (imgsz 320, 30 ep); pre-annotation fallback `yolo11n*.pt`; best on `subset_id=val`. ## Skip annotation — inject ground truth (unattended / demo) -No human in Label Studio? You can bypass `annotation`/`ls-sync` by writing `image__ground_truth` + -`image__subset` directly, then run `stage=train`. **The injected rows MUST follow the pipeline's own -conventions, or the freeze join silently yields nothing / classes don't match:** -- **`image_name` must equal what `list_s3_images` emits** — the key **relative to `INPUT_IMAGES_DIR` - (`$DATAPIPE_E2E_DIR/images`)**, i.e. the plain object name (`000000008458.jpg`). Don't invent a - prefixed form — if `s3_images` has `X` and your GT has `pfx___X`, the `GT ⋈ subset ⋈ s3_images` join - is empty → `freeze_dataset` fails with `No ground truth`. -- **`labels` must match `DETECTION_CLASSES` casing** (e.g. `Cat`/`Dog`, not COCO lowercase `cat`/`dog`) - — otherwise predictions and GT land in *different* classes and every metric is 0. -- **`bboxes`** = pixel `[x1,y1,x2,y2]`; assign `image__subset.subset_id` (`train`/`val`) yourself. -- Write via datapipe `DataStore`/`UpdateExternalTable` (keeps `*_meta` in sync) — not raw SQL `UPDATE` - on PK columns. Then `datapipe step --labels=stage=train run` (skip `annotation`/`ls-sync`). +No human in Label Studio? Bypass `annotation` by writing `image__ground_truth` + `image__subset`, +then run `stage=train`. **Rows MUST follow the pipeline's conventions:** +- **`image_name` must equal what `list_s3_images` emits** — key relative to `INPUT_IMAGES_DIR` + (`$DATAPIPE_E2E_DIR/images`), plain object name (`000000008458.jpg`). +- **Detection/keypoints:** `labels` match class casing; `bboxes` = pixel `[x1,y1,x2,y2]`. +- **Classification:** scalar `label` column (`Has Animal` / `No Animals`) — not a JSON list. +- Write via datapipe `DataStore`/`UpdateExternalTable` (keeps `*_meta` in sync) — not raw SQL + `UPDATE` on PK columns. ## Per-scenario tag metrics → see the dedicated example Want to tag a scenario (e.g. dark-room pallets), add it to training, and measure the model on that scenario separately (baseline vs retrained)? That lives as its own self-contained example — -`examples/detection_tags` (`tag`/`image__tag`/`tag_metrics` built into the pipeline, **no Label Studio -or FiftyOne**, ground truth injected). Use the **setup-detection-tags** skill. +`examples/detection_tags`. Use the **setup-detection-tags** skill. ## Troubleshooting (may already be fixed — verify against current files) -- **No model after `train`, exit 0** → datapipe swallows step errors; check `detection_training_status`, not the exit code. -- **Demo pre-annotations are empty** → the fallback `DETECTION_MODEL_CONFIG` is a smoke model (`yolo11n`, `input_size:[16,16]`, `score_threshold:0.01`) used until a trained model exists, so it detects almost nothing. Expected for the demo; for useful pre-annotations set a real model + `input_size`/`score_threshold`. -- **Training metrics ~0** → not a config bug: the trained model is `yolov8n` (imgsz 320, 30 ep), and the seed sample (~20 images) is simply too small to learn from. Real metrics need enough annotated data. +- **No model after `train`, exit 0** → datapipe swallows step errors; check `*_training_status`, not the exit code. +- **TF train fails with "GPU not found"** → set `CUDA_VISIBLE_DEVICES=` (empty) for CPU, or use a real GPU. +- **Demo detection pre-annotations are empty** → fallback `DETECTION_MODEL_CONFIG` is a smoke model until a trained model exists. +- **Training metrics ~0** → seed sample is small; real metrics need enough annotated data. +- **`SIGILL` / pre-AVX2 CPU** → same as **setup-detection-tags**: `uv sync --extra ray --extra old-cpu`, reinstall + `polars-lts-cpu==1.33.1`, and `pi-heif` if ultralytics image verification fails. - **`cv_pipeliner` keypoint pre-annotation is broken** (pinned rev): inferencer drops keypoints, LS parser doesn't apply them → keypoint `train` needs real keypoint GT injected. diff --git a/.github/workflows/e2e-template.yml b/.github/workflows/e2e-template.yml index 98299ebb1..64a1475ea 100644 --- a/.github/workflows/e2e-template.yml +++ b/.github/workflows/e2e-template.yml @@ -11,6 +11,10 @@ on: - "tests/e2e_template/**" - "libs/datapipe-core/**" - "libs/datapipe-label-studio/**" + - "libs/datapipe-app/**" + - "libs/datapipe-app-ml-ops/**" + - "libs/datapipe-ui/**" + - "libs/datapipe-ui-ml/**" - "libs/datapipe-ml/**" - "pyproject.toml" pull_request: @@ -22,6 +26,10 @@ on: - "tests/e2e_template/**" - "libs/datapipe-core/**" - "libs/datapipe-label-studio/**" + - "libs/datapipe-app/**" + - "libs/datapipe-app-ml-ops/**" + - "libs/datapipe-ui/**" + - "libs/datapipe-ui-ml/**" - "libs/datapipe-ml/**" - "pyproject.toml" @@ -40,6 +48,7 @@ env: DB_URL: postgresql+psycopg://postgres:password@localhost:5432/postgres DB_SCHEMA_DETECTION: datapipe_e2e_detection DB_SCHEMA_KEYPOINTS: datapipe_e2e_keypoints + CLICKHOUSE_RUN_LOGS_URL: clickhouse://default:@localhost:8123/default FIFTYONE_DATABASE_URI: mongodb://localhost:27017 jobs: diff --git a/.github/workflows/lib-datapipe-app-ml-ops.yml b/.github/workflows/lib-datapipe-app-ml-ops.yml new file mode 100644 index 000000000..11993b5ab --- /dev/null +++ b/.github/workflows/lib-datapipe-app-ml-ops.yml @@ -0,0 +1,76 @@ +name: datapipe-app-ml-ops + +on: + push: + branches: + - "master" + - "v**" + paths: + - ".github/workflows/lib-datapipe-app-ml-ops.yml" + - "libs/datapipe-app-ml-ops/**" + - "libs/datapipe-app/**" + - "libs/datapipe-core/**" + - "libs/datapipe-ml/**" + - "pyproject.toml" + pull_request: + branches: + - "**" + paths: + - ".github/workflows/lib-datapipe-app-ml-ops.yml" + - "libs/datapipe-app-ml-ops/**" + - "libs/datapipe-app/**" + - "libs/datapipe-core/**" + - "libs/datapipe-ml/**" + - "pyproject.toml" + +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + steps: + - uses: actions/checkout@v5 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + cache: pip + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Install dependencies with uv + run: uv sync --package datapipe-app-ml-ops --group dev + + - name: Lint with mypy + run: | + uv run --package datapipe-app-ml-ops mypy -p datapipe_app_ml_ops --ignore-missing-imports --follow-imports=silent --namespace-packages --check-untyped-defs + + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + steps: + - uses: actions/checkout@v5 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + cache: pip + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Install dependencies with uv + run: uv sync --package datapipe-app-ml-ops --group dev + + - name: Test with pytest + run: uv run --package datapipe-app-ml-ops pytest libs/datapipe-app-ml-ops/tests -q diff --git a/.github/workflows/lib-datapipe-app.yml b/.github/workflows/lib-datapipe-app.yml index 6af6f0c0e..fe9916131 100644 --- a/.github/workflows/lib-datapipe-app.yml +++ b/.github/workflows/lib-datapipe-app.yml @@ -9,7 +9,9 @@ on: - ".github/workflows/lib-datapipe-app.yml" - "examples/datapipe_app/**" - "libs/datapipe-app/**" + - "libs/datapipe-app-ml-ops/**" - "libs/datapipe-core/**" + - "libs/datapipe-ml/**" - "pyproject.toml" pull_request: branches: @@ -18,7 +20,9 @@ on: - ".github/workflows/lib-datapipe-app.yml" - "examples/datapipe_app/**" - "libs/datapipe-app/**" + - "libs/datapipe-app-ml-ops/**" - "libs/datapipe-core/**" + - "libs/datapipe-ml/**" - "pyproject.toml" jobs: @@ -44,8 +48,10 @@ jobs: - name: Install dependencies with uv run: | uv pip install --system -e "libs/datapipe-core[sqlite]" - uv pip install --system -e "libs/datapipe-app" --no-deps - uv pip install --system "fastapi>=0.69.0" "uvicorn[standard]>=0.17.0" "click>=7.1.2" "rich>=13.3.2" "pydantic-settings>=2.0.0" "starlette-exporter" "opentelemetry-instrumentation-fastapi>=0.35b0" "flake8" "mypy" "httpx" + uv pip install --system -e "libs/datapipe-ml[sqlite]" + uv pip install --system -e "libs/datapipe-app[clickhouse]" + uv pip install --system -e "libs/datapipe-app-ml-ops" --no-deps + uv pip install --system "flake8" "mypy" - name: Lint with flake8 run: | @@ -78,8 +84,10 @@ jobs: - name: Install dependencies with uv run: | uv pip install --system -e "libs/datapipe-core[sqlite]" - uv pip install --system -e "libs/datapipe-app" --no-deps - uv pip install --system "fastapi>=0.69.0" "uvicorn[standard]>=0.17.0" "click>=7.1.2" "rich>=13.3.2" "pydantic-settings>=2.0.0" "starlette-exporter" "opentelemetry-instrumentation-fastapi>=0.35b0" "httpx" "pytest<8" + uv pip install --system -e "libs/datapipe-ml[sqlite]" + uv pip install --system -e "libs/datapipe-app[clickhouse]" + uv pip install --system -e "libs/datapipe-app-ml-ops" --no-deps + uv pip install --system "pytest<8" - name: Test with pytest run: | @@ -105,13 +113,11 @@ jobs: enable-cache: true - name: Install dependencies with uv - run: | - uv pip install --system -e "libs/datapipe-core[sqlite]" - uv pip install --system -e "libs/datapipe-app" --no-deps - uv pip install --system "fastapi>=0.69.0" "uvicorn[standard]>=0.17.0" "click>=7.1.2" "rich>=13.3.2" "pydantic-settings>=2.0.0" "starlette-exporter" "opentelemetry-instrumentation-fastapi>=0.35b0" "alembic" + working-directory: examples/datapipe_app + run: uv sync - name: Test example + working-directory: examples/datapipe_app run: | - cd examples/datapipe_app - datapipe db create-all - datapipe run + uv run alembic upgrade head + uv run datapipe run --no-callbacks diff --git a/.github/workflows/lib-datapipe-ui.yml b/.github/workflows/lib-datapipe-ui.yml new file mode 100644 index 000000000..b2db9155b --- /dev/null +++ b/.github/workflows/lib-datapipe-ui.yml @@ -0,0 +1,114 @@ +name: datapipe-ui + +on: + push: + branches: + - "master" + - "v**" + paths: + - ".github/workflows/lib-datapipe-ui.yml" + - "libs/datapipe-ui/**" + - "libs/datapipe-ui-ml/**" + - "package.json" + - "yarn.lock" + pull_request: + branches: + - "**" + paths: + - ".github/workflows/lib-datapipe-ui.yml" + - "libs/datapipe-ui/**" + - "libs/datapipe-ui-ml/**" + - "package.json" + - "yarn.lock" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "18" + cache: yarn + cache-dependency-path: yarn.lock + + - name: Install frontend dependencies + run: yarn install --frozen-lockfile + + - name: Unit tests (@datapipe/ui core) + run: yarn workspace @datapipe/ui test + + - name: Unit tests (@datapipe/ui-ml) + run: yarn workspace @datapipe/ui-ml test + + - name: Production build smoke test (@datapipe/ui-ml) + run: yarn workspace @datapipe/ui-ml test:build + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "18" + cache: yarn + cache-dependency-path: yarn.lock + + - name: Install frontend dependencies + run: yarn install --frozen-lockfile + + - name: Build core SPA + run: yarn workspace @datapipe/ui build + + - name: Build ML SPA + run: yarn workspace @datapipe/ui-ml build + + - name: Package core static assets for Python wheel + run: yarn workspace @datapipe/ui build:package + + - name: Package ML static assets for Python wheel + run: yarn workspace @datapipe/ui-ml build:package + + test-python: + runs-on: ubuntu-latest + needs: + - build + steps: + - uses: actions/checkout@v5 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "18" + cache: yarn + cache-dependency-path: yarn.lock + + - name: Build packaged static assets + run: | + yarn install --frozen-lockfile + yarn workspace @datapipe/ui build:package + yarn workspace @datapipe/ui-ml build:package + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Test datapipe-ui Python package + run: | + uv pip install --system -e "libs/datapipe-ui" + uv pip install --system "pytest<8" + pytest libs/datapipe-ui/tests + + - name: Test datapipe-ui-ml Python package + run: | + uv pip install --system -e "libs/datapipe-ui-ml" + uv pip install --system "pytest<8" + pytest libs/datapipe-ui-ml/tests diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 02b50eaac..8dc0104a1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,6 +10,8 @@ on: - "datapipe-label-studio-v*" - "datapipe-cvat-v*" - "datapipe-app-v*" + - "datapipe-app-ml-ops-v*" + - "datapipe-ui-v*" jobs: build: @@ -28,9 +30,19 @@ jobs: datapipe-label-studio-v*) echo "package-name=datapipe-label-studio" >> "$GITHUB_OUTPUT" ;; datapipe-cvat-v*) echo "package-name=datapipe-cvat" >> "$GITHUB_OUTPUT" ;; datapipe-app-v*) echo "package-name=datapipe-app" >> "$GITHUB_OUTPUT" ;; + datapipe-app-ml-ops-v*) echo "package-name=datapipe-app-ml-ops" >> "$GITHUB_OUTPUT" ;; + datapipe-ui-v*) echo "package-name=datapipe-ui" >> "$GITHUB_OUTPUT" ;; *) echo "Unsupported tag: ${GITHUB_REF_NAME}" >&2; exit 1 ;; esac + - name: Set up Node.js + if: steps.package.outputs.package-name == 'datapipe-ui' + uses: actions/setup-node@v4 + with: + node-version: "18" + cache: yarn + cache-dependency-path: yarn.lock + - name: Install the latest version of uv uses: astral-sh/setup-uv@v5 with: @@ -38,6 +50,10 @@ jobs: - name: Build wheel run: | + if [ "${{ steps.package.outputs.package-name }}" = "datapipe-ui" ]; then + yarn install --frozen-lockfile + yarn workspace @datapipe/ui build:package + fi uv build --package "${{ steps.package.outputs.package-name }}" - name: Store the distribution packages diff --git a/.gitignore b/.gitignore index 63533d7dd..82951a90c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,87 @@ +# Secrets & local env .env +.env.* +# VCS & IDE +.git/ +.github/* +!.github/workflows/ +!.github/workflows/** .DS_Store -.idea +.idea/ + +# Python .mypy_cache/ .pytest_cache/ +.ruff_cache/ .venv/ venv/ __pycache__/ *.egg-info dist/ +*.pyc .vscode/sftp.json -test_data/ - +# Lock files (deps resolved inside the image) poetry.lock uv.lock +# ...except detection_tags: its whole point is reproducible cross-machine runs — the lock pins the +# training stack (ultralytics etc.); without it every machine resolves different versions. +!examples/detection_tags/uv.lock + +# ML models & checkpoints *.pt -*.sqlite \ No newline at end of file +*.pth +*.onnx +*.ckpt +*.weights +*.safetensors +*.h5 +*.pb +*.tflite + +# Databases & local stores +*.sqlite +*.sqlite3 +*.db + +# Images & media (keep .svg — used in datapipe-app frontend src) +*.jpg +*.jpeg +*.png +*.gif +*.webp +*.bmp +*.tiff +*.tif +*.ico +*.mp4 +*.mov +*.avi +*.mkv + +# Tabular / binary datasets +*.parquet +*.feather +*.arrow +*.npy +*.npz + +# Archives +*.zip +*.tar +*.tar.gz +*.tgz +*.7z + +# Node +**/node_modules/ + + +# Test & sample data +test_data/ +**/sample_data/ +datapipe-examples/ +examples/**/input/ +examples/**/output/ +uv.lock \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..4dde033b1 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +# Frontend builds for Datapipe Ops UI (monorepo root). +# +# make build-datapipe-ui # core-only SPA → libs/datapipe-ui/datapipe_ui/static +# make build-datapipe-ui-ml # core + ML plugin SPA → libs/datapipe-ui-ml/datapipe_ui_ml/static +# make build-datapipe-ui-all # both packages in parallel (after one yarn install) + +.PHONY: install-frontend build-datapipe-ui build-datapipe-ui-ml build-datapipe-ui-all \ + _build-datapipe-ui-package _build-datapipe-ui-ml-package + +install-frontend: + yarn install + +_build-datapipe-ui-package: + $(MAKE) -C libs/datapipe-ui build-package + +_build-datapipe-ui-ml-package: + $(MAKE) -C libs/datapipe-ui-ml build-package + +build-datapipe-ui: install-frontend _build-datapipe-ui-package + +build-datapipe-ui-ml: install-frontend _build-datapipe-ui-ml-package + +# One install, then both CRA builds concurrently. +build-datapipe-ui-all: install-frontend + $(MAKE) -j2 _build-datapipe-ui-package _build-datapipe-ui-ml-package diff --git a/docs/source/reference/cli.md b/docs/source/reference/cli.md index 8936a425c..e16ae012e 100644 --- a/docs/source/reference/cli.md +++ b/docs/source/reference/cli.md @@ -60,7 +60,16 @@ This set of flags turns on different exporters for OpenTelemetry ### `create-all` `datapipe db create-all` is a handy shortcut for local development. It makes -datapipe to create all known SQL tables in a configured database. +datapipe create all known SQL tables in a configured database. When the optional +``datapipe-core[alembic]`` extra is installed, it also syncs existing tables to +the current metadata (ADD COLUMN / ALTER) via Alembic's autogenerate API — +without writing migration files. Tables present in the DB but absent from +pipeline metadata are not dropped. Without Alembic, only missing tables are +created (``create_all``); a skip message is printed for the sync step. + +* `--force-recreate` — drop all known SQL tables first, then create them again. + **Destructive:** existing data in those tables is deleted. Use when you want + a clean local schema instead of in-place alters. ## `lint` diff --git a/examples/datapipe_app/Dockerfile b/examples/datapipe_app/Dockerfile index 2bf2b19a7..7c85da040 100644 --- a/examples/datapipe_app/Dockerfile +++ b/examples/datapipe_app/Dockerfile @@ -1,24 +1,34 @@ FROM node:18.7.0-slim AS frontend-build WORKDIR /srv -COPY libs/datapipe-app/frontend/ /srv/ +COPY package.json yarn.lock ./ +COPY libs/datapipe-ui/package.json libs/datapipe-ui/ +COPY libs/datapipe-ui-ml/package.json libs/datapipe-ui-ml/ +COPY libs/datapipe-ui ./libs/datapipe-ui +COPY libs/datapipe-ui-ml ./libs/datapipe-ui-ml -RUN yarn && yarn build +RUN yarn install --frozen-lockfile +RUN yarn workspace @datapipe/ui build FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 +ENV DB_CONN_URI=sqlite+pysqlite3:///store.sqlite WORKDIR /app -COPY pyproject.toml uv.lock ./ +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv + COPY libs/datapipe-core ./libs/datapipe-core +COPY libs/datapipe-ui ./libs/datapipe-ui COPY libs/datapipe-app ./libs/datapipe-app COPY examples/datapipe_app ./examples/datapipe_app -COPY --from=frontend-build /srv/build ./libs/datapipe-app/datapipe_app/frontend - -RUN pip install uv && uv pip install --system -e "libs/datapipe-core[sqlite]" -e "libs/datapipe-app" +COPY --from=frontend-build /srv/libs/datapipe-ui/build ./libs/datapipe-ui/datapipe_ui/static WORKDIR /app/examples/datapipe_app -CMD uvicorn app:app --host=0.0.0.0 --port=${PORT:-8000} +RUN uv sync --frozen --no-dev && uv run alembic upgrade head + +EXPOSE 8000 + +CMD ["uv", "run", "datapipe", "api", "--host", "0.0.0.0", "--port", "8000"] diff --git a/examples/datapipe_app/README.md b/examples/datapipe_app/README.md new file mode 100644 index 000000000..72e5b3628 --- /dev/null +++ b/examples/datapipe_app/README.md @@ -0,0 +1,98 @@ +# Datapipe App example (SQLite + Alembic) + +Minimal pipeline with `datapipe-app[ui]`: three SQL tables, one batch transform, Ops UI. +No `datapipe-app-ml-ops`. + +Pipeline tables and datapipe metadata are managed with **Alembic**, not `datapipe db create-all`. +Ops observability tables are created automatically on the first `datapipe api` / `datapipe run`. + +## Setup + +From this directory: + +```bash +uv sync +export DB_CONN_URI="${DB_CONN_URI:-sqlite+pysqlite3:///store.sqlite}" +uv run alembic upgrade head +``` + +## Run + +```bash +# one pipeline pass (empty DB → no-op on transforms) +uv run datapipe run + +# Ops UI + API +uv run datapipe api --port 8000 +``` + +Open http://localhost:8000 — graph, tables, runs (when recorded). + +## Database URL + +Default: `sqlite+pysqlite3:///store.sqlite` in the example directory. + +PostgreSQL: + +```bash +export DB_CONN_URI=postgresql://postgres:postgres@localhost:5432/postgres +uv run alembic upgrade head +``` + +`alembic/env.py` reads the URL from `app.ds.meta_dbconn` (same as `DB_CONN_URI` in `app.py`). + +## Alembic + +Config: `alembic.ini`, scripts in `alembic/versions/`. + +### Apply migrations (normal workflow) + +```bash +uv run alembic upgrade head # latest +uv run alembic upgrade +1 # one step forward +uv run alembic current # show revision +uv run alembic history # list revisions +``` + +### Roll back + +```bash +uv run alembic downgrade -1 # one step back +uv run alembic downgrade # to a specific revision +uv run alembic downgrade base # empty schema (destructive) +``` + +### Generate a new migration + +After changing `catalog` / `TableStoreDB` schemas or datapipe metadata in `app.py`: + +```bash +# empty DB or backup first — autogenerate diffs against live DB +uv run alembic revision --autogenerate -m "describe change" +# review alembic/versions/.py, then: +uv run alembic upgrade head +``` + +`env.py` sets `target_metadata` from `app.ds.meta_dbconn.sqla_metadata`, so autogenerate sees pipeline meta tables. +Data tables use `create_table=False` in `app.py` and are included when their models are registered on that metadata. + +**Do not use** `datapipe db create-all` in this example — it bypasses migration history and can drift from `alembic/versions/`. + +## Docker + +From repository root: + +```bash +docker build -f examples/datapipe_app/Dockerfile -t datapipe-app-example . +docker run --rm -p 8000:8000 datapipe-app-example +``` + +The image runs `alembic upgrade head` at build time, then `datapipe api` on start. + +## Layout + +| File | Role | +|------|------| +| `app.py` | `Catalog`, `Pipeline`, `DatapipeAPI` | +| `alembic/` | schema migrations | +| `pyproject.toml` | uv project; editable `datapipe-app` / `datapipe-core` | diff --git a/examples/datapipe_app/alembic/README b/examples/datapipe_app/alembic/README index 98e4f9c44..80674ff82 100644 --- a/examples/datapipe_app/alembic/README +++ b/examples/datapipe_app/alembic/README @@ -1 +1,3 @@ -Generic single-database configuration. \ No newline at end of file +Alembic migrations for this example. + +See ../README.md — sections **Alembic** (upgrade / downgrade / autogenerate) and **Setup**. diff --git a/examples/datapipe_app/alembic/env.py b/examples/datapipe_app/alembic/env.py index 3458d0be5..77e8c7c34 100644 --- a/examples/datapipe_app/alembic/env.py +++ b/examples/datapipe_app/alembic/env.py @@ -12,10 +12,6 @@ if config.config_file_name is not None: fileConfig(config.config_file_name) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata from app import app target_metadata = [app.ds.meta_dbconn.sqla_metadata] diff --git a/examples/datapipe_app/app.py b/examples/datapipe_app/app.py index a86ca214c..17a8b3ce9 100644 --- a/examples/datapipe_app/app.py +++ b/examples/datapipe_app/app.py @@ -2,12 +2,12 @@ from typing import Tuple import pandas as pd -from datapipe.compute import Catalog, DataStore, Pipeline, Table +from datapipe.compute import Catalog, Pipeline, Table +from datapipe.datatable import DataStore from datapipe.step.batch_transform import BatchTransform from datapipe.store.database import DBConn, TableStoreDB -from sqlalchemy import JSON, Boolean, Column, Integer, String - from datapipe_app import DatapipeAPI +from sqlalchemy import JSON, Boolean, Column, Integer, String DB_CONN_URI = os.environ.get("DB_CONN_URI", "sqlite+pysqlite3:///store.sqlite") @@ -16,45 +16,46 @@ # dbconn = DBConn("postgresql+psycopg://postgres:postgres@localhost:5432/postgres") dbconn = DBConn(DB_CONN_URI) -catalog = Catalog( - { - "events": Table( - store=TableStoreDB( - name="events", - dbconn=dbconn, - data_sql_schema=[ - Column("user_id", Integer(), primary_key=True), - Column("event_id", Integer(), primary_key=True), - Column("event", JSON()), - ], - create_table=False, - ) - ), - "user_profile": Table( - store=TableStoreDB( - name="user_profile", - dbconn=dbconn, - data_sql_schema=[ - Column("user_id", Integer(), primary_key=True), - Column("offer_clicks", JSON()), - Column("events_count", Integer()), - Column("active", Boolean()), - ], - create_table=False, - ) - ), - "user_lang": Table( - store=TableStoreDB( - name="user_lang", - dbconn=dbconn, - data_sql_schema=[ - Column("user_id", Integer(), primary_key=True), - Column("lang", String(length=100)), - ], - create_table=False, - ) - ), - } +events_tbl = Table( + name="events", + store=TableStoreDB( + name="events", + dbconn=dbconn, + data_sql_schema=[ + Column("user_id", Integer(), primary_key=True), + Column("event_id", Integer(), primary_key=True), + Column("event", JSON()), + ], + create_table=False, + ), +) + +user_profile_tbl = Table( + name="user_profile", + store=TableStoreDB( + name="user_profile", + dbconn=dbconn, + data_sql_schema=[ + Column("user_id", Integer(), primary_key=True), + Column("offer_clicks", JSON()), + Column("events_count", Integer()), + Column("active", Boolean()), + ], + create_table=False, + ), +) + +user_lang_tbl = Table( + name="user_lang", + store=TableStoreDB( + name="user_lang", + dbconn=dbconn, + data_sql_schema=[ + Column("user_id", Integer(), primary_key=True), + Column("lang", String(length=100)), + ], + create_table=False, + ), ) @@ -90,12 +91,12 @@ def agg_profile(df: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]: steps=[ BatchTransform( agg_profile, - inputs=["events"], - outputs=["user_profile", "user_lang"], + inputs=[events_tbl], + outputs=[user_profile_tbl, user_lang_tbl], ), ] ) ds = DataStore(dbconn, create_meta_table=False) -app = DatapipeAPI(ds, catalog, pipeline) +app = DatapipeAPI(ds, Catalog({}), pipeline) diff --git a/examples/datapipe_app/pyproject.toml b/examples/datapipe_app/pyproject.toml new file mode 100644 index 000000000..2a0b50927 --- /dev/null +++ b/examples/datapipe_app/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "datapipe-app-example" +version = "0" +description = "Minimal Datapipe App example (SQLite, Alembic migrations, no ML ops)" +requires-python = ">=3.10,<3.13" +dependencies = [ + "alembic", + "datapipe-app[ui]", + "datapipe-core[sqlite]", +] + +[tool.uv.sources] +datapipe-app = { path = "../../libs/datapipe-app", editable = true } +datapipe-core = { path = "../../libs/datapipe-core", editable = true } +datapipe-ui = { path = "../../libs/datapipe-ui", editable = true } diff --git a/examples/e2e_template/image_keypoints/data.py b/examples/e2e_template/image_keypoints/data.py index ab3ae169d..e6632113c 100644 --- a/examples/e2e_template/image_keypoints/data.py +++ b/examples/e2e_template/image_keypoints/data.py @@ -1,12 +1,11 @@ from __future__ import annotations +from config import DBCONN, FIFTYONE_DATASET_NAME, KEYPOINTS_LABELS from cv_pipeliner.utils.fiftyone import FifyOneSession -from datapipe_ml.utils.image_data_stores import FiftyOneImagesDataTableStore from datapipe.compute import Catalog, Table from datapipe.store.database import TableStoreDB -from sqlalchemy import Column, Float, JSON, String - -from config import DBCONN, FIFTYONE_DATASET_NAME +from datapipe_ml.utils.image_data_stores import FiftyOneImagesDataTableStore +from sqlalchemy import JSON, Column, Float, String fo_session = FifyOneSession() @@ -119,6 +118,7 @@ fo_session=fo_session, fo_detections_label="annotations_bbox", fo_keypoints_label="annotations_keypoints", + keypoints_labels=KEYPOINTS_LABELS, rm_only_fo_fields=True, primary_schema=[Column("image_name", String(255), primary_key=True)], ) diff --git a/libs/datapipe-app-ml-ops/README.md b/libs/datapipe-app-ml-ops/README.md new file mode 100644 index 000000000..14bb4003c --- /dev/null +++ b/libs/datapipe-app-ml-ops/README.md @@ -0,0 +1,43 @@ +# datapipe-app-ml-ops + +Python backend for ML observability in the Ops dashboard: metrics, training runs, frozen datasets, class metrics, ops-spec tables, and image record browsers. + +Registered via entry points (`datapipe.observability`, `datapipe.v1alpha3_extensions`, …). Installed automatically with `datapipe-app[ml]`. UI for these endpoints lives in [`datapipe-ui-ml`](../datapipe-ui-ml/). + +## Install + +```bash +uv sync --package datapipe-app-ml-ops --group dev +``` + +Or as part of the ML stack: + +```bash +uv pip install -e "libs/datapipe-app[ml]" +``` + +Requires `datapipe-ml` observability tables when metrics/training data is used. + +## Tests + +```bash +uv run --package datapipe-app-ml-ops pytest libs/datapipe-app-ml-ops/tests -q +``` + +Lint: + +```bash +uv run --package datapipe-app-ml-ops mypy -p datapipe_app_ml_ops \ + --ignore-missing-imports --follow-imports=silent --namespace-packages --check-untyped-defs +``` + +CI: `.github/workflows/lib-datapipe-app-ml-ops.yml` + +## Layout + +``` +datapipe_app_ml_ops/ + observability/ # routes, metrics/training services, DB models + ops/ # ops-spec registry, image records, validation + viz/ # image visualization helpers +``` diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/__init__.py new file mode 100644 index 000000000..32ac07023 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/__init__.py @@ -0,0 +1 @@ +"""ML ops specs and observability addon for datapipe-app.""" diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/__init__.py new file mode 100644 index 000000000..db8cae8ce --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/__init__.py @@ -0,0 +1,6 @@ +"""ML observability hooks and plugins. + +Entry point for plugin registration: ``datapipe_app_ml_ops.observability.plugin:register``. +""" + +__all__: list[str] = [] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/anomaly.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/anomaly.py new file mode 100644 index 000000000..2d18aed57 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/anomaly.py @@ -0,0 +1,202 @@ +from __future__ import annotations + +import statistics +from typing import Optional + +from datapipe_app_ml_ops.observability.schemas.models import AnomalyItem, KpiItem, MetricsRunRow + + +PRIMARY_METRIC_BY_TASK = { + "detection": "mAP50_95", + "classification": "weighted_f1_score", + "keypoints": "pose_mAP50_95", + "segmentation": "mAP50_95", +} + +FALLBACK_METRICS = [ + "mAP50_95", + "mAP50", + "f1_score", + "weighted_f1_score", + "macro_f1_score", + "weighted_without_pseudo_classes_f1_score", + "macro_without_pseudo_classes_f1_score", + "pose_mAP50_95", +] + +# Support / instance counts are not comparable quality metrics; they must never be +# used to rank runs (otherwise a run with all-null metrics but a large support +# would win the "best model" selection). +COUNT_METRIC_KEYS = { + "images_support", + "support", + "TP", + "FP", + "FN", + "TP_extra_bbox", + "FP_extra_bbox", + "FN_extra_bbox", +} + + +def primary_metric_for_task(task_type: Optional[str], *, primary_metric: Optional[str] = None) -> str: + if primary_metric: + return primary_metric + if task_type and task_type in PRIMARY_METRIC_BY_TASK: + return PRIMARY_METRIC_BY_TASK[task_type] + return "f1_score" + + +def pick_primary_value( + metrics: dict[str, float | None], + task_type: Optional[str], + *, + primary_metric: Optional[str] = None, +) -> Optional[float]: + primary = primary_metric_for_task(task_type, primary_metric=primary_metric) + if metrics.get(primary) is not None: + return metrics.get(primary) + for key in FALLBACK_METRICS: + if metrics.get(key) is not None: + return metrics.get(key) + for key, v in metrics.items(): + if v is not None and key not in COUNT_METRIC_KEYS: + return v + return None + + +def compute_deltas(current: MetricsRunRow, previous: Optional[MetricsRunRow]) -> None: + if previous is None: + return + for key, val in current.metrics.items(): + prev = previous.metrics.get(key) + if val is None or prev is None: + continue + delta = val - prev + current.deltas[key] = delta + if prev != 0: + current.delta_pct[key] = (delta / abs(prev)) * 100.0 + + +def detect_anomalies(runs: list[MetricsRunRow], task_type: Optional[str]) -> list[AnomalyItem]: + if len(runs) < 2: + return [] + anomalies: list[AnomalyItem] = [] + latest, previous = runs[0], runs[1] + primary = primary_metric_for_task(task_type) + + recall_delta = None + latest_recall = latest.metrics.get("recall") + previous_recall = previous.metrics.get("recall") + if latest_recall is not None and previous_recall is not None: + recall_delta = latest_recall - previous_recall + if recall_delta <= -0.01: + anomalies.append( + AnomalyItem( + severity="warning", + metric="recall", + title=f"Recall dropped {recall_delta * 100:.1f}%", + description="Latest run recall below previous run", + run_id=latest.run_id, + value=latest.metrics.get("recall"), + expected=previous.metrics.get("recall"), + delta=recall_delta, + ) + ) + + f1_values: list[float] = [ + value for r in runs[1:11] if (value := r.metrics.get("f1_score")) is not None + ] + latest_f1 = latest.metrics.get("f1_score") + if f1_values and latest_f1 is not None: + mean = statistics.mean(f1_values) + stdev = statistics.pstdev(f1_values) if len(f1_values) > 1 else 0.0 + threshold = mean - 2 * stdev + if latest_f1 < threshold: + anomalies.append( + AnomalyItem( + severity="warning", + metric="f1_score", + title="F1 below rolling trend", + description=f"Latest F1 {latest_f1:.3f} below mean−2σ ({threshold:.3f})", + run_id=latest.run_id, + value=latest_f1, + expected=mean, + ) + ) + + latest_primary = latest.metrics.get(primary) + previous_primary = previous.metrics.get(primary) + if latest_primary is not None and previous_primary is not None: + if latest_primary < previous_primary: + anomalies.append( + AnomalyItem( + severity="info", + metric=primary, + title=f"{primary} regression", + description="Primary metric decreased vs previous run", + run_id=latest.run_id, + delta=latest_primary - previous_primary, + ) + ) + + support_latest = latest.metrics.get("support") + support_prev = previous.metrics.get("support") + if support_latest and support_prev and abs(support_latest - support_prev) / support_prev > 0.2: + anomalies.append( + AnomalyItem( + severity="info", + metric="support", + title="Support changed significantly", + description="Instance support differs >20% from previous run", + run_id=latest.run_id, + ) + ) + + return anomalies + + +def build_kpis(runs: list[MetricsRunRow], task_type: Optional[str], best: Optional[MetricsRunRow]) -> list[KpiItem]: + if not runs: + return [] + latest = runs[0] + kpi_defs = [ + ("mAP50", "mAP50"), + ("mAP50_95", "mAP50-95"), + ("weighted_f1_score", "Weighted F1"), + ("macro_f1_score", "Macro F1"), + ("weighted_precision", "Weighted Precision"), + ("weighted_recall", "Weighted Recall"), + ("accuracy", "Accuracy"), + ("precision", "Precision"), + ("recall", "Recall"), + ("f1_score", "F1 Score"), + ("iou_mean", "IoU mean"), + ] + seen_labels: set[str] = set() + kpis: list[KpiItem] = [] + for key, label in kpi_defs: + if latest.metrics.get(key) is None: + continue + if label in seen_labels: + continue + seen_labels.add(label) + trend = [ + {"x": r.run_id, "y": r.metrics.get(key)} + for r in reversed(runs[:10]) + if r.metrics.get(key) is not None + ] + kpis.append( + KpiItem( + key=key, + label=label, + value=latest.metrics.get(key), + delta_pct=latest.delta_pct.get(key), + format="integer" if key == "images_support" else "float", + higher_is_better=True, + trend=trend, + ) + ) + if len(kpis) >= 6: + break + return kpis diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/sql_analytics.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/sql_analytics.py new file mode 100644 index 000000000..887fc6349 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/analytics/sql_analytics.py @@ -0,0 +1,148 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Optional + +from sqlalchemy import func, select + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + +@dataclass(frozen=True) +class SqlAnalyticsContext: + schema_tables: list[dict[str, Any]] + + +def _pick_metric_table(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + for metric in spec.metrics: + if metric.id == "model_metrics": + return metric.table + for spec in registry.list(): + if spec.metrics: + return spec.metrics[0].table + return None + + +def _pick_class_metric_table(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + for metric in spec.class_metrics: + if metric.id == "subset_class_metrics": + return metric.table + for spec in registry.list(): + if spec.class_metrics: + return spec.class_metrics[0].table + return None + + +def _pick_training_table(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + if spec.training is not None: + return spec.training.status_table + return None + + +def _pick_model_table(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + if spec.model is not None: + return spec.model.table + return None + + +def _alias_entries(registry: OpsSpecRegistry) -> list[tuple[str, str]]: + entries: list[tuple[str, str]] = [] + metrics = _pick_metric_table(registry) + class_metrics = _pick_class_metric_table(registry) + training = _pick_training_table(registry) + model = _pick_model_table(registry) + + if metrics: + entries.append(("metrics_on_subset", metrics)) + entries.append(("predictions", metrics)) + if class_metrics: + entries.append(("metrics_by_class", class_metrics)) + if training: + entries.append(("training_runs", training)) + if model: + entries.append(("artifacts", model)) + elif training: + entries.append(("artifacts", training)) + return entries + + +def _owning_spec(registry: OpsSpecRegistry, table: str) -> DatapipeOpsSpec | None: + for spec in registry.list(): + if any(metric.table == table for metric in spec.metrics): + return spec + if any(metric.table == table for metric in spec.class_metrics): + return spec + if spec.training is not None and spec.training.status_table == table: + return spec + if spec.model is not None and spec.model.table == table: + return spec + return None + + +def _table_columns( + registry: OpsSpecRegistry, + *, + table: str, + ds: DataStore | None, + catalog: Catalog | None, +) -> list[dict[str, str]]: + spec = _owning_spec(registry, table) + if spec is None: + return [] + try: + schema = registry._schema_for(spec, table, catalog, ds) + except Exception: + return [] + return [{"name": column, "type": "unknown"} for column in sorted(schema.columns)] + + +def _table_row_count( + engine: Any, + *, + table: str, + catalog: Catalog | None, +) -> int: + if catalog is None or table not in catalog.catalog: + return 0 + store = catalog.catalog[table].store + data_table = getattr(store, "data_table", None) + if data_table is None: + return 0 + with engine.connect() as conn: + return int(conn.execute(select(func.count()).select_from(data_table)).scalar() or 0) + + +def build_sql_analytics_context( + registry: OpsSpecRegistry, + *, + ds: DataStore | None = None, + catalog: Catalog | None = None, + engine: Any = None, +) -> SqlAnalyticsContext: + schema_tables: list[dict[str, Any]] = [] + + for alias, physical in _alias_entries(registry): + row_count = 0 + if engine is not None: + try: + row_count = _table_row_count(engine, table=physical, catalog=catalog) + except Exception: + row_count = 0 + + schema_tables.append( + { + "name": alias, + "physical_table": physical, + "columns": _table_columns(registry, table=physical, ds=ds, catalog=catalog), + "row_count": row_count, + } + ) + + return SqlAnalyticsContext(schema_tables=schema_tables) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/api_plugin.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/api_plugin.py new file mode 100644 index 000000000..0b74855f9 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/api_plugin.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from typing import Any + +from fastapi import FastAPI + +from datapipe_app_ml_ops.observability.routes.routes import register_ml_observability_routes + + +def register_v1alpha3_extension( + *, + app: FastAPI, + store: Any, + registry: Any, + ds: Any, + catalog: Any, + ops_spec_registry: Any, + run_steps: Any = None, + **_: Any, +) -> None: + register_ml_observability_routes( + app, + store=store, + registry=registry, + ds=ds, + catalog=catalog, + ops_spec_registry=ops_spec_registry, + run_steps=run_steps, + ) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/columns.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/columns.py new file mode 100644 index 000000000..9298baa3a --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/columns.py @@ -0,0 +1,21 @@ +from datapipe_ml.metrics.common import ( + CLASS_METRIC_COLUMNS, + KNOWN_OVERALL_METRIC_COLUMNS, + OVERALL_BASE_METRIC_COLUMNS, + float_columns, + macro_weighted_metric_selects, + overall_metric_columns, + precision_recall_f1, + stable_unique, +) + +__all__ = [ + "CLASS_METRIC_COLUMNS", + "KNOWN_OVERALL_METRIC_COLUMNS", + "OVERALL_BASE_METRIC_COLUMNS", + "float_columns", + "macro_weighted_metric_selects", + "overall_metric_columns", + "precision_recall_f1", + "stable_unique", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/tables.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/tables.py new file mode 100644 index 000000000..9a0eade30 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/config/tables.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from dataclasses import asdict, dataclass + +from datapipe_app.observability.config.tables import validate_observability_table_names + + +@dataclass(frozen=True) +class MLObservabilityTableConfig: + metrics_candidates: str = "metrics_candidates" + + def __post_init__(self) -> None: + validate_observability_table_names(self) + + def table_names(self) -> dict[str, str]: + return asdict(self) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/db_plugin.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/db_plugin.py new file mode 100644 index 000000000..77e4c6026 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/db_plugin.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from typing import Any, cast + +from sqlalchemy import MetaData, Table + +from datapipe_app.observability.config.tables import ObservabilityTableConfig +from datapipe_app_ml_ops.observability.config.tables import MLObservabilityTableConfig +from datapipe_app_ml_ops.observability.store.db_models import ( + PipelineMetricsCandidateRow, + apply_ml_table_config, +) + + +def extend_observability_db( + *, + phase: str, + tables: ObservabilityTableConfig | None = None, + schema: str | None = None, + dbconn: Any = None, + metadata: MetaData | None = None, + **_kwargs: Any, +) -> None: + ml_tables = MLObservabilityTableConfig() + if phase == "apply_config": + apply_ml_table_config(tables=ml_tables, schema=schema) + return + + if phase != "register_metadata" or metadata is None or dbconn is None: + return + + apply_ml_table_config(tables=ml_tables, schema=dbconn.schema) + src = cast(Table, PipelineMetricsCandidateRow.__table__) + if not _metadata_has_table(metadata, src.name, dbconn.schema): + if dbconn.schema is not None: + src.to_metadata(metadata, schema=dbconn.schema) + else: + src.to_metadata(metadata) + + +def _metadata_has_table(metadata: MetaData, name: str, schema: str | None) -> bool: + for table in metadata.tables.values(): + if table.name == name and table.schema == schema: + return True + return False diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/metrics_service.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/metrics_service.py new file mode 100644 index 000000000..fa3d04843 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/metrics_service.py @@ -0,0 +1,1123 @@ +from __future__ import annotations + +import hashlib +import re +from dataclasses import dataclass, field +from datetime import datetime +from typing import Any, Optional +from urllib.parse import quote + +import pandas as pd +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app.observability.store.db import utc_now +from datapipe_app_ml_ops.observability.store.db_models import ( + PipelineMetricsCandidateRow, + add_metrics_candidate, + delete_metrics_candidate, + list_metrics_candidates, +) +from datapipe_app_ml_ops.observability.analytics.anomaly import ( + build_kpis, + compute_deltas, + detect_anomalies, + pick_primary_value, + primary_metric_for_task, +) +from datapipe_app_ml_ops.observability.schemas.metrics_schema import build_metric_schema +from datapipe_app_ml_ops.observability.schemas.models import ( + ClassMetricDetailResponse, + ClassMetricRow, + ClassMetricsResponse, + EntitySourceRecord, + FrozenDatasetCoverage, + FrozenDatasetDetailResponse, + FrozenDatasetLinkedModelRow, + FrozenDatasetRow, + FrozenDatasetsResponse, + MetricsCandidateCreate, + MetricsCandidateRow, + MetricsCandidatesResponse, + MetricsEntityResolveResponse, + MetricsModelDetailKpi, + MetricsModelDetailRelated, + MetricsModelDetailResponse, + MetricsModelRow, + MetricsRunRow, + MetricsRunsResponse, + MetricsSummaryResponse, + SplitCounts, +) + +from datapipe_app_ml_ops.observability.metrics.spec_catalog import ( + EntitySourceIndex, + TrainingLinkContext, + load_catalog_rows_from_specs, + load_entity_index_from_specs, + load_frozen_dataset_catalog_from_specs, + load_training_link_context_from_specs, + primary_metric_from_specs, +) +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + +METRIC_ALIASES = { + "mAP_0_5": "mAP50", + "mAP_0_5_to_0_95": "mAP50_95", +} + +_MODEL_COUNT_KEYS = frozenset( + { + "images_support", + "support", + "TP", + "FP", + "FN", + "TP_extra_bbox", + "FP_extra_bbox", + "FN_extra_bbox", + "images", + "objects", + "detections", + "false_positives", + "false_negatives", + } +) + + +def _candidate_row_from_db(row: Any) -> MetricsCandidateRow: + return MetricsCandidateRow( + id=row.id, + pipeline_id=row.pipeline_id, + model_id=row.model_id, + model_source=row.model_source, + artifact_uri=row.artifact_uri, + dataset_id=row.dataset_id, + subset=row.subset, + task_type=row.task_type, + metrics_state=row.metrics_state, + ) + + +def _load_candidates(store: Any, pipeline_id: str) -> list[MetricsCandidateRow]: + if store is None: + return [] + return [_candidate_row_from_db(row) for row in list_metrics_candidates(store, pipeline_id)] + + +def _spec_ready(ops_specs: OpsSpecRegistry | None) -> bool: + return ops_specs is not None and bool(ops_specs.list()) + + +def _load_entity_source_records( + ds: Optional[DataStore], + catalog: Optional[Catalog], + *, + candidates: Optional[list[MetricsCandidateRow]] = None, + ops_specs: OpsSpecRegistry | None = None, +) -> EntitySourceIndex: + if not _spec_ready(ops_specs) or ds is None or catalog is None: + return EntitySourceIndex() + assert ops_specs is not None + return load_entity_index_from_specs(ops_specs, ds, catalog, candidates=candidates) + + +def _load_catalog_rows( + ds: Optional[DataStore], + catalog: Optional[Catalog], + *, + ops_specs: OpsSpecRegistry | None = None, +) -> tuple[list[MetricsRunRow], list[tuple[str, ClassMetricRow, str]], Optional[str]]: + if not _spec_ready(ops_specs) or ds is None or catalog is None: + return [], [], None + assert ops_specs is not None + return load_catalog_rows_from_specs(ops_specs, ds, catalog) + + +def _load_training_link_context( + ds: DataStore, + catalog: Catalog, + *, + ops_specs: OpsSpecRegistry | None = None, +) -> TrainingLinkContext: + if not _spec_ready(ops_specs): + return TrainingLinkContext() + assert ops_specs is not None + return load_training_link_context_from_specs(ops_specs, ds, catalog) + + +def _load_frozen_dataset_catalog( + ds: Optional[DataStore], + catalog: Optional[Catalog], + *, + ops_specs: OpsSpecRegistry | None = None, +) -> tuple[list[FrozenDatasetRow], dict[str, FrozenDatasetRow], dict[str, str]]: + if not _spec_ready(ops_specs) or ds is None or catalog is None: + return [], {}, {} + assert ops_specs is not None + return load_frozen_dataset_catalog_from_specs(ops_specs, ds, catalog) + + +def _model_id_column_from_specs(ops_specs: OpsSpecRegistry | None, model_id: str) -> str: + if ops_specs is None: + return "model_id" + for spec in ops_specs.list(): + if spec.model is not None: + return spec.model.id_column + return "model_id" + + +def _dataset_id_column_from_specs(ops_specs: OpsSpecRegistry | None) -> str: + if ops_specs is None: + return "frozen_dataset_id" + for spec in ops_specs.list(): + if spec.frozen_dataset is not None: + return spec.frozen_dataset.id_column + return "frozen_dataset_id" + + +def _table_row_url( + pipeline_id: str, + table_name: str | None, + focus_col: str | None, + focus_value: str | None, +) -> str | None: + if not table_name or not focus_col or focus_value is None: + return None + qs = f"focus_col={quote(focus_col)}&focus_value={quote(str(focus_value))}" + return f"/pipelines/{quote(pipeline_id)}/tables/{quote(table_name)}?{qs}" + + +def _normalize_metric_key(key: str) -> str: + key = key.removeprefix("calc__") + return METRIC_ALIASES.get(key, key) + + +def _safe_float(val: Any) -> Optional[float]: + if val is None or (isinstance(val, float) and pd.isna(val)): + return None + if isinstance(val, str): + stripped = val.strip() + if stripped in {"-", "—"}: + return 0.0 + try: + return float(val) + except (TypeError, ValueError): + return None + + +def _safe_int(val: Any) -> Optional[int]: + f = _safe_float(val) + return int(f) if f is not None else None + + +def _run_id(model_id: str, subset: str, idx: int) -> str: + raw = f"{model_id}|{subset}|{idx}" + return hashlib.md5(raw.encode()).hexdigest()[:12] + + +_METRIC_PREFIXES = ( + "weighted", + "macro", + "weighted_without_pseudo_classes", + "macro_without_pseudo_classes", + "weighted_known", + "macro_known", + "weighted_known_without_pseudo_classes", + "macro_known_without_pseudo_classes", +) + + +def _normalize_metric_nulls(metrics: dict[str, float | None]) -> dict[str, float | None]: + """SQL rollups can leave precision/F1 NULL when recall is 0; show 0 in UI.""" + out = dict(metrics) + for prefix in _METRIC_PREFIXES: + prec_key = f"{prefix}_precision" + rec_key = f"{prefix}_recall" + f1_key = f"{prefix}_f1_score" + recall = out.get(rec_key) + if recall != 0.0: + continue + if out.get(prec_key) is None: + out[prec_key] = 0.0 + if out.get(f1_key) is None: + out[f1_key] = 0.0 + if out.get("recall") == 0.0: + if out.get("precision") is None: + out["precision"] = 0.0 + if out.get("f1_score") is None: + out["f1_score"] = 0.0 + return out + + +def _format_timestamp(value: Any) -> Optional[str]: + if value is None or (isinstance(value, float) and pd.isna(value)): + return None + if hasattr(value, "isoformat"): + return value.isoformat() + return str(value) + + +def _record_created_at(record: dict[str, Any]) -> Optional[str]: + preferred = ("__created_at", "created_at", "__create_ts", "create_ts", "__started_at", "started_at") + for key, value in record.items(): + lowered = key.lower() + if any(lowered == suffix or lowered.endswith(suffix) for suffix in preferred): + ts = _format_timestamp(value) + if ts: + return ts + return None + + +def _build_linked_models_for_dataset( + *, + dataset_id: str, + entity_index: EntitySourceIndex, + training_ctx: TrainingLinkContext, + metrics_by_model: dict[str, MetricsModelRow], +) -> list[FrozenDatasetLinkedModelRow]: + model_ids = list(entity_index.dataset_to_models.get(dataset_id, [])) + if not model_ids: + model_ids = sorted( + { + model_id + for model_id, linked_dataset_id in entity_index.model_to_dataset.items() + if linked_dataset_id == dataset_id + } + ) + + linked: list[FrozenDatasetLinkedModelRow] = [] + for model_id in model_ids: + link = entity_index.dataset_model_link_records.get((dataset_id, model_id)) + link_record = link.record if link else None + created_at = _record_created_at(link_record) if link_record else None + train_key = (model_id, dataset_id) + if not created_at: + created_at = training_ctx.started_at.get(train_key) + metrics_row = metrics_by_model.get(model_id) + if not created_at and metrics_row: + created_at = metrics_row.started_at + run_key = training_ctx.run_key.get(train_key) or (metrics_row.run_key if metrics_row else None) + run_id = training_ctx.run_id.get(train_key) or (metrics_row.run_id if metrics_row else None) + linked.append( + FrozenDatasetLinkedModelRow( + model_id=model_id, + created_at=created_at, + run_key=run_key, + run_id=run_id, + link_table=link.table_name if link else None, + link_record=link_record, + ) + ) + linked.sort(key=lambda row: row.created_at or "", reverse=True) + return linked + + +def _enrich_runs_with_datasets( + runs: list[MetricsRunRow], + *, + model_to_dataset: dict[str, str], + datasets_by_id: dict[str, FrozenDatasetRow], +) -> list[MetricsRunRow]: + enriched: list[MetricsRunRow] = [] + for run in runs: + dataset_id = model_to_dataset.get(run.model_id) + meta = datasets_by_id.get(dataset_id) if dataset_id else None + enriched.append( + run.model_copy( + update={ + "dataset_id": dataset_id, + "train_items": meta.train_count if meta else None, + "val_items": meta.val_count if meta else None, + } + ) + ) + return enriched + + +def _parse_model_ids(model_id: Optional[str]) -> Optional[list[str]]: + if not model_id: + return None + ids = [part.strip() for part in model_id.split(",") if part.strip()] + return ids or None + + +def _filter_runs( + runs: list[MetricsRunRow], + *, + subset: Optional[str] = None, + model_id: Optional[str] = None, + search: Optional[str] = None, + from_dt: Optional[datetime] = None, + to_dt: Optional[datetime] = None, +) -> list[MetricsRunRow]: + result = runs + if subset: + result = [r for r in result if r.subset == subset] + model_ids = _parse_model_ids(model_id) + if model_ids: + allowed = set(model_ids) + result = [r for r in result if r.model_id in allowed] + if search: + q = search.lower() + result = [r for r in result if q in r.run_id.lower() or q in r.model_id.lower() or q in r.subset.lower()] + if from_dt or to_dt: + filtered = [] + for r in result: + if not r.started_at: + filtered.append(r) + continue + try: + dt = datetime.fromisoformat(r.started_at.replace("Z", "+00:00")) + except ValueError: + filtered.append(r) + continue + if from_dt and dt < from_dt: + continue + if to_dt and dt > to_dt: + continue + filtered.append(r) + result = filtered + return result + + +def _sort_runs(runs: list[MetricsRunRow], sort_by: Optional[str], sort_dir: str) -> list[MetricsRunRow]: + if not sort_by: + return runs + reverse = sort_dir != "asc" + + # A metric field may be present only in some rows. Mixing floats (present) with + # strings ("" fallback) breaks Python's comparison, so decide once whether we + # are sorting a numeric metric and always emit a consistent, comparable key. + # The direction is folded into the key (negated numbers / inverted char codes) + # so that missing values (flagged with a leading 1) always sort last, in both + # ascending and descending order. + is_metric = any(sort_by in r.metrics for r in runs) + + def key_fn(r: MetricsRunRow) -> Any: + if is_metric: + val = r.metrics.get(sort_by) + if val is None: + return (1, 0.0) + return (0, -float(val) if reverse else float(val)) + attr = r.model_dump().get(sort_by) + if attr is None: + return (1, ()) + if isinstance(attr, (int, float)): + return (0, -float(attr) if reverse else float(attr)) + text = str(attr) + return (0, tuple(-ord(c) for c in text) if reverse else tuple(ord(c) for c in text)) + + return sorted(runs, key=key_fn) + + +def _model_row_id(model_id: str, dataset_id: str, subset: str) -> str: + raw = f"{model_id}|{dataset_id}|{subset}" + return hashlib.md5(raw.encode()).hexdigest()[:16] + + +def _has_computed_metrics(metrics: dict[str, float | None]) -> bool: + return any(v is not None for v in metrics.values()) + + +def _merge_run_metrics(group: list[MetricsRunRow]) -> dict[str, float | None]: + merged: dict[str, float | None] = {} + for row in group: + for key, value in row.metrics.items(): + if value is not None and merged.get(key) is None: + merged[key] = value + return merged + + +def runs_to_model_rows( + runs: list[MetricsRunRow], + *, + datasets_by_id: dict[str, FrozenDatasetRow], + task_type: Optional[str], + pipeline_id: str, +) -> list[MetricsModelRow]: + groups: dict[tuple[str, str, str], list[MetricsRunRow]] = {} + for row in runs: + key = (row.model_id, row.dataset_id or "", row.subset) + groups.setdefault(key, []).append(row) + + model_rows: list[MetricsModelRow] = [] + for (model_id, dataset_id, subset), group in groups.items(): + rep = max(group, key=lambda r: r.started_at or "") + merged = _merge_run_metrics(group) + dataset = datasets_by_id.get(dataset_id) if dataset_id else None + has_metrics = _has_computed_metrics(merged) + model_rows.append( + MetricsModelRow( + id=_model_row_id(model_id, dataset_id, subset), + pipeline_id=pipeline_id, + model_id=model_id, + model_display_name=model_id, + model_version=rep.model_version, + task_type=rep.task_type or task_type, + dataset_id=dataset_id or None, + frozen_at=dataset.frozen_at if dataset else None, + subset=subset, + split_counts=SplitCounts( + train=dataset.train_count if dataset else rep.train_items, + val=dataset.val_count if dataset else rep.val_items, + test=dataset.test_count if dataset else None, + ), + has_metrics=has_metrics, + metrics_state="computed" if has_metrics else "not_computed", + metrics=merged, + run_id=rep.run_id, + run_key=rep.run_key, + started_at=rep.started_at, + finished_at=rep.finished_at, + duration_s=rep.duration_s, + status=rep.status, + tags=rep.tags, + ) + ) + return model_rows + + +def _merge_candidates( + model_rows: list[MetricsModelRow], + candidates: list[MetricsCandidateRow], + datasets_by_id: dict[str, FrozenDatasetRow], + pipeline_id: str, +) -> list[MetricsModelRow]: + existing = {(r.model_id, r.dataset_id or "", r.subset) for r in model_rows} + for candidate in candidates: + key = (candidate.model_id, candidate.dataset_id, candidate.subset) + if key in existing: + continue + dataset = datasets_by_id.get(candidate.dataset_id) + model_rows.append( + MetricsModelRow( + id=candidate.id, + pipeline_id=pipeline_id, + model_id=candidate.model_id, + model_display_name=candidate.model_id, + model_source=candidate.model_source, + task_type=candidate.task_type, + dataset_id=candidate.dataset_id, + frozen_at=dataset.frozen_at if dataset else None, + subset=candidate.subset, + split_counts=SplitCounts( + train=dataset.train_count if dataset else None, + val=dataset.val_count if dataset else None, + test=dataset.test_count if dataset else None, + ), + has_metrics=False, + metrics_state=candidate.metrics_state, + metrics={}, + ) + ) + return model_rows + + +def _filter_model_rows( + rows: list[MetricsModelRow], + *, + subset: Optional[str] = None, + model_id: Optional[str] = None, + search: Optional[str] = None, + task_type: Optional[str] = None, +) -> list[MetricsModelRow]: + result = rows + if subset: + result = [r for r in result if r.subset == subset] + model_ids = _parse_model_ids(model_id) + if model_ids: + allowed = set(model_ids) + result = [r for r in result if r.model_id in allowed] + if task_type and task_type != "auto": + result = [r for r in result if (r.task_type or "").lower() == task_type.lower()] + if search: + q = search.lower() + result = [ + r + for r in result + if q in r.model_id.lower() + or q in (r.dataset_id or "").lower() + or q in r.subset.lower() + or any(q in tag.lower() for tag in r.tags) + ] + return result + + +def _sort_model_rows(rows: list[MetricsModelRow], sort_by: Optional[str], sort_dir: str) -> list[MetricsModelRow]: + if not sort_by: + return rows + reverse = sort_dir != "asc" + is_metric = any(sort_by in r.metrics for r in rows) + + def key_fn(row: MetricsModelRow) -> Any: + if is_metric: + val = row.metrics.get(sort_by) + if val is None: + return (1, 0.0) + return (0, -float(val) if reverse else float(val)) + attr = row.model_dump().get(sort_by) + if attr is None: + return (1, ()) + if isinstance(attr, (int, float)): + return (0, -float(attr) if reverse else float(attr)) + text = str(attr) + return (0, tuple(-ord(c) for c in text) if reverse else tuple(ord(c) for c in text)) + + return sorted(rows, key=key_fn) + + +CLASS_STRING_SORT_FIELDS = {"label", "class_id"} + + +def _parse_sort_specs(sort_by: Optional[str], sort_dir: str) -> list[tuple[str, str]]: + if not sort_by: + return [] + fields = [f.strip() for f in sort_by.split(",") if f.strip()] + dirs = [d.strip().lower() for d in sort_dir.split(",") if d.strip()] + if not dirs: + dirs = ["desc"] + while len(dirs) < len(fields): + dirs.append(dirs[-1]) + return list(zip(fields, dirs[: len(fields)])) + + +def _class_sort_tuple_key(r: ClassMetricRow, specs: list[tuple[str, str]]) -> tuple[Any, ...]: + parts: list[Any] = [] + for field, direction in specs: + val = r.model_dump().get(field) + if val is None: + parts.append((1, 0)) + continue + if field in CLASS_STRING_SORT_FIELDS: + text = (val or "").lower() if field == "label" else str(val) + if direction == "asc": + parts.append((0, text)) + else: + parts.append((0, tuple(-ord(c) for c in text))) + elif direction == "desc": + parts.append((0, -float(val))) + else: + parts.append((0, val)) + return tuple(parts) + + +def _sort_class_rows(rows: list[ClassMetricRow], sort_by: Optional[str], sort_dir: str) -> list[ClassMetricRow]: + specs = _parse_sort_specs(sort_by, sort_dir) + if not specs: + return rows + return sorted(rows, key=lambda r: _class_sort_tuple_key(r, specs)) + + +def _build_model_detail_kpis(row: Optional[MetricsModelRow]) -> list[MetricsModelDetailKpi]: + if row is None or not row.has_metrics: + return [] + metrics = row.metrics or {} + specs = [ + ("weighted_f1_score", "W-F1"), + ("macro_f1_score", "M-F1"), + ("weighted_without_pseudo_classes_precision", "W-Precision"), + ("weighted_without_pseudo_classes_recall", "W-Recall"), + ("weighted_precision", "W-Precision"), + ("weighted_recall", "W-Recall"), + ("support", "Support"), + ] + seen: set[str] = set() + kpis: list[MetricsModelDetailKpi] = [] + for key, label in specs: + if key in seen: + continue + val = metrics.get(key) + if val is None: + continue + seen.add(key) + fmt = "integer" if key == "support" else "float" + kpis.append(MetricsModelDetailKpi(key=key, label=label, value=val, format=fmt)) + return kpis + + +class MetricsService: + def __init__( + self, + *, + store: Any = None, + ds: Optional[DataStore] = None, + catalog: Optional[Catalog] = None, + ops_specs: OpsSpecRegistry | None = None, + ) -> None: + self.store = store + self.ds = ds + self.catalog = catalog + self.ops_specs = ops_specs + + def _primary_metric(self) -> str | None: + if self.ops_specs is None: + return None + return primary_metric_from_specs(self.ops_specs) + + def _dataset_context(self) -> tuple[dict[str, FrozenDatasetRow], dict[str, str]]: + _, by_id, model_to_dataset = _load_frozen_dataset_catalog( + self.ds, + self.catalog, + ops_specs=self.ops_specs, + ) + return by_id, model_to_dataset + + def _all_runs(self, pipeline_id: str) -> tuple[list[MetricsRunRow], Optional[str]]: + catalog_runs, _, task_type = _load_catalog_rows( + self.ds, + self.catalog, + ops_specs=self.ops_specs, + ) + datasets_by_id, model_to_dataset = self._dataset_context() + runs = _enrich_runs_with_datasets( + catalog_runs, + model_to_dataset=model_to_dataset, + datasets_by_id=datasets_by_id, + ) + for r in runs: + r.pipeline_id = pipeline_id + for i, run in enumerate(runs): + if i + 1 < len(runs): + compute_deltas(run, runs[i + 1]) + return runs, task_type + + def _all_model_rows(self, pipeline_id: str) -> tuple[list[MetricsModelRow], Optional[str]]: + runs, discovered_task_type = self._all_runs(pipeline_id) + datasets_by_id, _ = self._dataset_context() + model_rows = runs_to_model_rows( + runs, + datasets_by_id=datasets_by_id, + task_type=discovered_task_type, + pipeline_id=pipeline_id, + ) + model_rows = _merge_candidates( + model_rows, + _load_candidates(self.store, pipeline_id), + datasets_by_id, + pipeline_id, + ) + return model_rows, discovered_task_type + + def list_frozen_datasets(self, pipeline_id: str) -> FrozenDatasetsResponse: + rows, by_id, model_to_dataset = _load_frozen_dataset_catalog( + self.ds, + self.catalog, + ops_specs=self.ops_specs, + ) + candidates = _load_candidates(self.store, pipeline_id) + entity_index = _load_entity_source_records( + self.ds, + self.catalog, + candidates=candidates, + ops_specs=self.ops_specs, + ) + model_rows, _ = self._all_model_rows(pipeline_id) + counts: dict[str, set[str]] = {} + for model_id, dataset_id in {**model_to_dataset, **entity_index.model_to_dataset}.items(): + counts.setdefault(dataset_id, set()).add(model_id) + for row in model_rows: + if row.dataset_id: + counts.setdefault(row.dataset_id, set()).add(row.model_id) + enriched: list[FrozenDatasetRow] = [] + for frozen_row in rows: + enriched.append( + frozen_row.model_copy(update={"models_count": len(counts.get(frozen_row.dataset_id, set()))}), + ) + return FrozenDatasetsResponse(rows=enriched, total=len(enriched)) + + def list_runs( + self, + pipeline_id: str, + *, + subset: Optional[str] = None, + model_id: Optional[str] = None, + search: Optional[str] = None, + task_type: Optional[str] = None, + from_dt: Optional[datetime] = None, + to_dt: Optional[datetime] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 25, + offset: int = 0, + ) -> MetricsRunsResponse: + runs, discovered_task_type = self._all_runs(pipeline_id) + datasets_by_id, _ = self._dataset_context() + facet_runs = _filter_runs( + runs, + subset=subset, + from_dt=from_dt, + to_dt=to_dt, + ) + facet_rows = runs_to_model_rows( + facet_runs, + datasets_by_id=datasets_by_id, + task_type=discovered_task_type, + pipeline_id=pipeline_id, + ) + facet_rows = _merge_candidates( + facet_rows, + _load_candidates(self.store, pipeline_id), + datasets_by_id, + pipeline_id, + ) + filtered_runs = _filter_runs( + runs, + subset=subset, + model_id=model_id, + search=search, + from_dt=from_dt, + to_dt=to_dt, + ) + model_rows = runs_to_model_rows( + filtered_runs, + datasets_by_id=datasets_by_id, + task_type=discovered_task_type, + pipeline_id=pipeline_id, + ) + model_rows = _merge_candidates( + model_rows, + _load_candidates(self.store, pipeline_id), + datasets_by_id, + pipeline_id, + ) + model_rows = _filter_model_rows( + model_rows, + subset=subset, + model_id=model_id, + search=search, + task_type=task_type, + ) + model_rows = _sort_model_rows(model_rows, sort_by or "model_id", sort_dir) + total = len(model_rows) + page = model_rows[offset : offset + limit] + subsets = sorted({r.subset for r in facet_rows if r.subset}) + models = sorted({r.model_id for r in facet_rows if r.model_id}) + metric_keys = sorted({k for r in facet_rows for k in r.metrics}) + schema = build_metric_schema( + discovered_task_type, + metric_keys, + primary_metric=self._primary_metric() or primary_metric_for_task(discovered_task_type), + ) + return MetricsRunsResponse( + rows=page, + total=total, + available_filters={"subsets": subsets, "models": models, "tags": [], "metrics": metric_keys}, + schema=schema, + ) + + def list_candidates(self, pipeline_id: str) -> MetricsCandidatesResponse: + rows = _load_candidates(self.store, pipeline_id) + return MetricsCandidatesResponse(rows=rows, total=len(rows)) + + def add_candidate(self, pipeline_id: str, body: MetricsCandidateCreate) -> MetricsCandidateRow: + if self.store is None: + raise ValueError("Observability store is required for metrics candidates") + existing = list_metrics_candidates(self.store, pipeline_id) + candidate_id = hashlib.md5( + f"{body.model_id}|{body.dataset_id}|{body.subset}|{len(existing)}".encode() + ).hexdigest()[:16] + saved = add_metrics_candidate( + self.store, + PipelineMetricsCandidateRow( + id=candidate_id, + pipeline_id=pipeline_id, + model_id=body.model_id, + model_source=body.model_source, + artifact_uri=body.artifact_uri, + dataset_id=body.dataset_id, + subset=body.subset, + task_type=body.task_type, + metrics_state="not_computed", + created_at=utc_now(), + ) + ) + return _candidate_row_from_db(saved) + + def delete_candidate(self, pipeline_id: str, candidate_id: str) -> bool: + if self.store is None: + return False + return delete_metrics_candidate(self.store, pipeline_id, candidate_id) + + def summary( + self, + pipeline_id: str, + *, + subset: Optional[str] = None, + model_id: Optional[str] = None, + primary_metric: Optional[str] = None, + ) -> MetricsSummaryResponse: + runs, task_type = self._all_runs(pipeline_id) + runs = _filter_runs(runs, subset=subset, model_id=model_id) + if not runs: + return MetricsSummaryResponse(pipeline_id=pipeline_id, primary_metric=primary_metric or "f1_score", has_metrics=False) + + pm = primary_metric or self._primary_metric() or primary_metric_for_task(task_type) + best = max(runs, key=lambda r: pick_primary_value(r.metrics, task_type) or -1) + # Metrics are stored sparsely: each evaluation row of a (model, subset) + # may carry only a slice of the computed metrics. Merge every non-null + # metric from all rows of the best run's (model, subset) so the Best model + # panel presents the complete metric set rather than one sparse row. + best = best.model_copy(deep=True) + merged: dict[str, float | None] = dict(best.metrics) + for r in runs: + if r.model_id != best.model_id or r.subset != best.subset: + continue + for k, v in r.metrics.items(): + if v is not None and merged.get(k) is None: + merged[k] = v + best.metrics = merged + latest = runs[0] + previous = runs[1] if len(runs) > 1 else None + return MetricsSummaryResponse( + pipeline_id=pipeline_id, + primary_metric=pm, + has_metrics=True, + latest_run=latest, + best_run=best, + previous_run=previous, + kpis=build_kpis(runs, task_type, best), + anomalies=detect_anomalies(runs, task_type), + ) + + def list_classes( + self, + pipeline_id: str, + *, + subset: Optional[str] = None, + model_id: Optional[str] = None, + label_search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 50, + offset: int = 0, + ) -> ClassMetricsResponse: + _, class_rows, _ = _load_catalog_rows(self.ds, self.catalog, ops_specs=self.ops_specs) + rows = [r for _, r, _ in class_rows if (not subset or r.subset == subset)] + model_ids = _parse_model_ids(model_id) + if model_ids: + allowed = set(model_ids) + rows = [r for r in rows if r.model_id in allowed] + if label_search: + q = label_search.lower() + rows = [r for r in rows if q in r.label.lower()] + rows = _sort_class_rows(rows, sort_by, sort_dir) + total = len(rows) + page = rows[offset : offset + limit] + primary = self._primary_metric() or "f1_score" + numeric_primary: list[float] = [ + float(value) + for row in rows + for value in [row.model_dump().get(primary)] + if isinstance(value, (int, float)) + ] + macro_f1 = sum(numeric_primary) / len(numeric_primary) if numeric_primary else None + sorted_by_primary = sorted(rows, key=lambda r: r.model_dump().get(primary) or 0, reverse=True) + return ClassMetricsResponse( + rows=page, + total=total, + summary={ + "total_classes": total, + "macro_f1": macro_f1, + "weighted_f1": macro_f1, + "best_classes": sorted_by_primary[:3], + "worst_classes": list(reversed(sorted_by_primary[-3:])), + }, + ) + + def class_detail(self, pipeline_id: str, label: str, *, subset: Optional[str] = None) -> ClassMetricDetailResponse: + data = self.list_classes(pipeline_id, subset=subset, label_search=label, limit=1000) + matches = [r for r in data.rows if r.label == label] + latest = matches[0] if matches else (data.rows[0] if data.rows else ClassMetricRow(label=label)) + primary = self._primary_metric() or "f1_score" + return ClassMetricDetailResponse( + label=label, + class_id=latest.class_id, + latest=latest, + previous=None, + trends=[{"metric": primary, "points": []}], + error_breakdown={ + "false_negatives": latest.FN or 0, + "false_positives": latest.FP or 0, + }, + ) + + def get_model_detail( + self, + pipeline_id: str, + model_id: str, + *, + dataset_id: Optional[str] = None, + subset: Optional[str] = None, + ) -> MetricsModelDetailResponse: + model_rows, _ = self._all_model_rows(pipeline_id) + matching = [r for r in model_rows if r.model_id == model_id] + if dataset_id: + matching = [r for r in matching if r.dataset_id == dataset_id] + if subset: + matching = [r for r in matching if r.subset == subset] + + entity_index = _load_entity_source_records( + self.ds, + self.catalog, + candidates=_load_candidates(self.store, pipeline_id), + ops_specs=self.ops_specs, + ) + datasets_by_id, _ = self._dataset_context() + source = entity_index.model_records_by_id.get(model_id) + linked_dataset_id = ( + dataset_id + or (matching[0].dataset_id if matching else None) + or entity_index.model_to_dataset.get(model_id) + ) + frozen = datasets_by_id.get(linked_dataset_id) if linked_dataset_id else None + dataset_source = entity_index.dataset_records_by_id.get(linked_dataset_id) if linked_dataset_id else None + primary_row = next((r for r in matching if r.has_metrics), matching[0] if matching else None) + model_col = _model_id_column_from_specs(self.ops_specs, model_id) + dataset_col = _dataset_id_column_from_specs(self.ops_specs) + + return MetricsModelDetailResponse( + pipeline_id=pipeline_id, + model_id=model_id, + title=model_id, + spec_id=entity_index.model_to_spec.get(model_id), + source_table=source.table_name if source else None, + source_pk=source.pk if source else None, + source_record=source.record if source else None, + source_table_url=_table_row_url(pipeline_id, source.table_name if source else None, model_col, model_id), + model_row=primary_row, + frozen_dataset=frozen, + frozen_dataset_source_table=dataset_source.table_name if dataset_source else None, + frozen_dataset_source_pk=dataset_source.pk if dataset_source else None, + metrics_rows=matching, + kpis=_build_model_detail_kpis(primary_row), + related=MetricsModelDetailRelated( + dataset_id=linked_dataset_id, + run_key=primary_row.run_key if primary_row else None, + run_id=primary_row.run_id if primary_row else None, + ), + ) + + def resolve_entity( + self, + pipeline_id: str, + *, + model_id: Optional[str] = None, + dataset_id: Optional[str] = None, + ) -> MetricsEntityResolveResponse: + if bool(model_id) == bool(dataset_id): + raise ValueError("Provide exactly one of model_id or dataset_id") + + entity_index = _load_entity_source_records( + self.ds, + self.catalog, + candidates=_load_candidates(self.store, pipeline_id), + ops_specs=self.ops_specs, + ) + sole_spec_id = None + if self.ops_specs is not None: + specs = list(self.ops_specs.list()) + if len(specs) == 1: + sole_spec_id = specs[0].id + + if model_id: + spec_id = entity_index.model_to_spec.get(model_id) or sole_spec_id + if not spec_id: + raise KeyError(f'Model "{model_id}" is not linked to an ops spec') + return MetricsEntityResolveResponse( + kind="model", + spec_id=spec_id, + model_id=model_id, + dataset_id=dataset_id or entity_index.model_to_dataset.get(model_id), + ) + + assert dataset_id is not None + spec_id = entity_index.dataset_to_spec.get(dataset_id) or sole_spec_id + if not spec_id: + raise KeyError(f'Dataset "{dataset_id}" is not linked to an ops spec') + return MetricsEntityResolveResponse( + kind="dataset", + spec_id=spec_id, + dataset_id=dataset_id, + ) + + def get_frozen_dataset_detail( + self, + pipeline_id: str, + dataset_id: str, + *, + subset: Optional[str] = None, + ) -> FrozenDatasetDetailResponse: + rows, by_id, _ = _load_frozen_dataset_catalog( + self.ds, + self.catalog, + ops_specs=self.ops_specs, + ) + dataset = by_id.get(dataset_id) or FrozenDatasetRow(dataset_id=dataset_id) + entity_index = _load_entity_source_records( + self.ds, + self.catalog, + candidates=_load_candidates(self.store, pipeline_id), + ops_specs=self.ops_specs, + ) + source = entity_index.dataset_records_by_id.get(dataset_id) + model_rows, task_type = self._all_model_rows(pipeline_id) + metrics_by_model: dict[str, MetricsModelRow] = {} + for row in model_rows: + if row.dataset_id != dataset_id: + continue + existing = metrics_by_model.get(row.model_id) + if existing is None or (row.started_at or "") > (existing.started_at or ""): + metrics_by_model[row.model_id] = row + + training_ctx = ( + _load_training_link_context(self.ds, self.catalog, ops_specs=self.ops_specs) + if self.ds is not None and self.catalog is not None + else TrainingLinkContext() + ) + linked_models = _build_linked_models_for_dataset( + dataset_id=dataset_id, + entity_index=entity_index, + training_ctx=training_ctx, + metrics_by_model=metrics_by_model, + ) + + linked_model_ids = {row.model_id for row in linked_models} + models_count = len(linked_models) + with_metrics = len( + { + model_id + for model_id in linked_model_ids + if metrics_by_model.get(model_id) and metrics_by_model[model_id].has_metrics + } + ) + subsets = sorted({row.subset for row in model_rows if row.model_id in linked_model_ids and row.subset}) + best_key = self._primary_metric() or primary_metric_for_task(task_type) + best_row = max( + (metrics_by_model[mid] for mid in linked_model_ids if mid in metrics_by_model and metrics_by_model[mid].has_metrics), + key=lambda r: pick_primary_value(r.metrics, task_type, primary_metric=self._primary_metric()) or -1, + default=None, + ) + dataset_col = _dataset_id_column_from_specs(self.ops_specs) + + return FrozenDatasetDetailResponse( + pipeline_id=pipeline_id, + dataset_id=dataset_id, + title=dataset_id, + spec_id=entity_index.dataset_to_spec.get(dataset_id), + dataset=dataset.model_copy(update={"models_count": models_count or dataset.models_count}), + source_table=source.table_name if source else None, + source_pk=source.pk if source else None, + source_record=source.record if source else None, + source_table_url=_table_row_url(pipeline_id, source.table_name if source else None, dataset_col, dataset_id), + linked_models=linked_models, + coverage=FrozenDatasetCoverage( + models_total=models_count, + models_with_metrics=with_metrics, + subsets=subsets, + best_metric_key=best_key if best_row else None, + best_metric_value=pick_primary_value(best_row.metrics, task_type) if best_row else None, + best_model_id=best_row.model_id if best_row else None, + ), + ) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog.py new file mode 100644 index 000000000..7bd1b5c63 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog.py @@ -0,0 +1,494 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any, get_args, get_origin + +import pandas as pd +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app_ml_ops.observability.schemas.models import ( + ClassMetricRow, + EntitySourceRecord, + FrozenDatasetRow, + MetricsCandidateRow, + MetricsRunRow, +) +from datapipe_app_ml_ops.observability.metrics.spec_catalog_utils import ( + format_timestamp, + row_pk, + row_to_record, + safe_float, + safe_int, + table_columns, +) +from datapipe_app.ops.ops_spec_resolve import column_source_by_link +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry, _flatten_columns +from datapipe_app.ops.specs import OpsMetricTableSpec, OpsRelationSpec + + +def task_type_from_specs(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + if spec.tags: + return spec.tags[0] + return spec.id + return None + + +def primary_metric_from_specs(registry: OpsSpecRegistry) -> str | None: + for spec in registry.list(): + for table in spec.metrics: + if table.best_metric_column: + for column in _flatten_columns(table.metric_columns): + if column.source == table.best_metric_column: + return column.id + return table.best_metric_column + return None + + +def _integer_metric_ids() -> set[str]: + ids: set[str] = set() + for name, info in ClassMetricRow.model_fields.items(): + annotation = info.annotation + if annotation is int: + ids.add(name) + continue + origin = get_origin(annotation) + if origin is not None: + if int in get_args(annotation): + ids.add(name) + return ids + + +_INTEGER_METRIC_IDS = _integer_metric_ids() + + +@dataclass +class EntitySourceIndex: + model_records_by_id: dict[str, EntitySourceRecord] = field(default_factory=dict) + dataset_records_by_id: dict[str, EntitySourceRecord] = field(default_factory=dict) + model_to_dataset: dict[str, str] = field(default_factory=dict) + dataset_to_models: dict[str, list[str]] = field(default_factory=dict) + dataset_model_link_records: dict[tuple[str, str], EntitySourceRecord] = field(default_factory=dict) + model_to_spec: dict[str, str] = field(default_factory=dict) + dataset_to_spec: dict[str, str] = field(default_factory=dict) + _model_priority: dict[str, int] = field(default_factory=dict) + _dataset_priority: dict[str, int] = field(default_factory=dict) + + +@dataclass +class TrainingLinkContext: + started_at: dict[tuple[str, str], str] = field(default_factory=dict) + run_key: dict[tuple[str, str], str] = field(default_factory=dict) + run_id: dict[tuple[str, str], str] = field(default_factory=dict) + + +def _maybe_set_model_record(index: EntitySourceIndex, model_id: str, record: EntitySourceRecord, priority: int) -> None: + if model_id not in index.model_records_by_id or index._model_priority.get(model_id, 99) > priority: + index.model_records_by_id[model_id] = record + index._model_priority[model_id] = priority + + +def _maybe_set_dataset_record(index: EntitySourceIndex, dataset_id: str, record: EntitySourceRecord, priority: int) -> None: + if dataset_id not in index.dataset_records_by_id or index._dataset_priority.get(dataset_id, 99) > priority: + index.dataset_records_by_id[dataset_id] = record + index._dataset_priority[dataset_id] = priority + + +def _metric_sources(table_spec: OpsMetricTableSpec) -> list[tuple[str, str]]: + return [(column.id, column.source) for column in _flatten_columns(table_spec.metric_columns)] + + +def _row_metrics(row: pd.Series, table_spec: OpsMetricTableSpec) -> dict[str, float | None]: + metrics: dict[str, float | None] = {} + for metric_id, source in _metric_sources(table_spec): + parsed = safe_float(row.get(source)) + if parsed is not None: + metrics[metric_id] = parsed + return metrics + + +def _entity_link_value(row: pd.Series, entity_links: dict[str, str], entity: str) -> str: + column = entity_links.get(entity) + if not column: + return "" + value = row.get(column) + if value is None or (isinstance(value, float) and pd.isna(value)): + return "" + return str(value) + + +def load_metric_runs_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, +) -> tuple[list[MetricsRunRow], str | None]: + run_rows: list[MetricsRunRow] = [] + task_type = task_type_from_specs(registry) + + for spec in registry.list(): + for table_spec in spec.metrics: + entity_links = table_spec.entity_links + dt = ds.get_table(table_spec.table) + try: + df = dt.get_data() + except Exception: + continue + if df.empty: + continue + for idx, row in df.iterrows(): + model_id = _entity_link_value(row, entity_links, "model") + subset = _entity_link_value(row, entity_links, "subset") + metrics = _row_metrics(row, table_spec) + if not metrics: + continue + run_rows.append( + MetricsRunRow( + run_id=f"{table_spec.id}:{model_id}:{subset}:{idx}", + pipeline_id="", + model_id=model_id, + task_type=task_type, + subset=subset, + status="success", + metrics=metrics, + ) + ) + + return run_rows, task_type + + +def _class_metric_row(row: pd.Series, table_spec: OpsMetricTableSpec, *, model_id: str, subset: str | None) -> ClassMetricRow | None: + class_col = table_spec.entity_links.get("class") or table_spec.entity_links.get("tag") + if not class_col: + return None + label = row.get(class_col) + if label is None or (isinstance(label, float) and pd.isna(label)): + return None + payload: dict[str, Any] = { + "label": str(label), + "subset": subset, + "model_id": model_id or None, + } + field_names = set(ClassMetricRow.model_fields) + for metric_id, source in _metric_sources(table_spec): + if metric_id not in field_names: + continue + if metric_id in _INTEGER_METRIC_IDS: + payload[metric_id] = safe_int(row.get(source)) + else: + payload[metric_id] = safe_float(row.get(source)) + if "class_id" in table_spec.primary_key_columns: + payload["class_id"] = row.get(next(iter(table_spec.primary_key_columns), "")) + return ClassMetricRow(**payload) + + +def _relation_for(registry: OpsSpecRegistry, relation_id: str | None) -> OpsRelationSpec | None: + if not relation_id: + return None + for spec in registry.list(): + for relation in spec.relations: + if relation.id == relation_id: + return relation + return None + + +def _index_frozen_datasets(index: EntitySourceIndex, registry: OpsSpecRegistry, ds: DataStore) -> None: + for spec in registry.list(): + frozen = spec.frozen_dataset + if frozen is None: + continue + dt = ds.get_table(frozen.table) + columns = table_columns(dt) + pk_cols = list(dt.primary_keys) or [frozen.id_column] + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + dataset_id = row.get(frozen.id_column) + if dataset_id is None or pd.isna(dataset_id): + continue + did = str(dataset_id) + _maybe_set_dataset_record( + index, + did, + EntitySourceRecord( + table_name=frozen.table, + pk=row_pk(row, pk_cols) or {frozen.id_column: did}, + record=row_to_record(row, columns), + ), + priority=1, + ) + index.dataset_to_spec[did] = spec.id + + +def _index_models(index: EntitySourceIndex, registry: OpsSpecRegistry, ds: DataStore) -> None: + for spec in registry.list(): + model = spec.model + if model is None: + continue + dt = ds.get_table(model.table) + columns = table_columns(dt) + pk_cols = list(dt.primary_keys) or [model.id_column] + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + model_id = row.get(model.id_column) + if model_id is None or pd.isna(model_id): + continue + mid = str(model_id) + _maybe_set_model_record( + index, + mid, + EntitySourceRecord( + table_name=model.table, + pk=row_pk(row, pk_cols) or {model.id_column: mid}, + record=row_to_record(row, columns), + ), + priority=1, + ) + index.model_to_spec[mid] = spec.id + + +def _index_relations(index: EntitySourceIndex, registry: OpsSpecRegistry, ds: DataStore) -> None: + for spec in registry.list(): + for relation in spec.relations: + dt = ds.get_table(relation.table) + columns = table_columns(dt) + pk_cols = list(dt.primary_keys) + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + model_value = row.get(relation.from_column) + dataset_value = row.get(relation.to_column) + if model_value is None or dataset_value is None or pd.isna(model_value) or pd.isna(dataset_value): + continue + mid, did = str(model_value), str(dataset_value) + index.model_to_dataset[mid] = did + index.dataset_to_models.setdefault(did, []) + if mid not in index.dataset_to_models[did]: + index.dataset_to_models[did].append(mid) + record = EntitySourceRecord( + table_name=relation.table, + pk=row_pk(row, pk_cols), + record=row_to_record(row, columns), + ) + index.dataset_model_link_records[(did, mid)] = record + _maybe_set_model_record(index, mid, record, priority=2) + _maybe_set_dataset_record(index, did, record, priority=3) + + +def _index_metric_tables(index: EntitySourceIndex, registry: OpsSpecRegistry, ds: DataStore) -> None: + for spec in registry.list(): + for table_spec in [*spec.metrics, *spec.class_metrics]: + model_col = table_spec.entity_links.get("model") + if not model_col: + continue + dt = ds.get_table(table_spec.table) + columns = table_columns(dt) + pk_cols = list(dt.primary_keys) or list(table_spec.primary_key_columns) + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + model_value = row.get(model_col) + if model_value is None or pd.isna(model_value): + continue + mid = str(model_value) + _maybe_set_model_record( + index, + mid, + EntitySourceRecord( + table_name=table_spec.table, + pk=row_pk(row, pk_cols) or {model_col: mid}, + record=row_to_record(row, columns), + ), + priority=4, + ) + + +def _index_candidates(index: EntitySourceIndex, candidates: list[MetricsCandidateRow] | None) -> None: + for candidate_row in candidates or []: + model_id = candidate_row.model_id + if not model_id: + continue + _maybe_set_model_record( + index, + model_id, + EntitySourceRecord( + table_name="metrics_candidates", + pk={"id": candidate_row.id}, + record=candidate_row.model_dump(), + ), + priority=5, + ) + dataset_id = candidate_row.dataset_id + if dataset_id: + index.model_to_dataset[model_id] = dataset_id + index.dataset_to_models.setdefault(dataset_id, []) + if model_id not in index.dataset_to_models[dataset_id]: + index.dataset_to_models[dataset_id].append(model_id) + + +def load_entity_index_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, + *, + candidates: list[MetricsCandidateRow] | None = None, +) -> EntitySourceIndex: + index = EntitySourceIndex() + _index_frozen_datasets(index, registry, ds) + _index_models(index, registry, ds) + _index_relations(index, registry, ds) + _index_metric_tables(index, registry, ds) + _index_candidates(index, candidates) + return index + + +def load_frozen_dataset_catalog_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, +) -> tuple[list[FrozenDatasetRow], dict[str, FrozenDatasetRow], dict[str, str]]: + datasets: list[FrozenDatasetRow] = [] + by_id: dict[str, FrozenDatasetRow] = {} + model_to_dataset: dict[str, str] = {} + + for spec in registry.list(): + frozen = spec.frozen_dataset + if frozen is None: + continue + dt = ds.get_table(frozen.table) + try: + df = dt.get_data() + except Exception: + continue + if df.empty: + continue + relation = _relation_for(registry, frozen.models_count_relation_id) + for _, row in df.iterrows(): + dataset_id = row.get(frozen.id_column) + if dataset_id is None or pd.isna(dataset_id): + continue + entry = FrozenDatasetRow( + dataset_id=str(dataset_id), + frozen_at=format_timestamp(row.get(frozen.created_at_column)), + train_count=safe_int(row.get(frozen.split_columns.get("train"))) if frozen.split_columns.get("train") else None, + val_count=safe_int(row.get(frozen.split_columns.get("val"))) if frozen.split_columns.get("val") else None, + test_count=safe_int(row.get(frozen.split_columns.get("test"))) if frozen.split_columns.get("test") else None, + ) + if entry.dataset_id not in by_id: + datasets.append(entry) + by_id[entry.dataset_id] = entry + + if relation is not None: + link_dt = ds.get_table(relation.table) + try: + link_df = link_dt.get_data() + except Exception: + continue + for _, row in link_df.iterrows(): + model_value = row.get(relation.from_column) + dataset_value = row.get(relation.to_column) + if model_value is None or dataset_value is None or pd.isna(model_value) or pd.isna(dataset_value): + continue + model_to_dataset[str(model_value)] = str(dataset_value) + + datasets.sort(key=lambda item: item.frozen_at or "", reverse=True) + return datasets, by_id, model_to_dataset + + +def load_class_metric_rows_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, +) -> list[tuple[str, ClassMetricRow, str]]: + class_rows: list[tuple[str, ClassMetricRow, str]] = [] + for spec in registry.list(): + for table_spec in spec.class_metrics: + model_col = table_spec.entity_links.get("model") + subset_col = table_spec.entity_links.get("subset") + dt = ds.get_table(table_spec.table) + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + model_id = str(row.get(model_col) or "") if model_col else "" + subset = str(row.get(subset_col) or "") if subset_col and not pd.isna(row.get(subset_col)) else None + class_row = _class_metric_row(row, table_spec, model_id=model_id, subset=subset) + if class_row is not None: + class_rows.append((table_spec.table, class_row, subset or "")) + return class_rows + + +def load_catalog_rows_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, +) -> tuple[list[MetricsRunRow], list[tuple[str, ClassMetricRow, str]], str | None]: + run_rows, task_type = load_metric_runs_from_specs(registry, ds, catalog) + class_rows = load_class_metric_rows_from_specs(registry, ds, catalog) + return run_rows, class_rows, task_type + + +def load_training_link_context_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, +) -> TrainingLinkContext: + ctx = TrainingLinkContext() + for spec in registry.list(): + training = spec.training + if training is None: + continue + model_col = column_source_by_link(training.columns, "model") + dataset_col = column_source_by_link(training.columns, "frozen_dataset") + run_col = column_source_by_link(training.columns, "training_run") + started_col = next((column.source for column in training.columns if column.kind == "datetime"), None) + status_id_col = next((column.source for column in training.columns if column.source.endswith("_id")), None) + if not model_col or not dataset_col: + continue + dt = ds.get_table(training.status_table) + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + model_value = row.get(model_col) + dataset_value = row.get(dataset_col) + if model_value is None or dataset_value is None or pd.isna(model_value) or pd.isna(dataset_value): + continue + key = (str(model_value), str(dataset_value)) + if started_col: + started = format_timestamp(row.get(started_col)) + if started: + ctx.started_at[key] = started + if run_col: + run_key = row.get(run_col) + if run_key is not None and not pd.isna(run_key): + ctx.run_key[key] = str(run_key) + if status_id_col: + status_id = row.get(status_id_col) + if status_id is not None and not pd.isna(status_id): + ctx.run_id[key] = str(status_id) + return ctx + + +__all__ = [ + "EntitySourceIndex", + "TrainingLinkContext", + "load_catalog_rows_from_specs", + "load_metric_runs_from_specs", + "load_class_metric_rows_from_specs", + "load_entity_index_from_specs", + "load_frozen_dataset_catalog_from_specs", + "load_training_link_context_from_specs", + "primary_metric_from_specs", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog_utils.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog_utils.py new file mode 100644 index 000000000..8e094c479 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/metrics/spec_catalog_utils.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +from typing import Any + +import pandas as pd +from datapipe.store.database import TableStoreDB + + +def table_columns(dt) -> list[str]: + store = dt.table_store + if isinstance(store, TableStoreDB): + return [column.name for column in store.data_sql_schema] + return [] + + +def jsonable(val: Any) -> Any: + if val is None or (isinstance(val, float) and pd.isna(val)): + return None + if hasattr(val, "isoformat"): + return val.isoformat() + if isinstance(val, (str, int, float, bool)): + return val + return str(val) + + +def row_to_record(row: pd.Series, columns: list[str]) -> dict[str, Any]: + return {col: jsonable(row.get(col)) for col in columns} + + +def row_pk(row: pd.Series, pk_cols: list[str]) -> dict[str, Any] | None: + if not pk_cols: + return None + pk = {col: jsonable(row.get(col)) for col in pk_cols} + if all(v is None for v in pk.values()): + return None + return pk + + +def safe_float(val: Any) -> float | None: + if val is None or (isinstance(val, float) and pd.isna(val)): + return None + try: + return float(val) + except (TypeError, ValueError): + return None + + +def safe_int(val: Any) -> int | None: + value = safe_float(val) + return int(value) if value is not None else None + + +def format_timestamp(value: Any) -> str | None: + if value is None or (isinstance(value, float) and pd.isna(value)): + return None + if hasattr(value, "isoformat"): + return value.isoformat() + return str(value) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugin.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugin.py new file mode 100644 index 000000000..09271548d --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugin.py @@ -0,0 +1,11 @@ +from __future__ import annotations + +from datapipe_app.observability.plugins.registry import ObservabilityRegistry +from datapipe_app_ml_ops.observability.plugins.enricher_registration import register_ops_spec_enricher + + +def register(registry: ObservabilityRegistry) -> None: + # Import registers ML spec validators on OpsSpecRegistry. + import datapipe_app_ml_ops.ops.spec_registry # noqa: F401 + + registry.add_ops_specs_listener(register_ops_spec_enricher) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/enricher_registration.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/enricher_registration.py new file mode 100644 index 000000000..65437bf84 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/enricher_registration.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from typing import cast + +from datapipe_app.observability.plugins.registry import ObservabilityRegistry +from datapipe_app.ops.spec_registry import OpsSpecRegistry as BaseOpsSpecRegistry +from datapipe_app_ml_ops.observability.plugins.ops_spec_enricher import OpsSpecOverviewEnricher +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + +def register_ops_spec_enricher( + registry: ObservabilityRegistry, + ops_specs: BaseOpsSpecRegistry, +) -> None: + ml_ops_specs = cast(OpsSpecRegistry, ops_specs) + if not ml_ops_specs.list(): + return + for enricher in registry.enrichers: + if isinstance(enricher, OpsSpecOverviewEnricher): + return + registry.register_overview_enricher(OpsSpecOverviewEnricher(ml_ops_specs)) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/ops_spec_enricher.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/ops_spec_enricher.py new file mode 100644 index 000000000..69f5a7130 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/plugins/ops_spec_enricher.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from typing import Any + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app.observability.store.db import ObservabilityStore +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.ops_spec_metrics import latest_eval_metric_from_specs + + +class OpsSpecOverviewEnricher: + def __init__(self, ops_specs: OpsSpecRegistry) -> None: + self.ops_specs = ops_specs + + def enrich_pipeline_detail( + self, + *, + pipeline_id: str, + ds: DataStore | None, + catalog: Catalog | None, + store: ObservabilityStore, + ) -> list[dict[str, Any]]: + if ds is None or catalog is None or not self.ops_specs.list(): + return [] + latest = latest_eval_metric_from_specs(self.ops_specs, ds, catalog) + if latest is None: + return [] + return [{"type": "ops_metrics_summary", "payload": latest}] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/ops_spec_routes.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/ops_spec_routes.py new file mode 100644 index 000000000..66eaf9bc6 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/ops_spec_routes.py @@ -0,0 +1,503 @@ +from __future__ import annotations + +from typing import Any, Literal, Optional + +from fastapi import FastAPI, HTTPException, Query, Response + +from datapipe_app_ml_ops.observability.schemas.models import OpsImageRecordDetailResponse, OpsImageRecordsCountResponse, OpsImageRecordsResponse + +from datapipe_app.ops.ops_filters import merge_filter_rules, parse_filter_rules +from datapipe_app_ml_ops.ops.ops_specs_service import OpsSpecsService +from datapipe_app.app.errors import OpsSpecValidationError + + +def register_ops_spec_routes(app: FastAPI, service: OpsSpecsService) -> None: + @app.get("/pipelines/{pipeline_id}/ops-specs") + def list_ops_specs(pipeline_id: str) -> dict[str, Any]: + return service.list_specs(pipeline_id) + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}") + def get_ops_spec(pipeline_id: str, spec_id: str, debug: bool = False) -> dict[str, Any]: + try: + return service.get_spec(spec_id, debug=debug) + except KeyError as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-pages/frozen-datasets/overview") + def frozen_overview(pipeline_id: str) -> dict[str, Any]: + return service.frozen_overview() + + @app.get("/pipelines/{pipeline_id}/ops-pages/training/overview") + def training_overview(pipeline_id: str) -> dict[str, Any]: + return service.training_overview() + + @app.get("/pipelines/{pipeline_id}/ops-pages/metrics/overview") + def metrics_overview(pipeline_id: str) -> dict[str, Any]: + return service.metrics_overview() + + @app.get("/pipelines/{pipeline_id}/ops-pages/class-metrics/overview") + def class_metrics_overview(pipeline_id: str) -> dict[str, Any]: + return service.class_metrics_overview() + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets") + def frozen_rows( + pipeline_id: str, + spec_id: str, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "desc", + limit: int = 50, + offset: int = 0, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> dict[str, Any]: + try: + return service.frozen_rows( + spec_id, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=limit, + offset=offset, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(400, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/training/runs") + def training_rows( + pipeline_id: str, + spec_id: str, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "desc", + limit: int = 50, + offset: int = 0, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> dict[str, Any]: + try: + return service.training_rows( + spec_id, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=limit, + offset=offset, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(400, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/metrics/{table_id}/rows") + def metric_rows( + pipeline_id: str, + spec_id: str, + table_id: str, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "desc", + limit: int = 50, + offset: int = 0, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + model: list[str] = Query(default=[]), + subset: list[str] = Query(default=[]), + ) -> dict[str, Any]: + try: + return service.metric_table_rows( + spec_id, + table_id, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=limit, + offset=offset, + filter_rules=merge_filter_rules( + parse_filter_rules(filters), + model=model or None, + subset=subset or None, + ), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(400, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/class-metrics/{table_id}/rows") + def class_metric_rows( + pipeline_id: str, + spec_id: str, + table_id: str, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "desc", + limit: int = 50, + offset: int = 0, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + model: list[str] = Query(default=[]), + subset: list[str] = Query(default=[]), + ) -> dict[str, Any]: + try: + return service.metric_table_rows( + spec_id, + table_id, + class_metrics=True, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=limit, + offset=offset, + filter_rules=merge_filter_rules( + parse_filter_rules(filters), + model=model or None, + subset=subset or None, + ), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(400, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/image/records", response_model=OpsImageRecordsResponse) + def image_records( + pipeline_id: str, + spec_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "asc", + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsResponse: + try: + return service.image_records( + pipeline_id=pipeline_id, + spec_id=spec_id, + limit=limit, + offset=offset, + include_total=include_total, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/image/records/count", + response_model=OpsImageRecordsCountResponse, + ) + def image_records_count( + pipeline_id: str, + spec_id: str, + search: Optional[str] = None, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsCountResponse: + try: + return service.image_records_count( + pipeline_id=pipeline_id, + spec_id=spec_id, + search=search, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/image/records/{record_key}", + response_model=OpsImageRecordDetailResponse, + ) + def image_record_detail(pipeline_id: str, spec_id: str, record_key: str) -> OpsImageRecordDetailResponse: + try: + return service.image_record_detail(pipeline_id=pipeline_id, spec_id=spec_id, record_key=record_key) + except KeyError as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/image/records/{record_key}/preview") + def image_record_preview(pipeline_id: str, spec_id: str, record_key: str) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="data", + record_key=record_key, + mode="preview", + ) + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/image/records/{record_key}/visualization") + def image_record_visualization( + pipeline_id: str, + spec_id: str, + record_key: str, + overlay: Literal["record", "gt", "prediction", "both", "plain"] = "record", + max_side: int | None = None, + ) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="data", + record_key=record_key, + mode="visualization", + overlay=overlay, + max_side=max_side, + ) + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets/{dataset_id}/records", + response_model=OpsImageRecordsResponse, + ) + def frozen_dataset_records( + pipeline_id: str, + spec_id: str, + dataset_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "asc", + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsResponse: + try: + return service.frozen_dataset_records( + pipeline_id=pipeline_id, + spec_id=spec_id, + dataset_id=dataset_id, + limit=limit, + offset=offset, + include_total=include_total, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets/{dataset_id}/records/count", + response_model=OpsImageRecordsCountResponse, + ) + def frozen_dataset_records_count( + pipeline_id: str, + spec_id: str, + dataset_id: str, + search: Optional[str] = None, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsCountResponse: + try: + return service.frozen_dataset_records_count( + pipeline_id=pipeline_id, + spec_id=spec_id, + dataset_id=dataset_id, + search=search, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets/{dataset_id}/records/{record_key}", + response_model=OpsImageRecordDetailResponse, + ) + def frozen_dataset_record_detail( + pipeline_id: str, spec_id: str, dataset_id: str, record_key: str + ) -> OpsImageRecordDetailResponse: + try: + return service.frozen_dataset_record_detail( + pipeline_id=pipeline_id, spec_id=spec_id, dataset_id=dataset_id, record_key=record_key + ) + except KeyError as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets/{dataset_id}/records/{record_key}/preview" + ) + def frozen_dataset_record_preview(pipeline_id: str, spec_id: str, dataset_id: str, record_key: str) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="frozen_dataset", + record_key=record_key, + parent_id=dataset_id, + mode="preview", + ) + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets/{dataset_id}/records/{record_key}/visualization" + ) + def frozen_dataset_record_visualization( + pipeline_id: str, + spec_id: str, + dataset_id: str, + record_key: str, + overlay: Literal["record", "gt", "prediction", "both", "plain"] = "record", + max_side: int | None = None, + ) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="frozen_dataset", + record_key=record_key, + parent_id=dataset_id, + mode="visualization", + overlay=overlay, + max_side=max_side, + ) + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/models/{model_id}/predictions", + response_model=OpsImageRecordsResponse, + ) + def model_prediction_records( + pipeline_id: str, + spec_id: str, + model_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: Literal["asc", "desc"] = "asc", + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsResponse: + try: + return service.model_prediction_records( + pipeline_id=pipeline_id, + spec_id=spec_id, + model_id=model_id, + limit=limit, + offset=offset, + include_total=include_total, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/models/{model_id}/predictions/count", + response_model=OpsImageRecordsCountResponse, + ) + def model_prediction_records_count( + pipeline_id: str, + spec_id: str, + model_id: str, + search: Optional[str] = None, + filters: Optional[str] = None, + filter_mode: Literal["or", "and"] = "or", + ) -> OpsImageRecordsCountResponse: + try: + return service.model_prediction_records_count( + pipeline_id=pipeline_id, + spec_id=spec_id, + model_id=model_id, + search=search, + filter_rules=parse_filter_rules(filters), + filter_mode=filter_mode, + ) + except (KeyError, OpsSpecValidationError) as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/models/{model_id}/predictions/{record_key}", + response_model=OpsImageRecordDetailResponse, + ) + def model_prediction_record_detail( + pipeline_id: str, spec_id: str, model_id: str, record_key: str + ) -> OpsImageRecordDetailResponse: + try: + return service.model_prediction_record_detail( + pipeline_id=pipeline_id, spec_id=spec_id, model_id=model_id, record_key=record_key + ) + except KeyError as exc: + raise HTTPException(404, str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/ops-specs/{spec_id}/models/{model_id}/predictions/{record_key}/preview") + def model_prediction_record_preview( + pipeline_id: str, spec_id: str, model_id: str, record_key: str + ) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="model_prediction", + record_key=record_key, + parent_id=model_id, + mode="preview", + ) + + @app.get( + "/pipelines/{pipeline_id}/ops-specs/{spec_id}/models/{model_id}/predictions/{record_key}/visualization" + ) + def model_prediction_record_visualization( + pipeline_id: str, + spec_id: str, + model_id: str, + record_key: str, + overlay: Literal["record", "gt", "prediction", "both", "plain"] = "prediction", + max_side: int | None = None, + ) -> Response: + return _image_record_response( + service, + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="model_prediction", + record_key=record_key, + parent_id=model_id, + mode="visualization", + overlay=overlay, + max_side=max_side, + ) + + +def _image_record_response( + service: OpsSpecsService, + *, + pipeline_id: str, + spec_id: str, + scope: Literal["data", "frozen_dataset", "model_prediction"], + record_key: str, + parent_id: str | None = None, + mode: Literal["preview", "visualization"] = "visualization", + overlay: Literal["record", "gt", "prediction", "both", "plain"] = "record", + max_side: int | None = None, +) -> Response: + try: + content, media_type = service.image_record_bytes( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope=scope, + record_key=record_key, + parent_id=parent_id, + mode=mode, + overlay=overlay, + max_side=max_side, + ) + except KeyError as exc: + raise HTTPException(404, str(exc)) from exc + except OpsSpecValidationError as exc: + raise HTTPException(400, str(exc)) from exc + except Exception as exc: + raise HTTPException(500, str(exc)) from exc + headers = {"Cache-Control": "private, max-age=3600"} if mode == "preview" else None + return Response(content=content, media_type=media_type, headers=headers) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/routes.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/routes.py new file mode 100644 index 000000000..10c54cdef --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/routes/routes.py @@ -0,0 +1,215 @@ +from __future__ import annotations + +from typing import Any, Callable, Optional + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore +from fastapi import FastAPI, HTTPException + +from datapipe_app.observability.store.db import ObservabilityStore +from datapipe_app.observability.plugins.registry import ObservabilityRegistry +from datapipe_app.observability.config.settings import get_ops_settings +from datapipe_app_ml_ops.observability.metrics.metrics_service import MetricsService +from datapipe_app_ml_ops.observability.routes.ops_spec_routes import register_ops_spec_routes +from datapipe_app_ml_ops.observability.schemas.models import ( + ClassMetricDetailResponse, + ClassMetricsResponse, + FrozenDatasetDetailResponse, + FrozenDatasetsResponse, + MetricsEntityResolveResponse, + MetricsModelDetailResponse, + MetricsRunsResponse, + MetricsSummaryResponse, + TrainingRunsResponse, +) +from datapipe_app_ml_ops.observability.training.training_service import TrainingService +from datapipe_app_ml_ops.ops.ops_specs_service import OpsSpecsService +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.frozen_datasets_launch_routes import ( + register_frozen_datasets_launch_routes, +) +from datapipe_app_ml_ops.ops.training_experiments_routes import ( + register_training_experiments_routes, +) + + +def register_ml_observability_routes( + app: FastAPI, + *, + store: ObservabilityStore, + registry: ObservabilityRegistry, + ds: DataStore, + catalog: Catalog, + ops_spec_registry: OpsSpecRegistry, + run_steps: Optional[Callable[..., Any]] = None, +) -> None: + register_ops_spec_routes( + app, + OpsSpecsService(ops_spec_registry, ds=ds, catalog=catalog), + ) + + register_training_experiments_routes( + app, + registry=ops_spec_registry, + ds=ds, + catalog=catalog, + run_steps=run_steps, + ) + register_frozen_datasets_launch_routes( + app, + registry=ops_spec_registry, + run_steps=run_steps, + ) + + def _metrics_svc() -> MetricsService: + return MetricsService(store=store, ds=ds, catalog=catalog, ops_specs=ops_spec_registry) + + @app.get("/pipelines/{pipeline_id}/training/runs", response_model=TrainingRunsResponse) + def list_training_runs_extended( + pipeline_id: str, + task_type: Optional[str] = None, + framework: Optional[str] = None, + status: Optional[str] = None, + tags: Optional[str] = None, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 25, + offset: int = 0, + ) -> TrainingRunsResponse: + svc = TrainingService(store=store, ds=ds, catalog=catalog, ops_specs=ops_spec_registry) + return svc.list_runs( + pipeline_id, + task_type=task_type.split(",") if task_type else None, + framework=framework.split(",") if framework else None, + status=status.split(",") if status else None, + tags=tags.split(",") if tags else None, + search=search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=min(limit, 200), + offset=offset, + ) + + @app.get("/pipelines/{pipeline_id}/metrics/frozen-datasets", response_model=FrozenDatasetsResponse) + def get_frozen_datasets(pipeline_id: str) -> FrozenDatasetsResponse: + return _metrics_svc().list_frozen_datasets(pipeline_id) + + @app.get("/pipelines/{pipeline_id}/metrics/resolve-entity", response_model=MetricsEntityResolveResponse) + def resolve_metrics_entity( + pipeline_id: str, + model_id: Optional[str] = None, + dataset_id: Optional[str] = None, + ) -> MetricsEntityResolveResponse: + try: + return _metrics_svc().resolve_entity(pipeline_id, model_id=model_id, dataset_id=dataset_id) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + except KeyError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + + @app.get("/pipelines/{pipeline_id}/metrics/frozen-datasets/{dataset_id}", response_model=FrozenDatasetDetailResponse) + def get_frozen_dataset_detail( + pipeline_id: str, + dataset_id: str, + subset: Optional[str] = None, + ) -> FrozenDatasetDetailResponse: + return _metrics_svc().get_frozen_dataset_detail(pipeline_id, dataset_id, subset=subset) + + @app.get("/pipelines/{pipeline_id}/metrics/models/{model_id}", response_model=MetricsModelDetailResponse) + def get_model_detail( + pipeline_id: str, + model_id: str, + dataset_id: Optional[str] = None, + subset: Optional[str] = None, + ) -> MetricsModelDetailResponse: + return _metrics_svc().get_model_detail(pipeline_id, model_id, dataset_id=dataset_id, subset=subset) + + @app.get("/pipelines/{pipeline_id}/metrics/runs", response_model=MetricsRunsResponse) + def get_metrics_runs( + pipeline_id: str, + subset: Optional[str] = None, + model_id: Optional[str] = None, + search: Optional[str] = None, + task_type: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 25, + offset: int = 0, + ) -> MetricsRunsResponse: + return _metrics_svc().list_runs( + pipeline_id, + subset=subset, + model_id=model_id, + search=search, + task_type=task_type, + sort_by=sort_by, + sort_dir=sort_dir, + limit=min(limit, 200), + offset=offset, + ) + + @app.get("/pipelines/{pipeline_id}/metrics/summary", response_model=MetricsSummaryResponse) + def get_pipeline_metrics_summary( + pipeline_id: str, + subset: Optional[str] = None, + model_id: Optional[str] = None, + primary_metric: Optional[str] = None, + ) -> MetricsSummaryResponse: + return _metrics_svc().summary( + pipeline_id, + subset=subset, + model_id=model_id, + primary_metric=primary_metric, + ) + + @app.get("/pipelines/{pipeline_id}/metrics/classes", response_model=ClassMetricsResponse) + def get_class_metrics( + pipeline_id: str, + subset: Optional[str] = None, + model_id: Optional[str] = None, + label_search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 50, + offset: int = 0, + ) -> ClassMetricsResponse: + return _metrics_svc().list_classes( + pipeline_id, + subset=subset, + model_id=model_id, + label_search=label_search, + sort_by=sort_by, + sort_dir=sort_dir, + limit=min(limit, 500), + offset=offset, + ) + + @app.get("/pipelines/{pipeline_id}/metrics/classes/{label}", response_model=ClassMetricDetailResponse) + def get_class_metric_detail( + pipeline_id: str, + label: str, + subset: Optional[str] = None, + ) -> ClassMetricDetailResponse: + return _metrics_svc().class_detail(pipeline_id, label, subset=subset) + + @app.get("/training/{run_key}") + def get_training_run(run_key: str, pipeline_id: Optional[str] = None) -> dict[str, Any]: + pid = pipeline_id or get_ops_settings().pipeline_id or "" + detail: dict[str, Any] = {"run_key": run_key, "pipeline_id": pid} + for enricher in registry.enrichers: + try: + items = enricher.enrich_pipeline_detail( + pipeline_id=pid, + ds=ds, + catalog=catalog, + store=store, + ) + for item in items: + if item.get("type") == "ml_training_detail": + payload = item.get("payload", {}) + if payload.get("run_key") == run_key: + detail.update(payload) + except Exception: + pass + return detail diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/metrics_schema.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/metrics_schema.py new file mode 100644 index 000000000..ae5960aeb --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/metrics_schema.py @@ -0,0 +1,287 @@ +from __future__ import annotations + +from datapipe_app_ml_ops.observability.schemas.models import MetricColumnGroup, MetricDefinition, MetricsTableSchema + +_COUNT_KEYS = frozenset( + { + "images_support", + "support", + "TP", + "FP", + "FN", + "TP_extra_bbox", + "FP_extra_bbox", + "FN_extra_bbox", + "images", + "objects", + "detections", + "false_positives", + "false_negatives", + } +) + + +def _def( + key: str, + label: str, + short: str, + group: str, + *, + task_types: list[str] | None = None, + fmt: str = "float", + visible: bool = True, + primary: bool = False, + higher: bool = True, +) -> MetricDefinition: + return MetricDefinition( + key=key, + label=label, + short_label=short, + group=group, + task_types=task_types or ["*"], + format=fmt, + higher_is_better=higher, + visible_by_default=visible, + primary=primary, + ) + + +def _classification_groups() -> list[MetricColumnGroup]: + return [ + MetricColumnGroup( + key="core", + label="Core", + priority=1, + metrics=[ + _def("weighted_f1_score", "Primary F1", "Primary", "core", primary=True), + _def("accuracy", "Accuracy", "Acc", "core"), + _def("support", "Support", "Sup", "core", fmt="integer"), + ], + ), + MetricColumnGroup( + key="weighted", + label="Weighted", + priority=2, + metrics=[ + _def("weighted_f1_score", "Weighted F1", "F1", "weighted"), + _def("weighted_precision", "Weighted Precision", "P", "weighted"), + _def("weighted_recall", "Weighted Recall", "R", "weighted"), + ], + ), + MetricColumnGroup( + key="macro", + label="Macro", + priority=3, + metrics=[ + _def("macro_f1_score", "Macro F1", "F1", "macro"), + _def("macro_precision", "Macro Precision", "P", "macro"), + _def("macro_recall", "Macro Recall", "R", "macro"), + ], + ), + MetricColumnGroup( + key="no_pseudo", + label="No pseudo", + priority=4, + metrics=[ + _def("weighted_without_pseudo_classes_f1_score", "Weighted F1", "F1", "no_pseudo", visible=False), + _def("weighted_without_pseudo_classes_precision", "Weighted P", "P", "no_pseudo", visible=False), + _def("weighted_without_pseudo_classes_recall", "Weighted R", "R", "no_pseudo", visible=False), + _def("macro_without_pseudo_classes_f1_score", "Macro F1", "F1", "no_pseudo", visible=False), + _def("macro_without_pseudo_classes_precision", "Macro P", "P", "no_pseudo", visible=False), + _def("macro_without_pseudo_classes_recall", "Macro R", "R", "no_pseudo", visible=False), + ], + ), + ] + + +def _detection_groups() -> list[MetricColumnGroup]: + return [ + MetricColumnGroup( + key="core", + label="Core", + priority=1, + metrics=[ + _def("mAP50_95", "mAP50-95", "mAP", "core", task_types=["detection"], primary=True), + _def("mAP50", "mAP50", "mAP50", "core", task_types=["detection"]), + _def("support", "Support", "Sup", "core", fmt="integer"), + ], + ), + MetricColumnGroup( + key="weighted", + label="Weighted", + priority=2, + metrics=[ + _def("weighted_f1_score", "Weighted F1", "F1", "weighted"), + _def("weighted_precision", "Weighted Precision", "P", "weighted"), + _def("weighted_recall", "Weighted Recall", "R", "weighted"), + ], + ), + MetricColumnGroup( + key="macro", + label="Macro", + priority=3, + metrics=[ + _def("macro_f1_score", "Macro F1", "F1", "macro"), + _def("macro_precision", "Macro Precision", "P", "macro"), + _def("macro_recall", "Macro Recall", "R", "macro"), + ], + ), + MetricColumnGroup( + key="quality", + label="Detection", + priority=4, + metrics=[ + _def("precision", "Precision", "P", "quality", task_types=["detection"]), + _def("recall", "Recall", "R", "quality", task_types=["detection"]), + _def("f1_score", "F1", "F1", "quality", task_types=["detection"]), + ], + ), + MetricColumnGroup( + key="localization", + label="Localization", + priority=5, + metrics=[ + _def("iou_mean", "Mean IoU", "IoU", "localization", task_types=["detection"], visible=False), + ], + ), + ] + + +def _segmentation_groups() -> list[MetricColumnGroup]: + return [ + MetricColumnGroup( + key="core", + label="Core", + priority=1, + metrics=[ + _def("iou_mean", "mIoU", "mIoU", "core", task_types=["segmentation"], primary=True), + _def("dice", "Dice", "Dice", "core", task_types=["segmentation"]), + _def("pixel_accuracy", "Pixel accuracy", "PixAcc", "core", task_types=["segmentation"], visible=False), + _def("support", "Support", "Sup", "core", fmt="integer"), + ], + ), + ] + + +def _keypoints_groups() -> list[MetricColumnGroup]: + return [ + MetricColumnGroup( + key="core", + label="Core", + priority=1, + metrics=[ + _def("pose_mAP50_95", "Pose mAP50-95", "mAP", "core", task_types=["keypoints"], primary=True), + _def("pose_mAP50", "Pose mAP50", "mAP50", "core", task_types=["keypoints"]), + _def("support", "Support", "Sup", "core", fmt="integer"), + ], + ), + MetricColumnGroup( + key="pose", + label="Pose", + priority=2, + metrics=[ + _def("pose_P", "Pose precision", "P", "pose", task_types=["keypoints"]), + _def("pose_R", "Pose recall", "R", "pose", task_types=["keypoints"]), + _def("OKS", "OKS", "OKS", "pose", task_types=["keypoints"], visible=False), + _def("PCK", "PCK", "PCK", "pose", task_types=["keypoints"], visible=False), + ], + ), + ] + + +def infer_task_type_from_metrics(available: set[str]) -> str | None: + if available & {"mAP50", "mAP50_95"}: + return "detection" + if any(k.startswith("pose_") for k in available): + return "keypoints" + if available & { + "weighted_f1_score", + "macro_f1_score", + "weighted_precision", + "macro_precision", + "accuracy", + }: + return "classification" + return None + + +def _heuristic_group(key: str) -> str: + lk = key.lower() + if any(x in lk for x in ("support", "count", "items", "images", "objects")): + return "counts" + if any(x in lk for x in ("map", "iou", "dice", "oks", "pck", "hausdorff")): + return "task_specific" + if any(x in lk for x in ("f1", "precision", "recall", "accuracy")): + return "quality" + return "other" + + +def _fallback_groups(available: set[str], primary_metric: str) -> list[MetricColumnGroup]: + by_group: dict[str, list[MetricDefinition]] = {} + for key in sorted(available): + if key in _COUNT_KEYS: + continue + group = _heuristic_group(key) + by_group.setdefault(group, []).append( + _def(key, key.replace("_", " ").title(), key[:6], group, primary=(key == primary_metric)) + ) + return [ + MetricColumnGroup(key=g, label=g.replace("_", " ").title(), priority=i + 1, metrics=metrics) + for i, (g, metrics) in enumerate(sorted(by_group.items(), key=lambda x: x[0])) + ] + + +def build_metric_schema( + task_type: str | None, + available_metrics: list[str] | set[str], + *, + primary_metric: str | None = None, +) -> MetricsTableSchema: + tt = (task_type or "custom").lower() + available = set(available_metrics) + if tt == "custom": + inferred = infer_task_type_from_metrics(available) + if inferred: + tt = inferred + if tt in ("classification", "cls"): + groups = _classification_groups() + pm = primary_metric or "weighted_f1_score" + elif tt == "detection": + groups = _detection_groups() + pm = primary_metric or "mAP50_95" + elif tt == "segmentation": + groups = _segmentation_groups() + pm = primary_metric or "iou_mean" + elif tt in ("keypoints", "pose"): + groups = _keypoints_groups() + pm = primary_metric or "pose_mAP50_95" + else: + pm = primary_metric or (next(iter(available), None) or "f1_score") + groups = _fallback_groups(available, pm) + + filtered: list[MetricColumnGroup] = [] + seen_keys: set[str] = set() + for group in groups: + metrics = [] + for m in group.metrics: + if m.key in seen_keys: + continue + if available and m.key not in available: + continue + seen_keys.add(m.key) + metrics.append(m) + if metrics: + filtered.append(group.model_copy(update={"metrics": metrics})) + + other_keys = sorted(k for k in available if k not in seen_keys and k not in _COUNT_KEYS) + if other_keys: + filtered.append( + MetricColumnGroup( + key="other", + label="Other", + priority=99, + metrics=[_def(k, k, k[:6], "other", visible=False) for k in other_keys], + ) + ) + + return MetricsTableSchema(task_type=tt, primary_metric=pm, groups=filtered) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/models.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/models.py new file mode 100644 index 000000000..82c7f93e5 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/schemas/models.py @@ -0,0 +1,415 @@ +from __future__ import annotations + +from typing import Any, Literal, Optional + +from pydantic import BaseModel, Field + + +class KpiItem(BaseModel): + key: str + label: str + value: float | str | None = None + delta: Optional[float] = None + delta_pct: Optional[float] = None + trend: list[dict[str, float | str | None]] = Field(default_factory=list) + format: str = "float" + higher_is_better: bool = True + subtitle: Optional[str] = None + + +class AnomalyItem(BaseModel): + severity: Literal["info", "warning", "critical"] + metric: str + title: str + description: str + run_id: Optional[str] = None + value: Optional[float] = None + expected: Optional[float] = None + delta: Optional[float] = None + + +class MetricsRunRow(BaseModel): + run_id: str + run_key: Optional[str] = None + pipeline_id: str + model_id: str = "" + model_version: Optional[str] = None + task_type: Optional[str] = None + subset: str = "" + dataset_id: Optional[str] = None + train_items: Optional[int] = None + val_items: Optional[int] = None + started_at: Optional[str] = None + finished_at: Optional[str] = None + duration_s: Optional[int] = None + status: Optional[str] = "success" + metrics: dict[str, float | None] = Field(default_factory=dict) + deltas: dict[str, float | None] = Field(default_factory=dict) + delta_pct: dict[str, float | None] = Field(default_factory=dict) + tags: list[str] = Field(default_factory=list) + + +class SplitCounts(BaseModel): + train: Optional[int] = None + val: Optional[int] = None + test: Optional[int] = None + + +class MetricDefinition(BaseModel): + key: str + label: str + short_label: str + group: str + task_types: list[str] = Field(default_factory=lambda: ["*"]) + format: str = "float" + higher_is_better: bool = True + visible_by_default: bool = True + primary: bool = False + description: Optional[str] = None + decimals: Optional[int] = None + + +class MetricColumnGroup(BaseModel): + key: str + label: str + priority: int = 0 + metrics: list[MetricDefinition] = Field(default_factory=list) + + +class MetricsTableSchema(BaseModel): + task_type: str = "custom" + primary_metric: str = "f1_score" + groups: list[MetricColumnGroup] = Field(default_factory=list) + + +class MetricsModelRow(BaseModel): + id: str + pipeline_id: str + model_id: str + model_display_name: Optional[str] = None + model_source: Optional[str] = None + model_version: Optional[str] = None + task_type: Optional[str] = None + dataset_id: Optional[str] = None + dataset_display_name: Optional[str] = None + frozen_at: Optional[str] = None + subset: str = "" + split_counts: SplitCounts = Field(default_factory=SplitCounts) + has_metrics: bool = False + metrics_state: Optional[str] = "not_computed" + metrics: dict[str, float | None] = Field(default_factory=dict) + run_id: Optional[str] = None + run_key: Optional[str] = None + started_at: Optional[str] = None + finished_at: Optional[str] = None + duration_s: Optional[int] = None + status: Optional[str] = None + tags: list[str] = Field(default_factory=list) + + +class MetricsCandidateCreate(BaseModel): + model_id: str + model_source: str = "manual" + artifact_uri: Optional[str] = None + dataset_id: str + subset: str = "val" + task_type: Optional[str] = None + + +class MetricsCandidateRow(BaseModel): + id: str + pipeline_id: str + model_id: str + model_source: str = "manual" + artifact_uri: Optional[str] = None + dataset_id: str + subset: str = "val" + task_type: Optional[str] = None + metrics_state: str = "not_computed" + + +class MetricsCandidatesResponse(BaseModel): + rows: list[MetricsCandidateRow] + total: int + + +class MetricsEvaluateRequest(BaseModel): + candidate_ids: list[str] = Field(default_factory=list) + labels: list[list[str]] = Field(default_factory=lambda: [["stage", "count-metrics"]]) + background: bool = True + + +class MetricsEvaluateResponse(BaseModel): + run_id: str + status: str = "running" + + +class MetricsRunsResponse(BaseModel): + model_config = {"populate_by_name": True} + + rows: list[MetricsModelRow] + total: int + available_filters: dict[str, list[str]] + table_schema: MetricsTableSchema = Field(alias="schema") + + +class FrozenDatasetRow(BaseModel): + dataset_id: str + frozen_at: Optional[str] = None + train_count: Optional[int] = None + val_count: Optional[int] = None + test_count: Optional[int] = None + models_count: Optional[int] = None + + +class FrozenDatasetsResponse(BaseModel): + rows: list[FrozenDatasetRow] + total: int + + +class MetricsSummaryResponse(BaseModel): + pipeline_id: str + primary_metric: str + has_metrics: bool = False + latest_run: Optional[MetricsRunRow] = None + best_run: Optional[MetricsRunRow] = None + previous_run: Optional[MetricsRunRow] = None + kpis: list[KpiItem] = Field(default_factory=list) + anomalies: list[AnomalyItem] = Field(default_factory=list) + + +class MetricsTimeseriesResponse(BaseModel): + series: list[dict[str, object]] + + +class ClassMetricRow(BaseModel): + label: str + subset: Optional[str] = None + model_id: Optional[str] = None + class_id: Optional[str | int] = None + images_support: Optional[int] = None + support: Optional[int] = None + TP: Optional[int] = None + FP: Optional[int] = None + FN: Optional[int] = None + precision: Optional[float] = None + recall: Optional[float] = None + f1_score: Optional[float] = None + iou_mean: Optional[float] = None + mAP50: Optional[float] = None + mAP50_95: Optional[float] = None + pose_P: Optional[float] = None + pose_R: Optional[float] = None + pose_mAP50: Optional[float] = None + pose_mAP50_95: Optional[float] = None + delta: dict[str, float | None] = Field(default_factory=dict) + trend: dict[str, list[dict[str, float | str | None]]] = Field(default_factory=dict) + + +class ClassMetricsResponse(BaseModel): + rows: list[ClassMetricRow] + total: int + summary: dict[str, object] + + +class ClassMetricDetailResponse(BaseModel): + label: str + class_id: Optional[str | int] = None + latest: ClassMetricRow + previous: Optional[ClassMetricRow] = None + trends: list[dict[str, object]] = Field(default_factory=list) + error_breakdown: Optional[dict[str, int]] = None + confusion_top: list[dict[str, object]] = Field(default_factory=list) + gallery_url: Optional[str] = None + + +class TrainingRunRow(BaseModel): + run_key: str + run_id: Optional[str] = None + model_id: Optional[str] = None + task_type: Optional[str] = None + framework: Optional[str] = None + dataset: Optional[str] = None + started_at: Optional[str] = None + finished_at: Optional[str] = None + duration_s: Optional[int] = None + status: str = "unknown" + attempt: Optional[int] = None + tags: list[str] = Field(default_factory=list) + best_metric_name: Optional[str] = None + best_metric_value: Optional[float] = None + params: dict[str, object] = Field(default_factory=dict) + artifacts: dict[str, object] = Field(default_factory=dict) + is_best: bool = False + + +class TrainingRunsResponse(BaseModel): + rows: list[TrainingRunRow] + total: int + filters: dict[str, list[str]] + + +class TrainingCompareResponse(BaseModel): + runs: list[TrainingRunRow] = Field(default_factory=list) + available_metrics: list[dict[str, object]] = Field(default_factory=list) + charts: list[dict[str, object]] = Field(default_factory=list) + run_keys: list[str] = Field(default_factory=list) + charts_legacy: list[dict[str, object]] = Field(default_factory=list) + + +class EntitySourceRecord(BaseModel): + table_name: str + pk: dict[str, Any] | None = None + record: dict[str, Any] = Field(default_factory=dict) + + +class MetricsModelDetailKpi(BaseModel): + key: str + label: str + value: float | str | None = None + format: str = "float" + + +class MetricsModelDetailRelated(BaseModel): + dataset_id: Optional[str] = None + run_key: Optional[str] = None + run_id: Optional[str] = None + + +class MetricsEntityResolveResponse(BaseModel): + kind: Literal["model", "dataset"] + spec_id: str + model_id: Optional[str] = None + dataset_id: Optional[str] = None + + +class MetricsModelDetailResponse(BaseModel): + pipeline_id: str + model_id: str + title: str + spec_id: Optional[str] = None + source_table: Optional[str] = None + source_pk: dict[str, Any] | None = None + source_record: dict[str, Any] | None = None + source_table_url: Optional[str] = None + model_row: Optional[MetricsModelRow] = None + frozen_dataset: Optional[FrozenDatasetRow] = None + frozen_dataset_source_table: Optional[str] = None + frozen_dataset_source_pk: dict[str, Any] | None = None + metrics_rows: list[MetricsModelRow] = Field(default_factory=list) + kpis: list[MetricsModelDetailKpi] = Field(default_factory=list) + related: MetricsModelDetailRelated = Field(default_factory=MetricsModelDetailRelated) + + +class FrozenDatasetCoverage(BaseModel): + models_total: int = 0 + models_with_metrics: int = 0 + subsets: list[str] = Field(default_factory=list) + best_metric_key: Optional[str] = None + best_metric_value: Optional[float] = None + best_model_id: Optional[str] = None + + +class FrozenDatasetLinkedModelRow(BaseModel): + model_id: str + created_at: Optional[str] = None + run_key: Optional[str] = None + run_id: Optional[str] = None + link_table: Optional[str] = None + link_record: dict[str, Any] | None = None + + +class FrozenDatasetDetailResponse(BaseModel): + pipeline_id: str + dataset_id: str + title: str + spec_id: Optional[str] = None + dataset: FrozenDatasetRow + source_table: Optional[str] = None + source_pk: dict[str, Any] | None = None + source_record: dict[str, Any] | None = None + source_table_url: Optional[str] = None + linked_models: list[FrozenDatasetLinkedModelRow] = Field(default_factory=list) + coverage: FrozenDatasetCoverage = Field(default_factory=FrozenDatasetCoverage) + + +class OpsBBoxRow(BaseModel): + label: str | None = None + confidence: float | None = None + x1: float | None = None + y1: float | None = None + x2: float | None = None + y2: float | None = None + + +class OpsImageRecordListRow(BaseModel): + record_key: str + pk: dict[str, Any] + preview_url: str | None = None + visualization_url: str | None = None + detail_url: str | None = None + subset: str | None = None + bbox_count: int | None = None + gt_bbox_count: int | None = None + prediction_bbox_count: int | None = None + label: str | None = None + gt_label: str | None = None + prediction_label: str | None = None + prediction_score: float | None = None + is_error: bool | None = None + metrics: dict[str, Any] | None = None + + +class OpsImageRecordsResponse(BaseModel): + pipeline_id: str + spec_id: str + scope: Literal["data", "frozen_dataset", "model_prediction"] + parent_id: str | None = None + primary_key_columns: list[str] + list_columns: list[str] = Field(default_factory=list) + rows: list[OpsImageRecordListRow] + total: int | None = None + limit: int + offset: int + + +class OpsImageRecordsCountResponse(BaseModel): + pipeline_id: str + spec_id: str + scope: Literal["data", "frozen_dataset", "model_prediction"] + parent_id: str | None = None + total: int + + +class OpsImageRecordDetailResponse(BaseModel): + pipeline_id: str + spec_id: str + scope: Literal["data", "frozen_dataset", "model_prediction"] + parent_id: str | None = None + record_key: str + pk: dict[str, Any] + record: dict[str, Any] + image_url: str | None = None + subset: str | None = None + preview_url: str | None = None + visualization_url: str | None = None + plain_image_url: str | None = None + gt_visualization_url: str | None = None + prediction_visualization_url: str | None = None + plain_gt_image_url: str | None = None + plain_prediction_image_url: str | None = None + bbox_count: int | None = None + gt_bbox_count: int | None = None + prediction_bbox_count: int | None = None + label: str | None = None + gt_label: str | None = None + prediction_label: str | None = None + prediction_score: float | None = None + is_error: bool | None = None + bbox_rows: list[OpsBBoxRow] = Field(default_factory=list) + gt_bbox_rows: list[OpsBBoxRow] = Field(default_factory=list) + prediction_bbox_rows: list[OpsBBoxRow] = Field(default_factory=list) + index: int | None = None + total: int | None = None + prev_record_key: str | None = None + next_record_key: str | None = None diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/store/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/store/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/store/db_models.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/store/db_models.py new file mode 100644 index 000000000..d868bb211 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/store/db_models.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +from datetime import datetime + +from typing import cast + +from sqlalchemy import DateTime, String, Table, Text +from sqlalchemy.orm import Mapped, mapped_column + +from datapipe_app.app.db_schema import ObservabilityBase +from datapipe_app.observability.store.db import utc_now +from datapipe_app_ml_ops.observability.config.tables import MLObservabilityTableConfig + + +class PipelineMetricsCandidateRow(ObservabilityBase): + __tablename__ = "metrics_candidates" + + id: Mapped[str] = mapped_column(String(64), primary_key=True) + pipeline_id: Mapped[str] = mapped_column(String(255), nullable=False, index=True) + model_id: Mapped[str] = mapped_column(String(512), nullable=False) + model_source: Mapped[str] = mapped_column(String(64), nullable=False, default="manual") + artifact_uri: Mapped[str | None] = mapped_column(String(2048), nullable=True) + dataset_id: Mapped[str] = mapped_column(String(512), nullable=False) + subset: Mapped[str] = mapped_column(String(64), nullable=False, default="val") + task_type: Mapped[str | None] = mapped_column(String(64), nullable=True) + metrics_state: Mapped[str] = mapped_column(String(32), nullable=False, default="not_computed") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) + + +def apply_ml_table_config(*, tables: MLObservabilityTableConfig, schema: str | None) -> None: + table = cast(Table, PipelineMetricsCandidateRow.__table__) + table.name = tables.metrics_candidates + table.schema = schema + + +def list_metrics_candidates(store, pipeline_id: str) -> list[PipelineMetricsCandidateRow]: + from sqlalchemy import select + + with store.session() as session: + return list( + session.scalars( + select(PipelineMetricsCandidateRow) + .where(PipelineMetricsCandidateRow.pipeline_id == pipeline_id) + .order_by(PipelineMetricsCandidateRow.created_at.desc()) + ).all() + ) + + +def add_metrics_candidate(store, row: PipelineMetricsCandidateRow) -> PipelineMetricsCandidateRow: + with store.session() as session: + session.add(row) + session.commit() + session.refresh(row) + return row + + +def delete_metrics_candidate(store, pipeline_id: str, candidate_id: str) -> bool: + with store.session() as session: + row = session.get(PipelineMetricsCandidateRow, candidate_id) + if row is None or row.pipeline_id != pipeline_id: + return False + session.delete(row) + session.commit() + return True + + +__all__ = [ + "PipelineMetricsCandidateRow", + "add_metrics_candidate", + "apply_ml_table_config", + "delete_metrics_candidate", + "list_metrics_candidates", + "utc_now", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/spec_training.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/spec_training.py new file mode 100644 index 000000000..40e21c3c6 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/spec_training.py @@ -0,0 +1,139 @@ +from __future__ import annotations + +from typing import Any + +import pandas as pd +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app.ops.ops_spec_resolve import column_by_kind, column_source_by_link +from datapipe_app_ml_ops.ops.ops_specs_service import OpsSpecsService +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec + + +def best_model_ids_from_specs(registry: OpsSpecRegistry, ds: DataStore, catalog: Catalog) -> set[str]: + best: set[str] = set() + for spec in registry.list(): + model = spec.model + if model is None or not model.is_best_table or not model.is_best_column: + continue + dt = ds.get_table(model.is_best_table) + try: + df = dt.get_data() + except Exception: + continue + for _, row in df.iterrows(): + if not row.get(model.is_best_column): + continue + model_id = row.get(model.id_column) + if model_id is not None and not pd.isna(model_id): + best.add(str(model_id)) + return best + + +def _task_type(spec: DatapipeOpsSpec) -> str: + if spec.tags: + return spec.tags[0] + return spec.id + + +def list_training_runs_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, + pipeline_id: str, +) -> list[dict[str, Any]]: + if not registry.list(): + return [] + + service = OpsSpecsService(registry, ds=ds, catalog=catalog) + best_models = best_model_ids_from_specs(registry, ds, catalog) + rows: list[dict[str, Any]] = [] + + for spec in registry.list(): + training = spec.training + if training is None: + continue + payload = service.training_rows(spec.id, limit=500) + run_col = column_source_by_link(training.columns, "training_run") + model_col = column_source_by_link(training.columns, "model") + dataset_col = column_source_by_link(training.columns, "frozen_dataset") + status_col = column_by_kind(training.columns, "status") + started_col = next((column.source for column in training.columns if column.kind == "datetime"), None) + finished_col = started_col.replace("started_at", "finished_at") if started_col and "started_at" in started_col else None + launcher_col = next((column.source for column in training.columns if "launcher_type" in column.source), None) + + for row in payload["rows"]: + run_key = str(row.get(run_col) or "") if run_col else "" + model_id = row.get(model_col) if model_col else None + model_text = str(model_id) if model_id is not None and not pd.isna(model_id) else None + started_at = row.get(started_col) if started_col else None + finished_at = row.get(finished_col) if finished_col else None + duration_s = row.get("duration_seconds") + rows.append( + { + "run_key": run_key, + "status": row.get(status_col.source) if status_col else None, + "attempt": row.get(next((c.source for c in training.columns if "attempt" in c.source), ""), 0), + "model_id": model_text, + "dataset_id": str(row.get(dataset_col)) if dataset_col and row.get(dataset_col) is not None and not pd.isna(row.get(dataset_col)) else None, + "started_at": started_at, + "finished_at": finished_at, + "duration_s": int(duration_s) if duration_s is not None and not pd.isna(duration_s) else None, + "launcher_type": row.get(launcher_col) if launcher_col else None, + "is_best": model_text in best_models if model_text else False, + "task_type": _task_type(spec), + "spec_id": spec.id, + "pipeline_id": pipeline_id, + } + ) + + rows.sort(key=lambda item: (item.get("started_at") or "", item.get("run_key") or "")) + return rows + + +def build_run_detail_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, + *, + run_key: str, + pipeline_id: str, +) -> dict[str, Any] | None: + service = OpsSpecsService(registry, ds=ds, catalog=catalog) + best_models = best_model_ids_from_specs(registry, ds, catalog) + + for spec in registry.list(): + training = spec.training + if training is None: + continue + run_col = column_source_by_link(training.columns, "training_run") + model_col = column_source_by_link(training.columns, "model") + status_col = column_by_kind(training.columns, "status") + if not run_col: + continue + payload = service.training_rows(spec.id, limit=500, filters={run_col: run_key}) + if not payload["rows"]: + continue + row = payload["rows"][0] + model_id = row.get(model_col) if model_col else None + model_text = str(model_id) if model_id is not None and not pd.isna(model_id) else None + artifacts = { + key: row.get(column) + for key, column in training.artifact_columns.items() + } + return { + "run_key": run_key, + "pipeline_id": pipeline_id, + "status": row.get(status_col.source) if status_col else None, + "model_id": model_text, + "params": { + "launcher_type": next((row.get(column.source) for column in training.columns if "launcher_type" in column.source), None), + }, + "artifacts": artifacts, + "is_best": model_text in best_models if model_text else False, + "task_type": _task_type(spec), + "spec_id": spec.id, + } + return None diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/training_service.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/training_service.py new file mode 100644 index 000000000..7100b781d --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/observability/training/training_service.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +import math +from typing import Any, Optional + +from datapipe_app_ml_ops.ops.ops_spec_metrics import latest_eval_metric_from_specs +from datapipe_app_ml_ops.observability.schemas.models import TrainingRunRow, TrainingRunsResponse +from datapipe_app_ml_ops.observability.training.spec_training import list_training_runs_from_specs + + +def _is_nan(val: Any) -> bool: + if val is None: + return True + if isinstance(val, float) and math.isnan(val): + return True + try: + import pandas as pd + + if pd.isna(val): + return True + except Exception: + pass + return str(val).lower() == "nan" + + +def _clean_str(val: Any) -> Optional[str]: + if _is_nan(val): + return None + return str(val) + + +def _clean_optional_str(val: Any) -> Optional[str]: + if _is_nan(val): + return None + text = str(val).strip() + return text or None + + +def _clean_float(val: Any) -> Optional[float]: + if _is_nan(val): + return None + try: + return float(val) + except (TypeError, ValueError): + return None + + +def _launcher_framework(launcher_type: Optional[str]) -> Optional[str]: + return str(launcher_type) if launcher_type else None + + +class TrainingService: + def __init__( + self, + *, + store: Any = None, + ds: Any = None, + catalog: Any = None, + ops_specs: Any = None, + ) -> None: + self.store = store + self.ds = ds + self.catalog = catalog + self.ops_specs = ops_specs + + def _raw_runs(self, pipeline_id: str) -> list[dict[str, Any]]: + if self.ops_specs is None or self.ds is None or self.catalog is None or not self.ops_specs.list(): + return [] + return list_training_runs_from_specs(self.ops_specs, self.ds, self.catalog, pipeline_id) + + def list_runs( + self, + pipeline_id: str, + *, + task_type: Optional[list[str]] = None, + framework: Optional[list[str]] = None, + status: Optional[list[str]] = None, + tags: Optional[list[str]] = None, + search: Optional[str] = None, + sort_by: Optional[str] = None, + sort_dir: str = "desc", + limit: int = 25, + offset: int = 0, + ) -> TrainingRunsResponse: + raw = self._raw_runs(pipeline_id) + + rows: list[TrainingRunRow] = [] + for r in raw: + eval_m = r.get("eval_metric") or {} + if not eval_m and self.ops_specs is not None and self.ds is not None and self.catalog is not None: + model_id = r.get("model_id") + eval_m = latest_eval_metric_from_specs( + self.ops_specs, + self.ds, + self.catalog, + model_id=str(model_id) if model_id is not None else None, + ) or {} + best_name = eval_m.get("metric_name") + best_val = eval_m.get("metric_value") + tt = r.get("task_type") + fw = _launcher_framework(_clean_optional_str(r.get("launcher_type"))) + rows.append( + TrainingRunRow( + run_key=_clean_str(r.get("run_key")) or "", + run_id=_clean_str(r.get("run_key")) or "", + model_id=_clean_optional_str(r.get("model_id")), + task_type=tt, + framework=fw, + dataset=_clean_optional_str(r.get("dataset_id")), + started_at=_clean_optional_str(r.get("started_at")), + finished_at=_clean_optional_str(r.get("finished_at")), + duration_s=int(r["duration_s"]) if not _is_nan(r.get("duration_s")) and r.get("duration_s") is not None else None, + status=_clean_str(r.get("status")) or "unknown", + attempt=int(r["attempt"]) if not _is_nan(r.get("attempt")) and r.get("attempt") is not None else None, + tags=r.get("tags") or [], + best_metric_name=_clean_optional_str(best_name), + best_metric_value=_clean_float(best_val), + params={"launcher_type": _clean_optional_str(r.get("launcher_type")), "attempt": r.get("attempt")}, + artifacts={ + "run_dir": _clean_optional_str(r.get("run_dir")), + }, + is_best=bool(r.get("is_best")), + ) + ) + + if task_type: + rows = [r for r in rows if r.task_type in task_type] + if framework: + rows = [r for r in rows if r.framework in framework] + if status: + rows = [r for r in rows if r.status in status] + if tags: + rows = [r for r in rows if any(t in r.tags for t in tags)] + if search: + q = search.lower() + rows = [r for r in rows if q in r.run_key.lower() or q in (r.model_id or "").lower()] + + if sort_by: + reverse = sort_dir != "asc" + + def _sort_key(row: TrainingRunRow) -> str: + value = row.model_dump().get(sort_by) + return "" if value is None else str(value) + + rows = sorted(rows, key=_sort_key, reverse=reverse) + + total = len(rows) + page = rows[offset : offset + limit] + filters = { + "task_types": sorted({r.task_type for r in rows if r.task_type}), + "frameworks": sorted({r.framework for r in rows if r.framework}), + "datasets": sorted({r.dataset for r in rows if r.dataset}), + "statuses": sorted({r.status for r in rows}), + "tags": sorted({t for r in rows for t in r.tags}), + } + return TrainingRunsResponse(rows=page, total=total, filters=filters) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_routes.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_routes.py new file mode 100644 index 000000000..9021ca604 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_routes.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from typing import Any, Callable, Optional, TypeVar + +from fastapi import FastAPI +from fastapi.responses import JSONResponse + +from datapipe_app_ml_ops.ops.frozen_datasets_launch_service import ( + FreezeLaunchResponse, + FrozenDatasetsLaunchService, +) +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.training_experiments_models import TrainingExperimentError +from datapipe_app_ml_ops.ops.training_experiments_service import RunStepsCallable + +T = TypeVar("T") + +_BASE = "/pipelines/{pipeline_id}/ops-specs/{spec_id}/frozen-datasets" + + +def _error_response(exc: TrainingExperimentError) -> JSONResponse: + return JSONResponse(status_code=exc.status_code, content=exc.to_payload()) + + +def _guard(fn: Callable[[], T]) -> Any: + try: + return fn() + except TrainingExperimentError as exc: + return _error_response(exc) + + +def register_frozen_datasets_launch_routes( + app: FastAPI, + *, + registry: OpsSpecRegistry, + run_steps: Optional[RunStepsCallable] = None, +) -> None: + """Register freeze-launch endpoint for ops frozen-dataset specs.""" + + def _service() -> FrozenDatasetsLaunchService: + return FrozenDatasetsLaunchService(registry, run_steps=run_steps) + + @app.post(_BASE + "/launch", response_model=FreezeLaunchResponse) + def launch_freeze(pipeline_id: str, spec_id: str) -> Any: + return _guard(lambda: _service().launch_freeze(spec_id)) + + +__all__ = ["register_frozen_datasets_launch_routes"] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_service.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_service.py new file mode 100644 index 000000000..609ed1b91 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/frozen_datasets_launch_service.py @@ -0,0 +1,79 @@ +"""Launch freeze / snapshot pipeline steps from an ops frozen-dataset spec.""" + +from __future__ import annotations + +from typing import Any, Dict, Optional + +from pydantic import BaseModel + +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsFrozenDatasetSpec +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.training_experiments_models import TrainingExperimentError +from datapipe_app_ml_ops.ops.training_experiments_service import RunStepsCallable + +RunStepsResult = Dict[str, Any] + + +class FreezeLaunchResponse(BaseModel): + started: bool + run_id: Optional[str] = None + + +class FrozenDatasetsLaunchService: + def __init__( + self, + registry: OpsSpecRegistry, + *, + run_steps: Optional[RunStepsCallable] = None, + ) -> None: + self.registry = registry + self.run_steps = run_steps + + def _spec(self, spec_id: str) -> DatapipeOpsSpec: + try: + return self.registry.get(spec_id) + except KeyError as exc: + raise TrainingExperimentError( + "not_found", + f'Ops spec "{spec_id}" was not found.', + status_code=404, + ) from exc + + def _frozen_spec(self, spec_id: str) -> OpsFrozenDatasetSpec: + spec = self._spec(spec_id) + if spec.frozen_dataset is None: + raise TrainingExperimentError( + "frozen_dataset_not_configured", + f'Ops spec "{spec_id}" has no frozen_dataset section.', + status_code=400, + ) + return spec.frozen_dataset + + def _ensure_launch_configured(self, frozen_spec: OpsFrozenDatasetSpec) -> None: + if frozen_spec.run_labels: + return + raise TrainingExperimentError( + "freeze_launch_not_configured", + "Freezing a new dataset is not configured for this ops spec " + "(set OpsFrozenDatasetSpec.run_labels to a pipeline stage such as " + "stage=train-prepare).", + status_code=400, + ) + + def launch_freeze(self, spec_id: str) -> FreezeLaunchResponse: + frozen_spec = self._frozen_spec(spec_id) + self._ensure_launch_configured(frozen_spec) + if self.run_steps is None: + raise TrainingExperimentError( + "freeze_launch_failed", + "Launching freeze steps is not available on this instance.", + status_code=503, + ) + result = self.run_steps("freeze", list(frozen_spec.run_labels), {}) + return FreezeLaunchResponse( + started=bool(result.get("started", False)), + run_id=result.get("run_id"), + ) + + +__all__ = ["FreezeLaunchResponse", "FrozenDatasetsLaunchService"] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_image_records.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_image_records.py new file mode 100644 index 000000000..660c1d6bb --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_image_records.py @@ -0,0 +1,1244 @@ +from __future__ import annotations + +import base64 +import json +from typing import Any, Literal, Mapping, Sequence +from urllib.parse import quote + +from datapipe_app.ops.ops_filters import OpsFilterMode +from datapipe_app.ops.ops_query import OpsQuery +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app.ops.specs import OpsColumn, OpsColumnGroup, OpsFilterRule, OpsMetricTableSpec +from datapipe_app_ml_ops.viz.image_visualization import OverlayMode, iter_bbox_fields_from_record, render_visualization_bytes +from datapipe_ml.metrics.common import METRICS_NULL_LABEL +from datapipe_app_ml_ops.observability.schemas.models import ( + OpsBBoxRow, + OpsImageRecordDetailResponse, + OpsImageRecordListRow, + OpsImageRecordsResponse, +) +from datapipe_app_ml_ops.ops.ops_spec_resolve import resolve_frozen_scope_column +from datapipe_app_ml_ops.ops.ops_specs import ( + OpsImageAnnotationSpec, + OpsImageDataSpec, + OpsImagePredictionViewSpec, + OpsImageRecordViewSpec, +) + +ImageScope = Literal["data", "frozen_dataset", "model_prediction"] + + +class OpsImageRecordsSupport: + def __init__(self, registry: OpsSpecRegistry, query: OpsQuery) -> None: + self.registry = registry + self.query = query + + def image_records( + self, + *, + pipeline_id: str, + spec_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + sort_by: str | None = None, + sort_dir: Literal["asc", "desc"] = "asc", + ) -> OpsImageRecordsResponse: + spec = self.registry.get(spec_id) + if spec.data is None or spec.data.image_view is None: + return self._empty_response(pipeline_id, spec_id, "data", tuple(), limit, offset, include_total=include_total) + view = spec.data.image_view + filter_columns = self._data_record_filter_columns(view) + query_kwargs = self._data_image_query_kwargs( + view, + filter_columns=filter_columns, + search=search, + filter_rules=filter_rules, + filter_mode=filter_mode, + sort_by=sort_by, + ) + resolved_sort_by, resolved_sort_dir = self._resolve_image_record_sort( + filter_columns, + sort_by=sort_by, + sort_dir=sort_dir, + default_source=view.image_primary_key_columns[0] if view.image_primary_key_columns else None, + ) + rows, total = self.query.rows_scoped( + view.image_table, + {}, + limit=self._clamp_limit(limit), + offset=offset, + sort_by=resolved_sort_by, + sort_dir=resolved_sort_dir, + include_total=include_total, + **query_kwargs, + ) + list_rows = [ + self._data_list_row( + pipeline_id=pipeline_id, + spec_id=spec_id, + view=view, + record=row, + ) + for row in rows + ] + return OpsImageRecordsResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="data", + parent_id=None, + primary_key_columns=list(view.image_primary_key_columns), + list_columns=self._data_list_columns(view), + rows=list_rows, + total=total, + limit=self._clamp_limit(limit), + offset=offset, + ) + + def image_record_detail( + self, + *, + pipeline_id: str, + spec_id: str, + record_key: str, + ) -> OpsImageRecordDetailResponse: + spec = self.registry.get(spec_id) + if spec.data is None or spec.data.image_view is None: + raise KeyError(f'Spec "{spec_id}" does not define data.image_view.') + view = spec.data.image_view + pk = self._decode_record_key(record_key) + record = self._load_data_record(view, pk) + return self._build_data_detail(pipeline_id, spec_id, record_key, pk, record, view) + + def image_records_count( + self, + *, + pipeline_id: str, + spec_id: str, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + ) -> int: + spec = self.registry.get(spec_id) + if spec.data is None or spec.data.image_view is None: + return 0 + view = spec.data.image_view + filter_columns = self._data_record_filter_columns(view) + query_kwargs = self._data_image_query_kwargs( + view, + filter_columns=filter_columns, + search=search, + filter_rules=filter_rules, + filter_mode=filter_mode, + ) + return self.query.count_scoped(view.image_table, {}, **query_kwargs) + + def frozen_dataset_records( + self, + *, + pipeline_id: str, + spec_id: str, + dataset_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + sort_by: str | None = None, + sort_dir: Literal["asc", "desc"] = "asc", + ) -> OpsImageRecordsResponse: + spec = self.registry.get(spec_id) + frozen = spec.frozen_dataset + if frozen is None or frozen.record_view is None or frozen.record_view.kind != "image": + return self._empty_response( + pipeline_id, spec_id, "frozen_dataset", tuple(), limit, offset, parent_id=dataset_id, include_total=include_total + ) + view = frozen.record_view + scope_column = resolve_frozen_scope_column(spec, view) + filter_columns = self._frozen_record_filter_columns(view) + resolved_sort_by, resolved_sort_dir = self._resolve_image_record_sort( + filter_columns, + sort_by=sort_by, + sort_dir=sort_dir, + default_source=view.primary_key_columns[0] if view.primary_key_columns else None, + ) + rows, total = self.query.rows_scoped( + view.table, + {scope_column: dataset_id}, + allowed_columns=filter_columns, + search=search, + filter_rules=filter_rules, + filter_mode=filter_mode, + limit=self._clamp_limit(limit), + offset=offset, + sort_by=resolved_sort_by, + sort_dir=resolved_sort_dir, + include_total=include_total, + ) + list_rows = [ + self._frozen_list_row( + pipeline_id=pipeline_id, + spec_id=spec_id, + dataset_id=dataset_id, + view=view, + record=row, + ) + for row in rows + ] + return OpsImageRecordsResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="frozen_dataset", + parent_id=dataset_id, + primary_key_columns=list(view.primary_key_columns), + list_columns=self._frozen_list_columns(view), + rows=list_rows, + total=total, + limit=self._clamp_limit(limit), + offset=offset, + ) + + def frozen_dataset_record_detail( + self, + *, + pipeline_id: str, + spec_id: str, + dataset_id: str, + record_key: str, + ) -> OpsImageRecordDetailResponse: + spec = self.registry.get(spec_id) + frozen = spec.frozen_dataset + if frozen is None or frozen.record_view is None or frozen.record_view.kind != "image": + raise KeyError(f'Spec "{spec_id}" does not define frozen_dataset.record_view.') + view = frozen.record_view + pk = self._decode_record_key(record_key) + scope_column = resolve_frozen_scope_column(spec, view) + record = self.query.row_by_pk(view.table, {**pk, scope_column: dataset_id}) + if record is None: + raise KeyError(f'Record "{record_key}" was not found.') + return self._build_frozen_detail(pipeline_id, spec_id, dataset_id, record_key, pk, record, view) + + def frozen_dataset_records_count( + self, + *, + spec_id: str, + dataset_id: str, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + ) -> int: + spec = self.registry.get(spec_id) + frozen = spec.frozen_dataset + if frozen is None or frozen.record_view is None or frozen.record_view.kind != "image": + return 0 + view = frozen.record_view + scope_column = resolve_frozen_scope_column(spec, view) + filter_columns = self._frozen_record_filter_columns(view) + return self.query.count_scoped( + view.table, + {scope_column: dataset_id}, + allowed_columns=filter_columns, + search=search, + filter_rules=filter_rules, + filter_mode=filter_mode, + ) + + def model_prediction_records( + self, + *, + pipeline_id: str, + spec_id: str, + model_id: str, + limit: int = 10, + offset: int = 0, + include_total: bool = False, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + sort_by: str | None = None, + sort_dir: Literal["asc", "desc"] = "asc", + ) -> OpsImageRecordsResponse: + spec = self.registry.get(spec_id) + model = spec.model + if model is None or model.prediction_view is None: + return self._empty_response( + pipeline_id, spec_id, "model_prediction", tuple(), limit, offset, parent_id=model_id, include_total=include_total + ) + view = model.prediction_view + filter_columns = self._prediction_record_filter_columns(view) + query_kwargs = self._prediction_image_query_kwargs( + view, search=search, filter_rules=filter_rules, filter_mode=filter_mode + ) + resolved_sort_by, resolved_sort_dir = self._resolve_image_record_sort( + filter_columns, + sort_by=sort_by, + sort_dir=sort_dir, + default_source=view.image_primary_key_columns[0] if view.image_primary_key_columns else None, + ) + rows, total = self.query.rows_scoped( + view.table, + {view.model_id_column: model_id}, + limit=self._clamp_limit(limit), + offset=offset, + sort_by=resolved_sort_by, + sort_dir=resolved_sort_dir, + include_total=include_total, + **query_kwargs, + ) + list_rows = [ + self._prediction_list_row( + pipeline_id=pipeline_id, + spec_id=spec_id, + model_id=model_id, + view=view, + record=row, + ) + for row in rows + ] + return OpsImageRecordsResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="model_prediction", + parent_id=model_id, + primary_key_columns=list(view.image_primary_key_columns), + list_columns=self._prediction_list_columns(view), + rows=list_rows, + total=total, + limit=self._clamp_limit(limit), + offset=offset, + ) + + def model_prediction_records_count( + self, + *, + spec_id: str, + model_id: str, + search: str | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + ) -> int: + spec = self.registry.get(spec_id) + model = spec.model + if model is None or model.prediction_view is None: + return 0 + view = model.prediction_view + query_kwargs = self._prediction_image_query_kwargs( + view, search=search, filter_rules=filter_rules, filter_mode=filter_mode + ) + return self.query.count_scoped(view.table, {view.model_id_column: model_id}, **query_kwargs) + + def model_prediction_record_detail( + self, + *, + pipeline_id: str, + spec_id: str, + model_id: str, + record_key: str, + ) -> OpsImageRecordDetailResponse: + spec = self.registry.get(spec_id) + model = spec.model + if model is None or model.prediction_view is None: + raise KeyError(f'Spec "{spec_id}" does not define model.prediction_view.') + view = model.prediction_view + pk = self._decode_record_key(record_key) + prediction = self.query.row_by_pk(view.table, {**pk, view.model_id_column: model_id}) + if prediction is None: + raise KeyError(f'Record "{record_key}" was not found.') + return self._build_prediction_detail(pipeline_id, spec_id, model_id, record_key, pk, prediction, view) + + def image_record_bytes( + self, + *, + pipeline_id: str, + spec_id: str, + scope: ImageScope, + record_key: str, + parent_id: str | None = None, + mode: Literal["preview", "visualization"] = "visualization", + overlay: OverlayMode = "record", + annotations: bool = True, + max_side: int | None = None, + ) -> tuple[bytes, str]: + del pipeline_id + if mode == "preview": + max_side = max_side or 56 + annotations = False + overlay = "plain" + detail = self._detail_for_scope(scope, spec_id=spec_id, record_key=record_key, parent_id=parent_id) + image_url = detail.image_url + if image_url is None: + raise KeyError("Image URL is not available for this record.") + gt_record = None + prediction_record = None + record = None + if scope == "data": + record = detail.record + gt_record = self._gt_record_for_detail(detail, scope) + elif scope == "frozen_dataset": + record = detail.record + gt_record = detail.record + elif scope == "model_prediction": + gt_record = self._joined_annotation_record(detail, "gt") + prediction_record = self._joined_annotation_record(detail, "prediction") + return render_visualization_bytes( + image_url=image_url, + record=record, + gt_record=gt_record, + prediction_record=prediction_record, + overlay=overlay, + scores_column=self._scores_column_for_scope(scope, spec_id), + annotations=annotations, + max_side=max_side, + ) + + def _detail_for_scope( + self, + scope: ImageScope, + *, + spec_id: str, + record_key: str, + parent_id: str | None, + ) -> OpsImageRecordDetailResponse: + if scope == "data": + return self.image_record_detail(pipeline_id="", spec_id=spec_id, record_key=record_key) + if scope == "frozen_dataset": + if parent_id is None: + raise KeyError("parent_id is required for frozen_dataset scope.") + return self.frozen_dataset_record_detail( + pipeline_id="", + spec_id=spec_id, + dataset_id=parent_id, + record_key=record_key, + ) + if parent_id is None: + raise KeyError("parent_id is required for model_prediction scope.") + return self.model_prediction_record_detail( + pipeline_id="", + spec_id=spec_id, + model_id=parent_id, + record_key=record_key, + ) + + def _gt_record_for_detail(self, detail: OpsImageRecordDetailResponse, scope: ImageScope) -> dict[str, Any] | None: + if scope == "model_prediction": + return self._joined_annotation_record(detail, "gt") + return detail.record + + def _joined_annotation_record(self, detail: OpsImageRecordDetailResponse, role: str) -> dict[str, Any] | None: + spec = self.registry.get(detail.spec_id) + if spec.model is None or spec.model.prediction_view is None: + return None + view = spec.model.prediction_view + annotation = view.ground_truth if role == "gt" else view.prediction + if annotation is None: + return None + return self._load_annotation_record( + annotation, + detail.pk, + parent_id=detail.parent_id, + model_id_column=view.model_id_column, + ) + + def _scores_column_for_scope(self, scope: ImageScope, spec_id: str) -> str | None: + spec = self.registry.get(spec_id) + if scope == "model_prediction" and spec.model and spec.model.prediction_view and spec.model.prediction_view.prediction: + return spec.model.prediction_view.prediction.scores_column + if scope == "frozen_dataset" and spec.frozen_dataset and spec.frozen_dataset.record_view and spec.frozen_dataset.record_view.kind == "image": + return spec.frozen_dataset.record_view.scores_column + return None + + def _data_list_row( + self, + *, + pipeline_id: str, + spec_id: str, + view: OpsImageDataSpec, + record: dict[str, Any], + ) -> OpsImageRecordListRow: + pk = {key: record.get(key) for key in view.image_primary_key_columns} + record_key = self._encode_record_key(pk) + gt_record = self._load_ground_truth(view, pk) if view.records_show_ground_truth else None + subset = self._load_subset(view, pk) if view.records_show_subset else None + bbox_count = None + label = None + if view.records_show_ground_truth and view.ground_truth is not None: + bboxes_column = view.ground_truth.bboxes_column + if bboxes_column is not None: + bbox_count = self._bbox_count(gt_record.get(bboxes_column) if gt_record else None) + else: + label = self._label_from_record(gt_record or {}, view.ground_truth) + base = self._record_urls(pipeline_id, spec_id, "data", record_key) + return OpsImageRecordListRow( + record_key=record_key, + pk=pk, + preview_url=base + "/preview", + visualization_url=base + "/visualization", + detail_url=f"/image/{quote(spec_id, safe='')}/records/{quote(record_key, safe='')}", + subset=subset, + bbox_count=bbox_count, + label=label, + gt_label=label, + ) + + def _frozen_list_row( + self, + *, + pipeline_id: str, + spec_id: str, + dataset_id: str, + view: OpsImageRecordViewSpec, + record: dict[str, Any], + ) -> OpsImageRecordListRow: + pk = {key: record.get(key) for key in view.primary_key_columns} + record_key = self._encode_record_key(pk) + label_mode = not self._view_uses_bboxes(view) + bboxes_column = view.bboxes_column + bbox_count = None if bboxes_column is None else self._bbox_count(record.get(bboxes_column)) + label = self._label_from_view_record(record, view) if label_mode else None + base = self._record_urls(pipeline_id, spec_id, "frozen_dataset", record_key, parent_id=dataset_id) + return OpsImageRecordListRow( + record_key=record_key, + pk=pk, + preview_url=base + "/preview", + visualization_url=base + "/visualization", + detail_url=( + f"/frozen-datasets/{quote(spec_id, safe='')}/datasets/{quote(dataset_id, safe='')}" + f"/records/{quote(record_key, safe='')}" + ), + subset=str(record.get("subset_id")) if record.get("subset_id") is not None else None, + bbox_count=bbox_count, + label=label, + gt_label=label, + ) + + def _prediction_list_row( + self, + *, + pipeline_id: str, + spec_id: str, + model_id: str, + view: OpsImagePredictionViewSpec, + record: dict[str, Any], + ) -> OpsImageRecordListRow: + pk = {key: record.get(key) for key in view.image_primary_key_columns} + record_key = self._encode_record_key(pk) + pred_count = None + prediction_label = None + prediction_score = None + if view.prediction is not None: + bboxes_column = view.prediction.bboxes_column + if bboxes_column is None: + prediction_label = self._label_from_record(record, view.prediction) + prediction_score = self._score_from_record(record, view.prediction) + else: + pred_count = self._bbox_count(record.get(bboxes_column)) + gt_record = ( + self._load_annotation_record( + view.ground_truth, + pk, + parent_id=model_id, + model_id_column=view.model_id_column, + ) + if view.ground_truth + else None + ) + gt_count = None + gt_label = None + if view.ground_truth is not None: + bboxes_column = view.ground_truth.bboxes_column + if bboxes_column is not None: + gt_count = self._bbox_count(gt_record.get(bboxes_column) if gt_record else None) + else: + gt_label = self._label_from_record(gt_record or {}, view.ground_truth) + metrics = self._prediction_metrics_values( + view, + model_id=model_id, + pk=pk, + gt_label=gt_label, + prediction_label=prediction_label, + ) + is_error = None + if metrics and "is_error" in metrics: + is_error = bool(metrics["is_error"]) + elif gt_label is not None and prediction_label is not None: + is_error = gt_label != prediction_label + base = self._record_urls(pipeline_id, spec_id, "model_prediction", record_key, parent_id=model_id) + return OpsImageRecordListRow( + record_key=record_key, + pk=pk, + preview_url=base + "/preview", + visualization_url=base + "/visualization?overlay=both", + detail_url=( + f"/metrics/{quote(spec_id, safe='')}/models/{quote(model_id, safe='')}" + f"/predictions/{quote(record_key, safe='')}" + ), + bbox_count=pred_count, + gt_bbox_count=gt_count, + prediction_bbox_count=pred_count, + label=prediction_label, + gt_label=gt_label, + prediction_label=prediction_label, + prediction_score=prediction_score, + is_error=is_error, + metrics=metrics, + ) + + def _build_data_detail( + self, + pipeline_id: str, + spec_id: str, + record_key: str, + pk: dict[str, Any], + record: dict[str, Any], + view: OpsImageDataSpec, + ) -> OpsImageRecordDetailResponse: + gt_record = self._load_ground_truth(view, pk) + subset = self._load_subset(view, pk) + image_url = record.get(view.image_url_column) + merged = {**record, **(gt_record or {})} + bbox_rows = self._bbox_rows_from_record(gt_record or {}, view.ground_truth) + label_mode = view.ground_truth is not None and not self._uses_bboxes(view.ground_truth) + label = ( + self._label_from_record(gt_record or {}, view.ground_truth) + if label_mode and view.ground_truth + else None + ) + base = self._record_urls(pipeline_id, spec_id, "data", record_key) + return OpsImageRecordDetailResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="data", + parent_id=None, + record_key=record_key, + pk=pk, + record=merged, + image_url=image_url, + subset=subset, + preview_url=base + "/preview", + visualization_url=base + "/visualization", + plain_image_url=base + "/visualization?overlay=plain", + bbox_count=None if label_mode else len(bbox_rows), + gt_bbox_count=None if label_mode else len(bbox_rows), + label=label, + gt_label=label, + bbox_rows=bbox_rows, + gt_bbox_rows=bbox_rows, + ) + + def _build_frozen_detail( + self, + pipeline_id: str, + spec_id: str, + dataset_id: str, + record_key: str, + pk: dict[str, Any], + record: dict[str, Any], + view: OpsImageRecordViewSpec, + ) -> OpsImageRecordDetailResponse: + image_url = record.get(view.image_url_column or "image_url") + bbox_rows = self._bbox_rows_from_record(record, None, view=view) + label_mode = not self._view_uses_bboxes(view) + label = self._label_from_view_record(record, view) if label_mode else None + base = self._record_urls(pipeline_id, spec_id, "frozen_dataset", record_key, parent_id=dataset_id) + return OpsImageRecordDetailResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="frozen_dataset", + parent_id=dataset_id, + record_key=record_key, + pk=pk, + record=record, + image_url=image_url, + subset=str(record.get("subset_id")) if record.get("subset_id") is not None else None, + preview_url=base + "/preview", + visualization_url=base + "/visualization", + plain_image_url=base + "/visualization?overlay=plain", + bbox_count=None if label_mode else len(bbox_rows), + gt_bbox_count=None if label_mode else len(bbox_rows), + label=label, + gt_label=label, + bbox_rows=bbox_rows, + gt_bbox_rows=bbox_rows, + ) + + def _build_prediction_detail( + self, + pipeline_id: str, + spec_id: str, + model_id: str, + record_key: str, + pk: dict[str, Any], + prediction: dict[str, Any], + view: OpsImagePredictionViewSpec, + ) -> OpsImageRecordDetailResponse: + image_url = None + if view.image_url_column and view.image_url_column in prediction: + image_url = prediction.get(view.image_url_column) + if not image_url: + image_url = self._resolve_image_url(view, pk) + gt_record = ( + self._load_annotation_record( + view.ground_truth, + pk, + parent_id=model_id, + model_id_column=view.model_id_column, + ) + if view.ground_truth + else None + ) + subset = self._load_subset_for_prediction(view, pk) + pred_rows = self._bbox_rows_from_record(prediction, view.prediction) + gt_rows = self._bbox_rows_from_record(gt_record or {}, view.ground_truth) + label_mode = view.prediction is not None and not self._uses_bboxes(view.prediction) + prediction_label = ( + self._label_from_record(prediction, view.prediction) + if label_mode and view.prediction + else None + ) + prediction_score = ( + self._score_from_record(prediction, view.prediction) + if label_mode and view.prediction + else None + ) + gt_label = ( + self._label_from_record(gt_record or {}, view.ground_truth) + if label_mode and view.ground_truth + else None + ) + metrics = self._prediction_metrics_values( + view, + model_id=model_id, + pk=pk, + gt_label=gt_label, + prediction_label=prediction_label, + ) + is_error = None + if metrics and "is_error" in metrics: + is_error = bool(metrics["is_error"]) + elif gt_label is not None and prediction_label is not None: + is_error = gt_label != prediction_label + base = self._record_urls(pipeline_id, spec_id, "model_prediction", record_key, parent_id=model_id) + return OpsImageRecordDetailResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="model_prediction", + parent_id=model_id, + record_key=record_key, + pk=pk, + record={**prediction, **(gt_record or {}), **(metrics or {})}, + image_url=image_url, + subset=subset, + preview_url=base + "/preview", + visualization_url=base + "/visualization?overlay=prediction", + plain_image_url=base + "/visualization?overlay=plain", + gt_visualization_url=base + "/visualization?overlay=gt", + prediction_visualization_url=base + "/visualization?overlay=prediction", + plain_gt_image_url=base + "/visualization?overlay=plain", + plain_prediction_image_url=base + "/visualization?overlay=plain", + bbox_count=None if label_mode else len(pred_rows), + gt_bbox_count=None if label_mode else len(gt_rows), + prediction_bbox_count=None if label_mode else len(pred_rows), + label=prediction_label, + gt_label=gt_label, + prediction_label=prediction_label, + prediction_score=prediction_score, + is_error=is_error, + bbox_rows=pred_rows, + gt_bbox_rows=gt_rows, + prediction_bbox_rows=pred_rows, + ) + + def _load_data_record(self, view: OpsImageDataSpec, pk: dict[str, Any]) -> dict[str, Any]: + record = self.query.row_by_pk(view.image_table, pk) + if record is None: + raise KeyError(f'Record {pk} was not found in {view.image_table}.') + return record + + def _load_ground_truth(self, view: OpsImageDataSpec, pk: dict[str, Any]) -> dict[str, Any] | None: + if view.ground_truth is None: + return None + return self._load_annotation_record(view.ground_truth, pk) + + def _load_annotation_record( + self, + annotation: OpsImageAnnotationSpec | None, + pk: dict[str, Any], + *, + parent_id: str | None = None, + model_id_column: str | None = None, + ) -> dict[str, Any] | None: + if annotation is None: + return None + if annotation.join_columns: + lookup = {dest: pk.get(src) for src, dest in annotation.join_columns.items()} + else: + lookup = {key: pk.get(key) for key in annotation.primary_key_columns} + if parent_id is not None and model_id_column: + try: + table = self.query._table(annotation.table) # type: ignore[attr-defined] + if model_id_column in table.c: + lookup[model_id_column] = parent_id + except Exception: + pass + if len(lookup) == 1: + rows, _ = self.query.rows_scoped(annotation.table, lookup, limit=1, offset=0) + return rows[0] if rows else None + return self.query.row_by_pk(annotation.table, lookup) + + def _load_subset(self, view: OpsImageDataSpec, pk: dict[str, Any]) -> str | None: + if view.subset_table is None or view.subset_column is None: + return None + if view.subset_join_columns: + lookup = {dest: pk.get(src) for src, dest in view.subset_join_columns.items()} + else: + lookup = dict(pk) + rows, _ = self.query.rows_scoped(view.subset_table, lookup, limit=1, offset=0) + row = rows[0] if rows else None + return str(row.get(view.subset_column)) if row else None + + def _load_subset_for_prediction(self, view: OpsImagePredictionViewSpec, pk: dict[str, Any]) -> str | None: + if view.subset_table is None or view.subset_column is None: + return None + if view.subset_join_columns: + lookup = {dest: pk.get(src) for src, dest in view.subset_join_columns.items()} + else: + lookup = dict(pk) + rows, _ = self.query.rows_scoped(view.subset_table, lookup, limit=1, offset=0) + row = rows[0] if rows else None + return str(row.get(view.subset_column)) if row else None + + def _prediction_metrics_values( + self, + view: OpsImagePredictionViewSpec, + *, + model_id: str, + pk: dict[str, Any], + gt_label: str | None = None, + prediction_label: str | None = None, + ) -> dict[str, Any] | None: + table_spec = view.metrics_on_image + values: dict[str, Any] = {} + if table_spec is not None: + metrics_row = self._load_prediction_metrics_on_image( + view, + model_id=model_id, + pk=pk, + gt_label=gt_label, + ) + if metrics_row is not None: + for column in self._flatten_metric_columns(table_spec.metric_columns): + values[column.source] = metrics_row.get(column.source) + values[column.id] = metrics_row.get(column.source) + if gt_label is not None and prediction_label is not None: + is_error = gt_label != prediction_label + values["calc__is_error"] = is_error + values["is_error"] = is_error + elif "calc__TP" in values and values["calc__TP"] is not None: + is_error = int(values["calc__TP"]) == 0 + values["calc__is_error"] = is_error + values["is_error"] = is_error + return values or None + + def _load_prediction_metrics_on_image( + self, + view: OpsImagePredictionViewSpec, + *, + model_id: str, + pk: dict[str, Any], + gt_label: str | None = None, + ) -> dict[str, Any] | None: + table_spec = view.metrics_on_image + if table_spec is None: + return None + lookup = self._metrics_on_image_lookup( + view, + table_spec, + model_id=model_id, + pk=pk, + gt_label=gt_label, + ) + return self.query.row_by_pk(table_spec.table, lookup) + + def _metrics_on_image_lookup( + self, + view: OpsImagePredictionViewSpec, + table_spec: OpsMetricTableSpec, + *, + model_id: str, + pk: dict[str, Any], + gt_label: str | None = None, + ) -> dict[str, Any]: + subset = self._load_subset_for_prediction(view, pk) + lookup: dict[str, Any] = {} + for column in table_spec.primary_key_columns: + if column == "label": + if view.metrics_on_image_label != METRICS_NULL_LABEL: + lookup[column] = view.metrics_on_image_label + elif gt_label is not None: + lookup[column] = gt_label + else: + lookup[column] = view.metrics_on_image_label + elif column == view.model_id_column: + lookup[column] = model_id + elif column in pk: + lookup[column] = pk[column] + elif column == view.subset_column or column == "subset_id": + if subset is not None: + lookup[column] = subset + else: + value = pk.get(column) + if value is not None: + lookup[column] = value + return lookup + + @staticmethod + def _flatten_metric_columns(columns: Sequence[OpsColumn | OpsColumnGroup]) -> list[OpsColumn]: + flat: list[OpsColumn] = [] + for column in columns: + if isinstance(column, OpsColumnGroup): + flat.extend(column.columns) + else: + flat.append(column) + return flat + + def _resolve_image_url(self, view: OpsImagePredictionViewSpec, pk: dict[str, Any]) -> str | None: + if view.image_url_join_columns: + lookup = {dest: pk.get(src) for src, dest in view.image_url_join_columns.items()} + else: + lookup = dict(pk) + row = self.query.row_by_pk(view.image_url_table, lookup) + if row is None and len(lookup) == 1: + rows, _ = self.query.rows_scoped(view.image_url_table, lookup, limit=1, offset=0) + row = rows[0] if rows else None + return row.get(view.image_url_column) if row else None + + def _record_urls( + self, + pipeline_id: str, + spec_id: str, + scope: ImageScope, + record_key: str, + *, + parent_id: str | None = None, + ) -> str: + encoded_pipeline = quote(pipeline_id, safe="") + encoded_spec = quote(spec_id, safe="") + encoded_key = quote(record_key, safe="") + if scope == "data": + return f"/api/v1alpha3/pipelines/{encoded_pipeline}/ops-specs/{encoded_spec}/image/records/{encoded_key}" + if scope == "frozen_dataset": + encoded_parent = quote(parent_id or "", safe="") + return ( + f"/api/v1alpha3/pipelines/{encoded_pipeline}/ops-specs/{encoded_spec}" + f"/frozen-datasets/{encoded_parent}/records/{encoded_key}" + ) + encoded_parent = quote(parent_id or "", safe="") + return ( + f"/api/v1alpha3/pipelines/{encoded_pipeline}/ops-specs/{encoded_spec}" + f"/models/{encoded_parent}/predictions/{encoded_key}" + ) + + def _bbox_rows_from_record( + self, + record: dict[str, Any], + annotation: OpsImageAnnotationSpec | None, + *, + view: OpsImageRecordViewSpec | None = None, + ) -> list[OpsBBoxRow]: + bboxes_column = self._resolve_bboxes_column(annotation, view) + labels_column = self._resolve_labels_column(annotation, view) + scores_column = (annotation.scores_column if annotation else None) or (view.scores_column if view else None) + + if bboxes_column is None: + label = self._coerce_label(record.get(labels_column) if labels_column else None) + score = record.get(scores_column) if scores_column else None + if label is None and score is None: + return [] + return [ + OpsBBoxRow( + label=label, + confidence=float(score) if score is not None else None, + ) + ] + + payload = { + "bboxes": record.get(bboxes_column), + "labels": record.get(labels_column) if labels_column else None, + scores_column or "prediction__detection_scores": record.get( + scores_column or "prediction__detection_scores" + ), + } + rows: list[OpsBBoxRow] = [] + for label, score, xmin, ymin, xmax, ymax in iter_bbox_fields_from_record(payload, scores_column=scores_column): + rows.append( + OpsBBoxRow( + label=str(label) if label is not None else None, + confidence=float(score) if score is not None else None, + x1=float(xmin) if xmin is not None else None, + y1=float(ymin) if ymin is not None else None, + x2=float(xmax) if xmax is not None else None, + y2=float(ymax) if ymax is not None else None, + ) + ) + return rows + + @staticmethod + def _uses_bboxes(annotation: OpsImageAnnotationSpec | None) -> bool: + return annotation is not None and annotation.bboxes_column is not None + + @staticmethod + def _view_uses_bboxes(view: OpsImageRecordViewSpec) -> bool: + return view.bboxes_column is not None + + @staticmethod + def _resolve_bboxes_column( + annotation: OpsImageAnnotationSpec | None, + view: OpsImageRecordViewSpec | None, + ) -> str | None: + if annotation is not None: + return annotation.bboxes_column + if view is not None: + return view.bboxes_column + return "bboxes" + + @staticmethod + def _resolve_labels_column( + annotation: OpsImageAnnotationSpec | None, + view: OpsImageRecordViewSpec | None, + ) -> str | None: + if annotation is not None: + return annotation.labels_column if annotation.labels_column is not None else "labels" + if view is not None: + return view.labels_column if view.labels_column is not None else "labels" + return "labels" + + @classmethod + def _label_from_record( + cls, + record: dict[str, Any], + annotation: OpsImageAnnotationSpec | None, + ) -> str | None: + if annotation is None: + return None + labels_column = annotation.labels_column or "labels" + return cls._coerce_label(record.get(labels_column)) + + @classmethod + def _label_from_view_record(cls, record: dict[str, Any], view: OpsImageRecordViewSpec) -> str | None: + labels_column = view.labels_column or "labels" + return cls._coerce_label(record.get(labels_column)) + + @staticmethod + def _score_from_record( + record: dict[str, Any], + annotation: OpsImageAnnotationSpec | None, + ) -> float | None: + if annotation is None or annotation.scores_column is None: + return None + score = record.get(annotation.scores_column) + if score is None: + return None + try: + return float(score) + except (TypeError, ValueError): + return None + + @staticmethod + def _coerce_label(value: Any) -> str | None: + if value is None: + return None + if isinstance(value, (list, tuple)): + if not value: + return None + return str(value[0]) + return str(value) + + def _bbox_count(self, value: Any) -> int: + if value is None: + return 0 + if isinstance(value, list): + return len(value) + return 0 + + def _encode_record_key(self, pk: Mapping[str, Any]) -> str: + raw = json.dumps(dict(pk), separators=(",", ":"), sort_keys=True).encode("utf-8") + return base64.urlsafe_b64encode(raw).decode("ascii").rstrip("=") + + def _decode_record_key(self, record_key: str) -> dict[str, Any]: + padding = "=" * (-len(record_key) % 4) + raw = base64.urlsafe_b64decode(record_key + padding) + payload = json.loads(raw.decode("utf-8")) + if not isinstance(payload, dict): + raise KeyError(f'Invalid record key "{record_key}".') + return payload + + def _clamp_limit(self, limit: int) -> int: + return min(max(limit, 1), 100) + + def _resolve_image_record_sort( + self, + columns: Sequence[OpsColumn], + *, + sort_by: str | None, + sort_dir: Literal["asc", "desc"], + default_source: str | None, + ) -> tuple[str | None, Literal["asc", "desc"]]: + if sort_by: + allowed_by_id = {col.id: col for col in columns} + allowed_by_source = {col.source: col for col in columns} + sort_col = allowed_by_id.get(sort_by) or allowed_by_source.get(sort_by) + if sort_col is None or not sort_col.sortable: + raise KeyError(f'Sort column "{sort_by}" is not available for image records.') + return sort_col.id, sort_dir + if default_source: + for col in columns: + if col.source == default_source: + return col.id, "asc" + return None, "asc" + + def _data_image_query_kwargs( + self, + view: OpsImageDataSpec, + *, + filter_columns: Sequence[OpsColumn], + search: str | None, + filter_rules: Sequence[OpsFilterRule] | None, + filter_mode: OpsFilterMode, + sort_by: str | None = None, + ) -> dict[str, Any]: + kwargs: dict[str, Any] = { + "allowed_columns": list(filter_columns), + "search": search, + "filter_rules": filter_rules, + "filter_mode": filter_mode, + } + if ( + view.records_show_subset + and view.subset_table + and view.subset_join_columns + and self._needs_subset_join(view, filter_columns, filter_rules, sort_by) + ): + kwargs["join_table_name"] = view.subset_table + kwargs["join_on"] = dict(view.subset_join_columns) + return kwargs + + @staticmethod + def _needs_subset_join( + view: OpsImageDataSpec, + filter_columns: Sequence[OpsColumn], + filter_rules: Sequence[OpsFilterRule] | None, + sort_by: str | None, + ) -> bool: + subset_column = view.subset_column or "subset_id" + if sort_by: + allowed_by_id = {col.id: col for col in filter_columns} + sort_col = allowed_by_id.get(sort_by) + if sort_col is not None and sort_col.source == subset_column: + return True + for rule in filter_rules or []: + if rule.column_id in {"subset", "subset_id"}: + return True + return False + + @staticmethod + def _data_list_columns(view: OpsImageDataSpec) -> list[str]: + columns = ["image_name"] + if view.records_show_subset: + columns.append("subset") + if view.records_show_ground_truth: + if view.ground_truth is not None and view.ground_truth.bboxes_column is None: + columns.append("label") + else: + columns.append("bboxes") + return columns + + @staticmethod + def _frozen_list_columns(view: OpsImageRecordViewSpec) -> list[str]: + columns = ["image_name", "subset_id"] + columns.append("label" if view.bboxes_column is None else "bboxes") + return columns + + @staticmethod + def _prediction_list_columns(view: OpsImagePredictionViewSpec) -> list[str]: + columns = ["image_name", "subset"] + if view.prediction is not None and view.prediction.bboxes_column is None: + columns.append("label") + else: + columns.append("bboxes") + return columns + + def _data_record_filter_columns(self, view: OpsImageDataSpec) -> list[OpsColumn]: + pk_column = view.image_primary_key_columns[0] if view.image_primary_key_columns else "image_name" + columns = [ + OpsColumn("image_name", "Image", pk_column, filterable=True, sortable=True), + OpsColumn("image_url", "URL", view.image_url_column, filterable=True, sortable=True), + ] + if view.records_show_subset and view.subset_table and view.subset_column: + columns.append(OpsColumn("subset", "Subset", view.subset_column, "chip", filterable=True, sortable=True)) + return columns + + def _frozen_record_filter_columns(self, view: OpsImageRecordViewSpec) -> list[OpsColumn]: + pk_column = view.primary_key_columns[0] if view.primary_key_columns else "image_name" + columns = [OpsColumn("image_name", "Image", pk_column, filterable=True, sortable=True)] + if "subset_id" in view.primary_key_columns or view.primary_key_columns: + columns.append(OpsColumn("subset_id", "Subset", "subset_id", "chip", filterable=True, sortable=True)) + if view.image_url_column: + columns.append(OpsColumn("image_url", "URL", view.image_url_column, filterable=True, sortable=True)) + return columns + + def _prediction_record_filter_columns(self, view: OpsImagePredictionViewSpec) -> list[OpsColumn]: + pk_column = view.image_primary_key_columns[0] if view.image_primary_key_columns else "image_name" + columns = [OpsColumn("image_name", "Image", pk_column, filterable=True, sortable=True)] + if view.subset_table and view.subset_column: + columns.append(OpsColumn("subset", "Subset", view.subset_column, "chip", filterable=True, sortable=True)) + if view.image_url_column: + columns.append(OpsColumn("image_url", "URL", view.image_url_column, filterable=True, sortable=True)) + return columns + + def _prediction_image_query_kwargs( + self, + view: OpsImagePredictionViewSpec, + *, + search: str | None, + filter_rules: Sequence[OpsFilterRule] | None, + filter_mode: OpsFilterMode, + ) -> dict[str, Any]: + kwargs: dict[str, Any] = { + "allowed_columns": self._prediction_record_filter_columns(view), + "search": search, + "filter_rules": filter_rules, + "filter_mode": filter_mode, + } + if view.subset_table and view.subset_join_columns: + kwargs["join_table_name"] = view.subset_table + kwargs["join_on"] = dict(view.subset_join_columns) + return kwargs + + def _empty_response( + self, + pipeline_id: str, + spec_id: str, + scope: ImageScope, + primary_key_columns: tuple[str, ...], + limit: int, + offset: int, + *, + parent_id: str | None = None, + include_total: bool = False, + ) -> OpsImageRecordsResponse: + return OpsImageRecordsResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope=scope, + parent_id=parent_id, + primary_key_columns=list(primary_key_columns), + list_columns=[], + rows=[], + total=0 if include_total else None, + limit=self._clamp_limit(limit), + offset=offset, + ) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_metrics.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_metrics.py new file mode 100644 index 000000000..20862331f --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_metrics.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +from typing import Any, Literal, Optional, Sequence + +import pandas as pd +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app.ops.ops_query import OpsQuery, metric_table_columns +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry, _flatten_columns +from datapipe_app.ops.specs import OpsColumn, OpsMetricTableSpec + + +def _column_source(table_spec: OpsMetricTableSpec, column_id: str) -> str | None: + for column in [ + *table_spec.primary_columns, + *_flatten_columns(table_spec.metric_columns), + *table_spec.filters, + ]: + if column.id == column_id: + return column.source + if column_id in {column.source for column in table_spec.primary_columns}: + return column_id + return None + + +def _metric_display_name(table_spec: OpsMetricTableSpec, metric_source: str) -> str: + for column in _flatten_columns(table_spec.metric_columns): + if column.source == metric_source: + return column.id + return metric_source + + +def _default_filters(table_spec: OpsMetricTableSpec) -> dict[str, str | Sequence[str]]: + filters: dict[str, str | Sequence[str]] = {} + for rule in table_spec.default_filters: + if rule.operator != "equal" or rule.value is None: + continue + source = _column_source(table_spec, rule.column_id) + if source: + filters[source] = rule.value + return filters + + +def _metric_value(row: dict[str, Any], column: str) -> float | None: + value = row.get(column) + if value is None or (hasattr(value, "__float__") and pd.isna(value)): + return None + try: + return float(value) + except (TypeError, ValueError): + return None + + +def _metric_query_columns(table_spec: OpsMetricTableSpec) -> list[OpsColumn]: + columns = metric_table_columns(table_spec) + seen_sources = {column.source for column in columns} + for source in table_spec.entity_links.values(): + if source not in seen_sources: + columns.append(OpsColumn(source, source, source, filterable=True)) + seen_sources.add(source) + if table_spec.best_metric_column and table_spec.best_metric_column not in seen_sources: + display = _metric_display_name(table_spec, table_spec.best_metric_column) + columns.append( + OpsColumn(display, display, table_spec.best_metric_column) + ) + return columns + + +def _iter_metric_tables(registry: OpsSpecRegistry): + for spec in registry.list(): + for table_spec in spec.metrics: + yield spec, table_spec + + +def latest_eval_metric_from_specs( + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, + *, + model_id: str | None = None, +) -> dict[str, Any] | None: + if not registry.list(): + return None + + query = OpsQuery(ds, catalog) + for spec, table_spec in _iter_metric_tables(registry): + metric_source = table_spec.best_metric_column + if not metric_source: + continue + + filters = _default_filters(table_spec) + if model_id is not None and "model" in table_spec.entity_links: + filters[table_spec.entity_links["model"]] = model_id + + sort_by: str | None = None + sort_dir: Literal["asc", "desc"] = "desc" + if table_spec.default_sort: + sort_key, sort_dir = table_spec.default_sort[0] + sort_by = _column_source(table_spec, sort_key) or sort_key + + rows, _total = query.rows( + table_spec.table, + allowed_columns=_metric_query_columns(table_spec), + filters=filters or None, + sort_by=sort_by, + sort_dir=sort_dir, + limit=1, + offset=0, + ) + if not rows: + continue + + row = rows[0] + metric_value = _metric_value(row, metric_source) + if metric_value is None: + continue + + model_col = table_spec.entity_links.get("model") + resolved_model_id = None + if model_col and row.get(model_col) is not None and not pd.isna(row.get(model_col)): + resolved_model_id = str(row.get(model_col)) + + return { + "spec_id": spec.id, + "metric_table_id": table_spec.id, + "model_id": resolved_model_id, + "metric_name": _metric_display_name(table_spec, metric_source), + "metric_column": metric_source, + "metric_value": metric_value, + "source_table": table_spec.table, + } + + return None diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_resolve.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_resolve.py new file mode 100644 index 000000000..e12911a10 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_resolve.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsImageRecordViewSpec, OpsTextRecordViewSpec + + +def resolve_frozen_scope_column( + spec: DatapipeOpsSpec, + view: OpsImageRecordViewSpec | OpsTextRecordViewSpec, +) -> str: + if view.scope_column: + return view.scope_column + frozen_dataset = spec.frozen_dataset + if frozen_dataset is not None: + return frozen_dataset.id_column + raise ValueError("frozen_dataset.record_view.scope_column is not configured and frozen_dataset.id_column is missing") diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_validation.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_validation.py new file mode 100644 index 000000000..27cae0da4 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_spec_validation.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec + + +def validate_ml_spec_extensions( + spec: DatapipeOpsSpec, + catalog: Catalog | None, + db: DataStore | None, + *, + registry: OpsSpecRegistry, +) -> None: + frozen_dataset = spec.frozen_dataset + if frozen_dataset is not None: + schema = registry._schema_for(spec, frozen_dataset.table, catalog, db) + for column in [ + frozen_dataset.id_column, + frozen_dataset.created_at_column, + frozen_dataset.display_name_column, + *frozen_dataset.split_columns.values(), + ]: + if column: + registry._require_column(spec, frozen_dataset.table, column, schema) + registry._validate_page_columns(spec, frozen_dataset.table, "frozen_dataset", frozen_dataset.columns, schema) + + model = spec.model + if model is not None: + schema = registry._schema_for(spec, model.table, catalog, db) + for column in [ + model.id_column, + model.display_name_column, + model.created_at_column, + model.artifact_uri_column, + ]: + if column: + registry._require_column(spec, model.table, column, schema) + if model.is_best_table: + best_schema = registry._schema_for(spec, model.is_best_table, catalog, db) + if model.is_best_column: + registry._require_column( + spec, + model.is_best_table, + model.is_best_column, + best_schema, + ) + + training = spec.training + if training is not None: + schema = registry._schema_for(spec, training.status_table, catalog, db) + for column in [*training.artifact_columns.values()]: + if column: + registry._require_column(spec, training.status_table, column, schema) + registry._validate_page_columns(spec, training.status_table, "training", training.columns, schema) + if any(column.source == "duration_seconds" for column in training.columns): + started_col = next( + (column.source for column in training.columns if column.source.endswith("started_at")), + None, + ) + if started_col: + finished_col = started_col.replace("started_at", "finished_at") + registry._require_column(spec, training.status_table, finished_col, schema) + + +def collect_ml_table_ids(spec: DatapipeOpsSpec) -> set[str]: + tables: set[str] = set() + data = spec.data + image_view = data.image_view if data is not None else None + if image_view is not None: + tables.add(image_view.image_table) + if image_view.subset_table: + tables.add(image_view.subset_table) + if image_view.ground_truth is not None: + tables.add(image_view.ground_truth.table) + frozen_dataset = spec.frozen_dataset + if frozen_dataset: + tables.add(frozen_dataset.table) + model = spec.model + if model: + tables.add(model.table) + if model.is_best_table: + tables.add(model.is_best_table) + training = spec.training + if training: + tables.add(training.status_table) + return tables diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs.py new file mode 100644 index 000000000..29c26f2bc --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs.py @@ -0,0 +1,245 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Literal, Sequence + +from datapipe.types import Labels +from datapipe_app.ops.specs import ( + OpsSpecBase, + OpsColumn, + OpsDataSpec as OpsDataSpecBase, + OpsMetricTableSpec, + SnapshotLabelMode, +) +from datapipe_ml.metrics.common import METRICS_NULL_LABEL + +ImageOverlayRole = Literal["gt", "prediction", "record"] +RecordViewKind = Literal["image", "text"] + + +@dataclass(frozen=True) +class OpsImageAnnotationSpec: + table: str + primary_key_columns: Sequence[str] + bboxes_column: str | None = "bboxes" + labels_column: str | None = "labels" + scores_column: str | None = None + annotation_column: str | None = None + join_columns: dict[str, str] = field(default_factory=dict) + role: ImageOverlayRole = "record" + + +@dataclass(frozen=True) +class OpsImageDataSpec: + kind: Literal["image"] = "image" + image_table: str = "" + image_primary_key_columns: Sequence[str] = field(default_factory=tuple) + image_url_column: str = "image_url" + subset_table: str | None = None + subset_join_columns: dict[str, str] = field(default_factory=dict) + subset_column: str | None = "subset_id" + ground_truth: OpsImageAnnotationSpec | None = None + records_show_subset: bool = False + records_show_ground_truth: bool = False + visualizer: str | None = None + preview_size: int = 84 + modal_max_side: int = 1100 + detail_max_side: int = 1600 + + +@dataclass(frozen=True) +class OpsImageRecordViewSpec: + kind: Literal["image"] = "image" + table: str = "" + scope_column: str | None = None + primary_key_columns: Sequence[str] = field(default_factory=tuple) + image_url_column: str | None = "image_url" + image_url_table: str | None = None + image_url_join_columns: dict[str, str] = field(default_factory=dict) + bboxes_column: str | None = "bboxes" + labels_column: str | None = "labels" + scores_column: str | None = None + width_column: str | None = None + height_column: str | None = None + visualizer: str | None = None + preview_size: int = 84 + modal_max_side: int = 1100 + detail_max_side: int = 1600 + + +@dataclass(frozen=True) +class OpsImagePredictionViewSpec: + kind: Literal["image"] = "image" + table: str = "" + model_id_column: str = "" + image_primary_key_columns: Sequence[str] = field(default_factory=tuple) + image_url_table: str = "" + image_url_column: str = "image_url" + image_url_join_columns: dict[str, str] = field(default_factory=dict) + prediction: OpsImageAnnotationSpec | None = None + ground_truth: OpsImageAnnotationSpec | None = None + subset_table: str | None = None + subset_join_columns: dict[str, str] = field(default_factory=dict) + subset_column: str | None = "subset_id" + metrics_on_image: OpsMetricTableSpec | None = None + metrics_on_image_label: str = METRICS_NULL_LABEL + visualizer: str | None = None + preview_size: int = 84 + modal_max_side: int = 1100 + detail_max_side: int = 1600 + + +@dataclass(frozen=True) +class OpsTextRecordViewSpec: + kind: Literal["text"] = "text" + table: str = "" + scope_column: str | None = None + primary_key_columns: Sequence[str] = field(default_factory=tuple) + + +@dataclass(frozen=True) +class OpsFrozenDatasetSpec: + """Describes the frozen-dataset / snapshot table. + + ``run_labels`` selects pipeline steps for ``Freeze new dataset`` (typically + ``("stage", "train-prepare")``). Leave empty (the default) to disable the + action in the UI and API. + """ + + table: str + id_column: str + created_at_column: str + display_name_column: str | None = None + label_mode: SnapshotLabelMode = "timestamp" + split_columns: dict[str, str] = field(default_factory=dict) + models_count_relation_id: str | None = "model_trained_on_frozen_dataset" + record_view: OpsImageRecordViewSpec | OpsTextRecordViewSpec | None = None + columns: Sequence[OpsColumn] = field(default_factory=list) + default_sort: Sequence[tuple[str, Literal["asc", "desc"]]] = field(default_factory=list) + run_labels: Labels = field(default_factory=list) + + +@dataclass(frozen=True) +class OpsModelSpec: + table: str + id_column: str + display_name_column: str | None = None + created_at_column: str | None = None + artifact_uri_column: str | None = None + is_best_table: str | None = None + is_best_column: str | None = None + prediction_view: OpsImagePredictionViewSpec | None = None + + +@dataclass(frozen=True) +class OpsTrainConfigRegistrySpec: + """Describes the train config registry tables (spec §13). + + * ``table`` — API-owned custom experiments (writes go here). + * ``default_table`` — optional pipeline-owned built-in presets (read-only). + + When ``default_table`` is set, list/get merge rows from both tables and force + ``source="builtin"`` / ``source="custom"`` based on which table the row came + from (the tables themselves do not store ``source``). + """ + + table: str + id_column: str + params_column: str + config_type: str + default_table: str | None = None + source_column: str = "train_config__source" + display_name_column: str = "train_config__display_name" + description_column: str = "train_config__description" + config_type_column: str = "train_config__config_type" + hash_column: str = "train_config__config_hash" + active_column: str = "train_config__is_active" + revision_column: str = "train_config__revision" + created_at_column: str = "train_config__created_at" + updated_at_column: str = "train_config__updated_at" + + +@dataclass(frozen=True) +class OpsTrainingRequestSpec: + """Describes the training request table (spec §13). + + ``run_labels`` selects the pipeline steps to launch for a request, and + launching applies a primary-key filter ``{id_column: [request_id]}`` so only + the requested row is materialized (spec §18). + + Leave ``run_labels`` empty (the default) when immediate launch from the UI + is not configured. Typical setup uses a dedicated stage such as + ``("stage", "train-without-freeze")`` so freeze/split steps are not run. + + ``max_within_time`` mirrors the training step freshness window (e.g. + ``"1w"``): the Ops UI hides frozen datasets older than this relative to the + latest snapshot unless the user opts into bypass (``force=True``). + """ + + table: str + id_column: str + train_config_id_column: str + frozen_dataset_id_column: str + run_labels: Labels = field(default_factory=list) + # Freshness window for UI dataset filtering and non-forced requests (e.g. "1w"). + max_within_time: str | None = None + kind_column: str = "training_request__kind" + enabled_column: str = "training_request__enabled" + force_column: str = "training_request__force" + max_within_time_column: str = "training_request__max_within_time" + config_source_column: str = "training_request__config_source" + config_name_snapshot_column: str = "training_request__config_name_snapshot" + config_params_snapshot_column: str = "training_request__config_params_snapshot" + config_hash_column: str = "training_request__config_hash" + requested_at_column: str = "training_request__requested_at" + requested_by_column: str = "training_request__requested_by" + client_request_id_column: str = "training_request__client_request_id" + # Optional join to a run/status table used to compute ``runs_count``. + status_table: str | None = None + status_request_id_column: str | None = None + + +@dataclass(frozen=True) +class OpsTrainingSpec: + status_table: str + artifact_columns: dict[str, str] = field(default_factory=dict) + columns: Sequence[OpsColumn] = field(default_factory=list) + default_sort: Sequence[tuple[str, Literal["asc", "desc"]]] = field(default_factory=list) + experiments: OpsTrainConfigRegistrySpec | None = None + requests: OpsTrainingRequestSpec | None = None + + +@dataclass(frozen=True) +class OpsClassMetricTableSpec(OpsMetricTableSpec): + pass + + +@dataclass(frozen=True) +class OpsDataSpec(OpsDataSpecBase): + image_view: OpsImageDataSpec | None = None + + +@dataclass(frozen=True) +class DatapipeOpsSpec(OpsSpecBase): + data: OpsDataSpec | None = None + frozen_dataset: OpsFrozenDatasetSpec | None = None + model: OpsModelSpec | None = None + training: OpsTrainingSpec | None = None + + +__all__ = [ + "METRICS_NULL_LABEL", + "DatapipeOpsSpec", + "OpsClassMetricTableSpec", + "OpsDataSpec", + "OpsFrozenDatasetSpec", + "OpsImageAnnotationSpec", + "OpsImageDataSpec", + "OpsImagePredictionViewSpec", + "OpsImageRecordViewSpec", + "OpsModelSpec", + "OpsTextRecordViewSpec", + "OpsTrainConfigRegistrySpec", + "OpsTrainingRequestSpec", + "OpsTrainingSpec", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs_service.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs_service.py new file mode 100644 index 000000000..c84d5c510 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/ops_specs_service.py @@ -0,0 +1,409 @@ +from __future__ import annotations + +from typing import Any, Literal, Sequence + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore + +from datapipe_app_ml_ops.observability.schemas.models import OpsImageRecordsCountResponse +from datapipe_app.ops.ops_filters import OpsFilterMode, OpsFilterRule +from datapipe_app_ml_ops.ops.ops_image_records import OpsImageRecordsSupport +from datapipe_app.ops.ops_query import OpsQuery, format_snapshot_label, metric_table_columns +from datapipe_app.ops.ops_spec_resolve import ( + column_by_kind, + column_source_by_link, + entity_links_from_columns, + query_columns, +) +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec +from datapipe_app.ops.specs import OpsColumn, OpsRelationSpec, OpsMetricTableSpec, ops_spec_to_dict + + +class OpsSpecsService: + def __init__(self, registry: OpsSpecRegistry, *, ds: DataStore | None, catalog: Catalog | None): + self.registry = registry + self.query = OpsQuery(ds, catalog) + self._image_records = OpsImageRecordsSupport(registry, self.query) + + def list_specs(self, pipeline_id: str) -> dict[str, Any]: + return {"pipeline_id": pipeline_id, "specs": [self._spec_summary(spec) for spec in self.registry.list()]} + + def get_spec(self, spec_id: str, *, debug: bool = False) -> dict[str, Any]: + spec = self.registry.get(spec_id) + payload = self._spec_summary(spec) + if debug: + payload["debug_spec"] = ops_spec_to_dict(spec) + else: + payload.update( + { + "metrics": [self._table_schema(t) for t in spec.metrics], + "class_metrics": [self._table_schema(t) for t in spec.class_metrics], + "data": ops_spec_to_dict(spec.data) if spec.data else None, + "frozen_dataset": ops_spec_to_dict(spec.frozen_dataset) if spec.frozen_dataset else None, + "model": ops_spec_to_dict(spec.model) if spec.model else None, + "training": ops_spec_to_dict(spec.training) if spec.training else None, + "relations": ops_spec_to_dict(spec.relations), + } + ) + return payload + + def frozen_overview(self) -> dict[str, Any]: + specs = [spec for spec in self.registry.list() if spec.frozen_dataset is not None] + cards = [] + total_snapshots = 0 + newest = None + total_models = 0 + recent_activity = [] + for spec in specs: + frozen = spec.frozen_dataset + assert frozen is not None + count = self._count_or_zero(frozen.table) + total_snapshots += count + latest_at = self._latest_or_none(frozen.table, frozen.created_at_column) + newest = max([v for v in [newest, latest_at] if v is not None], default=None) + rows_payload = self.frozen_rows(spec.id, sort_by=frozen.default_sort[0][0] if frozen.default_sort else None, limit=3) + recent_rows = rows_payload["rows"] + models_trained = sum(int(row.get("models_count") or 0) for row in recent_rows) + total_models += models_trained + id_source = frozen.id_column + created_source = frozen.created_at_column + cards.append(self._overview_card(spec) | {"status": "empty" if count == 0 else "healthy", "snapshots_count": count, "latest_snapshot": recent_rows[0] if recent_rows else None, "split": recent_rows[0].get("split") if recent_rows else None, "models_trained": models_trained, "recent_snapshots": recent_rows}) + for row in recent_rows[:2]: + label = format_snapshot_label(row.get(created_source) or row.get(id_source), mode=frozen.label_mode) + recent_activity.append({"spec_id": spec.id, "title": spec.title, "message": f"Snapshot {label or row.get(id_source)} frozen", "status": "success", "at": row.get(created_source)}) + return {"summary": {"total_snapshots": total_snapshots, "active_specs": len(specs), "newest_snapshot_at": str(newest) if newest is not None else None, "models_trained_from_snapshots": total_models}, "filters": {}, "specs": cards, "recent_activity": recent_activity[:8], "lifecycle": ["Data", "Frozen Dataset", "Training", "Metrics"]} + + def training_overview(self) -> dict[str, Any]: + specs = [spec for spec in self.registry.list() if spec.training is not None] + cards = [] + running_now = queued = completed = failed = 0 + recent_activity = [] + for spec in specs: + training = spec.training + assert training is not None + rows_payload = self.training_rows(spec.id, limit=200) + rows = rows_payload["rows"] + status_column = column_by_kind(training.columns, "status") + status_source = status_column.source if status_column else None + statuses = [str(row.get(status_source) or "").lower() for row in rows] if status_source else [] + spec_running = sum(1 for status in statuses if "run" in status) + spec_queued = sum(1 for status in statuses if "queue" in status or "pending" in status) + spec_completed = sum(1 for status in statuses if "complete" in status or "success" in status or "done" in status) + spec_failed = sum(1 for status in statuses if "fail" in status or "error" in status) + running_now += spec_running; queued += spec_queued; completed += spec_completed; failed += spec_failed + model_source = column_source_by_link(training.columns, "model") + frozen_source = column_source_by_link(training.columns, "frozen_dataset") + cards.append(self._overview_card(spec) | {"status": "attention" if spec_failed else ("running" if spec_running else "healthy"), "running_count": spec_running, "completed_count": spec_completed, "failed_count": spec_failed, "latest_model": rows[0].get(model_source) if rows and model_source else None, "last_frozen_dataset": rows[0].get(frozen_source) if rows and frozen_source else None, "recent_runs": rows[:3]}) + run_source = column_source_by_link(training.columns, "training_run") + started_column = next((column for column in training.columns if column.kind == "datetime"), None) + for row in rows[:2]: + recent_activity.append({ + "spec_id": spec.id, + "title": spec.title, + "message": f"Training run {row.get(run_source) if run_source else row.get(model_source or '')}", + "status": row.get(status_source) if status_source else None, + "at": row.get(started_column.source) if started_column else None, + }) + return {"summary": {"running_now": running_now, "queued": queued, "completed_today": completed, "needs_attention": failed}, "filters": {}, "specs": cards, "run_board": {"running": [], "recently_completed": [], "needs_attention": []}, "recent_activity": recent_activity[:8]} + + def metrics_overview(self) -> dict[str, Any]: + specs = [spec for spec in self.registry.list() if spec.metrics] + cards = [] + for spec in specs: + metric_sources = [table.metric_source for table in spec.metrics] + cards.append(self._overview_card(spec) | {"metric_tables_count": len(spec.metrics), "metric_sources": metric_sources, "dimensions_supported": sorted({key for table in spec.metrics for key in table.entity_links})}) + return {"summary": {"metric_tables": sum(len(spec.metrics) for spec in specs), "metric_sources": len({table.metric_source for spec in specs for table in spec.metrics}), "models_covered": self._entity_count("model"), "frozen_datasets_linked": self._entity_count("frozen_dataset")}, "filters": {}, "specs": cards, "architecture": ["Frozen Dataset", "Model", "Metric Table", "Dashboard Views"], "available_views": ["Model Metrics", "Tag Metrics", "Class Metrics", "Comparison Views", "Snapshot Views"]} + + def class_metrics_overview(self) -> dict[str, Any]: + specs = [spec for spec in self.registry.list() if spec.class_metrics] + cards = [] + total_classes = 0 + for spec in specs: + class_keys: set[Any] = set() + for table in spec.class_metrics: + class_column = table.entity_links.get("class") or table.entity_links.get("tag") + if class_column: + class_keys.update(self.query.value_counts(table.table, class_column)) + total_classes += len(class_keys) + cards.append(self._overview_card(spec) | {"class_metric_tables_count": len(spec.class_metrics), "classes_tracked": len(class_keys), "coverage": None, "supported_filters": sorted({key for table in spec.class_metrics for key in table.entity_links})}) + return {"summary": {"class_metric_tables": sum(len(spec.class_metrics) for spec in specs), "total_tracked_classes": total_classes, "specifications_covered": len(specs), "filters_available": len({key for spec in specs for table in spec.class_metrics for key in table.entity_links})}, "filters": {}, "specs": cards, "coverage_map": [], "explore_tiles": ["Browse by class", "Browse by tag", "Compare subsets", "Compare models"]} + + def frozen_rows(self, spec_id: str, **params: Any) -> dict[str, Any]: + spec = self.registry.get(spec_id) + frozen = spec.frozen_dataset + if frozen is None: + return {"rows": [], "total": 0} + columns = list(frozen.columns) + if params.get("sort_by") is None and frozen.default_sort: + params["sort_by"], params["sort_dir"] = frozen.default_sort[0] + allowed_columns = self._frozen_query_columns(frozen) + rows, total = self.query.rows(frozen.table, allowed_columns=allowed_columns, **params) + relation_counts = self._frozen_model_counts(spec) + needs_split = any(column.source == "split" for column in columns) + needs_models = any(column.source == "models_count" for column in columns) + for row in rows: + dataset_id = row.get(frozen.id_column) + if needs_split: + split_counts = {split: row.get(column) for split, column in frozen.split_columns.items()} + row["split"] = self._split_label(split_counts) + if needs_models: + row["models_count"] = relation_counts.get(dataset_id, 0) + entity_links = entity_links_from_columns(columns) + return { + "rows": rows, + "total": total, + "columns": ops_spec_to_dict(columns), + "filter_columns": self._filter_columns_payload(columns), + "entity_links": entity_links, + } + + def frozen_filter_columns(self, spec_id: str) -> list[OpsColumn]: + spec = self.registry.get(spec_id) + frozen = spec.frozen_dataset + if frozen is None: + return [] + return list(frozen.columns) + + def training_rows(self, spec_id: str, **params: Any) -> dict[str, Any]: + spec = self.registry.get(spec_id) + training = spec.training + if training is None: + return {"rows": [], "total": 0} + columns = list(training.columns) + if params.get("sort_by") is None and training.default_sort: + params["sort_by"], params["sort_dir"] = training.default_sort[0] + needs_duration = any(column.source == "duration_seconds" for column in columns) + started_col = next((column.source for column in columns if column.source.endswith("started_at")), None) + finished_col = started_col.replace("started_at", "finished_at") if started_col else None + allowed_columns = query_columns(columns) + if needs_duration and finished_col and finished_col not in {column.source for column in allowed_columns}: + allowed_columns = [*allowed_columns, OpsColumn(finished_col, finished_col, finished_col)] + rows, total = self.query.rows(training.status_table, allowed_columns=allowed_columns, **params) + for row in rows: + if needs_duration and started_col and finished_col: + row["duration_seconds"] = self._duration_seconds(row.get(started_col), row.get(finished_col)) + row["artifact_uris"] = {key: row.get(column) for key, column in training.artifact_columns.items()} + entity_links = entity_links_from_columns(columns) + return { + "rows": rows, + "total": total, + "columns": ops_spec_to_dict(columns), + "filter_columns": self._filter_columns_payload(columns), + "entity_links": entity_links, + } + + def metric_table_rows( + self, + spec_id: str, + table_id: str, + *, + class_metrics: bool = False, + filters: dict[str, str | Sequence[str]] | None = None, + filter_rules: Sequence[OpsFilterRule] | None = None, + filter_mode: OpsFilterMode = "or", + **params: Any, + ) -> dict[str, Any]: + spec = self.registry.get(spec_id) + table_specs = spec.class_metrics if class_metrics else spec.metrics + table_spec = next((table for table in table_specs if table.id == table_id), None) + if table_spec is None: + raise KeyError(f'Metric table "{table_id}" is not configured for spec "{spec_id}".') + if params.get("sort_by") is None and table_spec.default_sort: + params["sort_by"], params["sort_dir"] = table_spec.default_sort[0] + rows, total = self.query.rows( + table_spec.table, + allowed_columns=metric_table_columns(table_spec), + filters=filters, + filter_rules=filter_rules, + filter_mode=filter_mode, + **params, + ) + for row in rows: + for entity, column in table_spec.entity_links.items(): + row[f"{entity}_id"] = row.get(column) + return {"rows": rows, "total": total, "table": self._table_schema(table_spec)} + + def image_records(self, *, pipeline_id: str, spec_id: str, limit: int = 10, offset: int = 0, include_total: bool = False, **params: Any): + return self._image_records.image_records( + pipeline_id=pipeline_id, spec_id=spec_id, limit=limit, offset=offset, include_total=include_total, **params + ) + + def image_records_count(self, *, pipeline_id: str, spec_id: str, **params: Any) -> OpsImageRecordsCountResponse: + total = self._image_records.image_records_count(pipeline_id=pipeline_id, spec_id=spec_id, **params) + return OpsImageRecordsCountResponse( + pipeline_id=pipeline_id, spec_id=spec_id, scope="data", parent_id=None, total=total + ) + + def image_record_detail(self, *, pipeline_id: str, spec_id: str, record_key: str): + return self._image_records.image_record_detail(pipeline_id=pipeline_id, spec_id=spec_id, record_key=record_key) + + def frozen_dataset_records( + self, *, pipeline_id: str, spec_id: str, dataset_id: str, limit: int = 10, offset: int = 0, include_total: bool = False, **params: Any + ): + return self._image_records.frozen_dataset_records( + pipeline_id=pipeline_id, + spec_id=spec_id, + dataset_id=dataset_id, + limit=limit, + offset=offset, + include_total=include_total, + **params, + ) + + def frozen_dataset_records_count(self, *, pipeline_id: str, spec_id: str, dataset_id: str, **params: Any) -> OpsImageRecordsCountResponse: + total = self._image_records.frozen_dataset_records_count(spec_id=spec_id, dataset_id=dataset_id, **params) + return OpsImageRecordsCountResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="frozen_dataset", + parent_id=dataset_id, + total=total, + ) + + def frozen_dataset_record_detail(self, *, pipeline_id: str, spec_id: str, dataset_id: str, record_key: str): + return self._image_records.frozen_dataset_record_detail( + pipeline_id=pipeline_id, spec_id=spec_id, dataset_id=dataset_id, record_key=record_key + ) + + def model_prediction_records( + self, *, pipeline_id: str, spec_id: str, model_id: str, limit: int = 10, offset: int = 0, include_total: bool = False, **params: Any + ): + return self._image_records.model_prediction_records( + pipeline_id=pipeline_id, + spec_id=spec_id, + model_id=model_id, + limit=limit, + offset=offset, + include_total=include_total, + **params, + ) + + def model_prediction_records_count(self, *, pipeline_id: str, spec_id: str, model_id: str, **params: Any) -> OpsImageRecordsCountResponse: + total = self._image_records.model_prediction_records_count(spec_id=spec_id, model_id=model_id, **params) + return OpsImageRecordsCountResponse( + pipeline_id=pipeline_id, + spec_id=spec_id, + scope="model_prediction", + parent_id=model_id, + total=total, + ) + + def model_prediction_record_detail(self, *, pipeline_id: str, spec_id: str, model_id: str, record_key: str): + return self._image_records.model_prediction_record_detail( + pipeline_id=pipeline_id, spec_id=spec_id, model_id=model_id, record_key=record_key + ) + + def image_record_bytes(self, **kwargs): + return self._image_records.image_record_bytes(**kwargs) + + def _spec_summary(self, spec: DatapipeOpsSpec) -> dict[str, Any]: + image_view = spec.data.image_view if spec.data is not None else None + model = spec.model + prediction_view = model.prediction_view if model is not None else None + return { + "id": spec.id, + "title": spec.title, + "description": spec.description, + "icon": spec.icon, + "color": spec.color, + "has_frozen_datasets": spec.frozen_dataset is not None, + "has_training": spec.training is not None, + "has_image": image_view is not None, + "has_model_predictions": prediction_view is not None, + "metric_tables_count": len(spec.metrics), + "class_metric_tables_count": len(spec.class_metrics), + "tags": list(spec.tags), + } + + def _frozen_query_columns(self, frozen) -> list[OpsColumn]: + columns = query_columns(frozen.columns) + existing = {column.source for column in columns} + for source in frozen.split_columns.values(): + if source and source not in existing: + columns.append(OpsColumn(source, source, source)) + existing.add(source) + return columns + + def _split_label(self, split_counts: dict[str, Any]) -> str: + if not split_counts: + return "-" + preferred = ["train", "val", "test"] + keys = [key for key in preferred if key in split_counts] + [key for key in split_counts if key not in preferred] + return " / ".join(str(split_counts.get(key) or 0) for key in keys) + + def _duration_seconds(self, started: Any, finished: Any) -> int | None: + if started is None or finished is None: + return None + try: + from datetime import datetime + + if isinstance(started, str): + started = datetime.fromisoformat(started.replace("Z", "+00:00")) + if isinstance(finished, str): + finished = datetime.fromisoformat(finished.replace("Z", "+00:00")) + return max(int((finished - started).total_seconds()), 0) + except (TypeError, ValueError): + return None + + def _filter_columns_payload(self, columns: Sequence[OpsColumn]) -> list[Any]: + by_source: dict[str, OpsColumn] = {} + for col in columns: + if not col.filterable or not col.source: + continue + if col.source not in by_source: + by_source[col.source] = col + return ops_spec_to_dict(list(by_source.values())) + + def _table_schema(self, table: OpsMetricTableSpec) -> dict[str, Any]: + return { + "id": table.id, + "title": table.title, + "table": table.table, + "metric_source": table.metric_source, + "primary_columns": ops_spec_to_dict(table.primary_columns), + "metric_columns": ops_spec_to_dict(table.metric_columns), + "filters": ops_spec_to_dict(table.filters), + "default_filters": ops_spec_to_dict(table.default_filters), + "default_sort": list(table.default_sort), + "entity_links": dict(table.entity_links), + } + + def _overview_card(self, spec: DatapipeOpsSpec) -> dict[str, Any]: + return {"spec_id": spec.id, "id": spec.id, "title": spec.title, "description": spec.description, "icon": spec.icon, "color": spec.color, "status": "healthy"} + + def _count_or_zero(self, table: str) -> int: + try: + return self.query.count_rows(table) + except Exception: + return 0 + + def _latest_or_none(self, table: str, column: str) -> Any: + try: + return self.query.latest_value(table, column) + except Exception: + return None + + def _entity_count(self, entity: str) -> int: + values: set[Any] = set() + for spec in self.registry.list(): + model = spec.model + if entity == "model" and model is not None: + values.update(self.query.value_counts(model.table, model.id_column)) + frozen_dataset = spec.frozen_dataset + if entity == "frozen_dataset" and frozen_dataset is not None: + values.update(self.query.value_counts(frozen_dataset.table, frozen_dataset.id_column)) + return len(values) + + def _frozen_model_counts(self, spec: DatapipeOpsSpec) -> dict[Any, int]: + frozen = spec.frozen_dataset + if frozen is None or not frozen.models_count_relation_id: + return {} + relation = self._relation_by_id(spec, frozen.models_count_relation_id) + if relation is None: + return {} + key_column = relation.to_column if relation.to_entity == "frozen_dataset" else relation.from_column + return self.query.value_counts(relation.table, key_column) + + def _relation_by_id(self, spec: DatapipeOpsSpec, relation_id: str) -> OpsRelationSpec | None: + return next((relation for relation in spec.relations if relation.id == relation_id), None) diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/spec_registry.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/spec_registry.py new file mode 100644 index 000000000..11e209ce7 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/spec_registry.py @@ -0,0 +1,53 @@ +"""Re-export OpsSpecRegistry from datapipe-app and register ML validators.""" + +from __future__ import annotations + +from typing import Sequence, cast + +from datapipe_app.ops.spec_registry import ( + OpsSpecRegistry as _OpsSpecRegistry, + TableSchema, + _flatten_columns, + register_spec_validator, + register_table_id_extension, +) +from datapipe_app_ml_ops.ops.ops_spec_validation import collect_ml_table_ids, validate_ml_spec_extensions +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec + + +def _ml_spec_validator(spec, catalog, db, registry: _OpsSpecRegistry) -> None: + if not isinstance(spec, DatapipeOpsSpec): + return + if ( + spec.frozen_dataset is not None + or spec.model is not None + or spec.training is not None + or spec.class_metrics + ): + validate_ml_spec_extensions(spec, catalog, db, registry=registry) + + +def _ml_table_ids(spec) -> set[str]: + if isinstance(spec, DatapipeOpsSpec): + return collect_ml_table_ids(spec) + return set() + + +register_spec_validator(_ml_spec_validator) +register_table_id_extension(_ml_table_ids) + + +class OpsSpecRegistry(_OpsSpecRegistry): + """ML ops registry: stores ``DatapipeOpsSpec`` instances with typed accessors.""" + + def add_many(self, specs: Sequence[DatapipeOpsSpec]) -> None: # type: ignore[override] + super().add_many(specs) + + def get(self, spec_id: str) -> DatapipeOpsSpec: + return cast(DatapipeOpsSpec, super().get(spec_id)) + + def list(self) -> list[DatapipeOpsSpec]: # type: ignore[override] + return cast(list[DatapipeOpsSpec], super().list()) + + +__all__ = ["OpsSpecRegistry", "TableSchema", "_flatten_columns", "DatapipeOpsSpec"] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_models.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_models.py new file mode 100644 index 000000000..e13946dc8 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_models.py @@ -0,0 +1,258 @@ +from __future__ import annotations + +from typing import Any, Optional + +from pydantic import BaseModel, Field, computed_field + + +class TrainingExperimentError(Exception): + """Domain error for training experiments (spec §19). + + Rendered by the routes as:: + + {"error": {"code": "...", "message": "...", "details": {}}} + """ + + def __init__( + self, + code: str, + message: str, + *, + status_code: int = 400, + details: Optional[dict[str, Any]] = None, + ) -> None: + super().__init__(message) + self.code = code + self.message = message + self.status_code = status_code + self.details: dict[str, Any] = details or {} + + def to_payload(self) -> dict[str, Any]: + return {"error": {"code": self.code, "message": self.message, "details": self.details}} + + +class TrainingExperimentCapabilities(BaseModel): + """Backend-computed action flags for one experiment (spec §16). + + The backend is the sole source of these flags; the UI must not re-derive + them from other fields. + """ + + can_edit: bool + can_delete: bool + can_duplicate: bool + can_launch: bool + can_archive: bool + lock_reason: Optional[str] = None + + +class TrainingExperimentRow(BaseModel): + """A row in the training experiment registry (builtin or custom).""" + + id: str + source: str + display_name: Optional[str] = None + description: Optional[str] = None + config_type: str + params: dict[str, Any] = Field(default_factory=dict) + config_hash: Optional[str] = None + active: bool = True + revision: int = 1 + created_at: Optional[str] = None + updated_at: Optional[str] = None + summary: dict[str, Any] = Field(default_factory=dict) + requests_count: int = 0 + runs_count: int = 0 + last_used_at: Optional[str] = None + capabilities: TrainingExperimentCapabilities + + @computed_field # type: ignore[prop-decorator] + @property + def is_active(self) -> bool: + """Deprecated alias for ``active``, kept for older clients/tests.""" + return self.active + + @computed_field # type: ignore[prop-decorator] + @property + def archived(self) -> bool: + """Convenience alias: an experiment is archived when not ``active``.""" + return not self.active + + +# Backward-compatible alias for the previous class name. +TrainingExperiment = TrainingExperimentRow + + +class TrainingExperimentsSummary(BaseModel): + total: int = 0 + builtin: int = 0 + custom: int = 0 + editable: int = 0 + locked: int = 0 + archived: int = 0 + + +class TrainingExperimentsListResponse(BaseModel): + rows: list[TrainingExperimentRow] = Field(default_factory=list) + total: int = 0 + summary: TrainingExperimentsSummary = Field(default_factory=TrainingExperimentsSummary) + filters: dict[str, Any] = Field(default_factory=dict) + + +class TrainingExperimentModelRow(BaseModel): + """A model produced by training with a given experiment config.""" + + model_id: str + frozen_dataset_id: str + frozen_dataset_display_name: Optional[str] = None + created_at: Optional[str] = None + run_key: Optional[str] = None + link_table: Optional[str] = None + + +class TrainingExperimentDetailResponse(BaseModel): + experiment: TrainingExperimentRow + models: list[TrainingExperimentModelRow] = Field(default_factory=list) + + +class TrainingExperimentModelsResponse(BaseModel): + experiment: TrainingExperimentRow + models: list[TrainingExperimentModelRow] = Field(default_factory=list) + total: int = 0 + + +class ConfigSchemaResponse(BaseModel): + config_type: str + json_schema: dict[str, Any] = Field(default_factory=dict) + + +class TrainingRequest(BaseModel): + """A manual training request (spec §17). + + ``id``, ``kind``, ``state``, ``frozen_dataset_id``, ``train_config_id``, + ``config_name`` and ``config_hash`` are the normative fields. The + remaining fields carry the full snapshot for debugging/detail views. + """ + + id: str + kind: str = "manual" + state: str = "queued" + frozen_dataset_id: Optional[str] = None + train_config_id: str + config_name: Optional[str] = None + config_hash: Optional[str] = None + enabled: bool = True + force: bool = False + max_within_time: Optional[str] = None + config_source: Optional[str] = None + config_params_snapshot: dict[str, Any] = Field(default_factory=dict) + requested_at: Optional[str] = None + requested_by: Optional[str] = None + client_request_id: Optional[str] = None + + +class TrainingRequestListRow(BaseModel): + """Request row enriched with optional status / run / model links.""" + + id: str + kind: str = "manual" + state: str = "queued" + frozen_dataset_id: Optional[str] = None + train_config_id: str + config_name: Optional[str] = None + requested_at: Optional[str] = None + force: bool = False + enabled: bool = True + # Joined from the training status table when present. + run_key: Optional[str] = None + model_id: Optional[str] = None + status: Optional[str] = None + started_at: Optional[str] = None + # True for manual requests that have not been launched / trained yet. + can_delete: bool = False + # True when run_labels are configured and the request has not been launched yet. + can_launch: bool = False + + +class TrainingRequestsListResponse(BaseModel): + rows: list[TrainingRequestListRow] = Field(default_factory=list) + total: int = 0 + + +class LaunchInfo(BaseModel): + started: bool + run_id: Optional[str] = None + + +class CreateTrainingRequestResponse(BaseModel): + request: TrainingRequest + launch: Optional[LaunchInfo] = None + + +class LaunchResponse(BaseModel): + training_request_id: str + started: bool + run_id: Optional[str] = None + + +# ------------------------------------------------------------------ requests + + +class CreateTrainingExperimentRequest(BaseModel): + display_name: str + description: Optional[str] = None + params: dict[str, Any] = Field(default_factory=dict) + + +class UpdateTrainingExperimentRequest(BaseModel): + display_name: str + description: Optional[str] = None + params: dict[str, Any] = Field(default_factory=dict) + expected_revision: int + + +class DuplicateTrainingExperimentRequest(BaseModel): + display_name: Optional[str] = None + description: Optional[str] = None + + +class CreateTrainingRequestRequest(BaseModel): + frozen_dataset_id: str + train_config_id: str + client_request_id: str + launch: bool = False + """When True, skip ``max_within_time`` freshness and train on a stale dataset.""" + force: bool = False + + +# Backward-compatible aliases for the previous request class names. +CreateExperimentRequest = CreateTrainingExperimentRequest +UpdateExperimentRequest = UpdateTrainingExperimentRequest +DuplicateExperimentRequest = DuplicateTrainingExperimentRequest + + +__all__ = [ + "TrainingExperimentError", + "TrainingExperimentCapabilities", + "TrainingExperimentRow", + "TrainingExperiment", + "TrainingExperimentsSummary", + "TrainingExperimentsListResponse", + "TrainingExperimentDetailResponse", + "TrainingExperimentModelRow", + "TrainingExperimentModelsResponse", + "ConfigSchemaResponse", + "TrainingRequest", + "TrainingRequestListRow", + "TrainingRequestsListResponse", + "LaunchInfo", + "CreateTrainingRequestResponse", + "LaunchResponse", + "CreateTrainingExperimentRequest", + "UpdateTrainingExperimentRequest", + "DuplicateTrainingExperimentRequest", + "CreateTrainingRequestRequest", + "CreateExperimentRequest", + "UpdateExperimentRequest", + "DuplicateExperimentRequest", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_routes.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_routes.py new file mode 100644 index 000000000..1d8910844 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_routes.py @@ -0,0 +1,209 @@ +from __future__ import annotations + +from typing import Any, Callable, Optional, TypeVar + +from datapipe.compute import Catalog +from datapipe.datatable import DataStore +from fastapi import FastAPI +from fastapi.responses import JSONResponse + +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.training_experiments_models import ( + ConfigSchemaResponse, + CreateTrainingExperimentRequest, + CreateTrainingRequestRequest, + CreateTrainingRequestResponse, + DuplicateTrainingExperimentRequest, + LaunchResponse, + TrainingExperimentDetailResponse, + TrainingExperimentError, + TrainingExperimentModelsResponse, + TrainingExperimentsListResponse, + TrainingRequestsListResponse, + UpdateTrainingExperimentRequest, +) +from datapipe_app_ml_ops.ops.training_experiments_service import ( + RunStepsCallable, + TrainingExperimentsService, +) + +T = TypeVar("T") + +_BASE = "/pipelines/{pipeline_id}/ops-specs/{spec_id}/training" + + +def _error_response(exc: TrainingExperimentError) -> JSONResponse: + return JSONResponse(status_code=exc.status_code, content=exc.to_payload()) + + +def _guard(fn: Callable[[], T]) -> Any: + try: + return fn() + except TrainingExperimentError as exc: + return _error_response(exc) + + +def register_training_experiments_routes( + app: FastAPI, + *, + registry: OpsSpecRegistry, + ds: DataStore, + catalog: Catalog, + run_steps: Optional[RunStepsCallable] = None, +) -> None: + """Register the custom training experiments API (spec §19-20).""" + + def _service() -> TrainingExperimentsService: + return TrainingExperimentsService( + registry, ds=ds, catalog=catalog, run_steps=run_steps + ) + + @app.get(_BASE + "/experiments", response_model=TrainingExperimentsListResponse) + def list_experiments( + pipeline_id: str, + spec_id: str, + search: Optional[str] = None, + source: Optional[str] = None, + state: Optional[str] = None, + include_archived: bool = False, + order: Optional[str] = None, + limit: int = 50, + offset: int = 0, + ) -> Any: + return _guard( + lambda: _service().list_experiments( + spec_id, + search=search, + source=source, + state=state, + include_archived=include_archived, + order=order, + limit=min(limit, 200), + offset=offset, + ) + ) + + @app.get(_BASE + "/config-schema", response_model=ConfigSchemaResponse) + def get_config_schema( + pipeline_id: str, + spec_id: str, + config_type: Optional[str] = None, + ) -> Any: + return _guard(lambda: _service().get_config_schema(spec_id, config_type=config_type)) + + @app.get( + _BASE + "/experiments/{config_id}", + response_model=TrainingExperimentDetailResponse, + ) + def get_experiment(pipeline_id: str, spec_id: str, config_id: str) -> Any: + return _guard(lambda: _service().get_experiment(spec_id, config_id)) + + @app.get( + _BASE + "/experiments/{config_id}/models", + response_model=TrainingExperimentModelsResponse, + ) + def list_experiment_models(pipeline_id: str, spec_id: str, config_id: str) -> Any: + return _guard(lambda: _service().list_experiment_models(spec_id, config_id)) + + @app.post( + _BASE + "/experiments", + response_model=TrainingExperimentDetailResponse, + status_code=201, + ) + def create_experiment( + pipeline_id: str, spec_id: str, req: CreateTrainingExperimentRequest + ) -> Any: + return _guard(lambda: _service().create_experiment(spec_id, req)) + + @app.patch( + _BASE + "/experiments/{config_id}", + response_model=TrainingExperimentDetailResponse, + ) + def update_experiment( + pipeline_id: str, spec_id: str, config_id: str, req: UpdateTrainingExperimentRequest + ) -> Any: + return _guard(lambda: _service().update_experiment(spec_id, config_id, req)) + + @app.delete(_BASE + "/experiments/{config_id}") + def delete_experiment(pipeline_id: str, spec_id: str, config_id: str) -> Any: + def _run() -> JSONResponse: + _service().delete_experiment(spec_id, config_id) + return JSONResponse(status_code=200, content={"deleted": config_id}) + + return _guard(_run) + + @app.post( + _BASE + "/experiments/{config_id}/duplicate", + response_model=TrainingExperimentDetailResponse, + status_code=201, + ) + def duplicate_experiment( + pipeline_id: str, + spec_id: str, + config_id: str, + req: DuplicateTrainingExperimentRequest, + ) -> Any: + return _guard(lambda: _service().duplicate_experiment(spec_id, config_id, req)) + + @app.post( + _BASE + "/experiments/{config_id}/archive", + response_model=TrainingExperimentDetailResponse, + ) + def archive_experiment(pipeline_id: str, spec_id: str, config_id: str) -> Any: + return _guard(lambda: _service().archive_experiment(spec_id, config_id)) + + @app.post( + _BASE + "/experiments/{config_id}/unarchive", + response_model=TrainingExperimentDetailResponse, + ) + def unarchive_experiment(pipeline_id: str, spec_id: str, config_id: str) -> Any: + return _guard(lambda: _service().unarchive_experiment(spec_id, config_id)) + + @app.get(_BASE + "/requests", response_model=TrainingRequestsListResponse) + def list_training_requests( + pipeline_id: str, + spec_id: str, + limit: int = 50, + offset: int = 0, + ) -> Any: + return _guard( + lambda: _service().list_training_requests( + spec_id, + limit=min(limit, 200), + offset=offset, + ) + ) + + @app.post( + _BASE + "/requests", + response_model=CreateTrainingRequestResponse, + status_code=201, + ) + def create_training_request( + pipeline_id: str, + spec_id: str, + req: CreateTrainingRequestRequest, + ) -> Any: + return _guard(lambda: _service().create_training_request(spec_id, req)) + + @app.post( + _BASE + "/requests/{request_id}/launch", + response_model=LaunchResponse, + ) + def launch_training_request( + pipeline_id: str, spec_id: str, request_id: str + ) -> Any: + return _guard(lambda: _service().launch_training_request(spec_id, request_id)) + + @app.delete(_BASE + "/requests/{request_id}") + def delete_training_request( + pipeline_id: str, spec_id: str, request_id: str + ) -> Any: + def _run() -> JSONResponse: + _service().delete_training_request(spec_id, request_id) + return JSONResponse(status_code=200, content={"deleted": request_id}) + + return _guard(_run) + + +__all__ = ["register_training_experiments_routes"] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_service.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_service.py new file mode 100644 index 000000000..5eb09b411 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/ops/training_experiments_service.py @@ -0,0 +1,1299 @@ +from __future__ import annotations + +import math +from datetime import datetime, timezone +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple + +import pandas as pd +from datapipe.compute import Catalog +from datapipe.datatable import DataStore +from datapipe.types import IndexDF + +# Importing codecs registers yolov8_* / tf_classification (spec §15). Side-effect +# imports are guarded because they pull optional extras (torch/ultralytics or +# tensorflow); when an extra is absent the codec simply is not registered and +# codec-dependent endpoints report an ``unknown_config_type`` error instead of +# failing to import. +try: # pragma: no cover - depends on optional extra being installed + import datapipe_ml.frameworks.yolo.train_config_codec # noqa: F401 +except Exception: # noqa: BLE001 - optional dependency may be missing + pass +try: # pragma: no cover - depends on optional extra being installed + import datapipe_ml.frameworks.tensorflow.train_config_codec # noqa: F401 +except Exception: # noqa: BLE001 - optional dependency may be missing + pass +from datapipe_ml.training.config_codec import ( + TrainConfigValidationError, + get_train_config_codec, +) +from datapipe_ml.training.train_config_id import ( + build_custom_train_config_id, + build_manual_training_request_id, + hash_train_config_params, +) + +from datapipe_app_ml_ops.ops.ops_specs import ( + DatapipeOpsSpec, + OpsFrozenDatasetSpec, + OpsTrainConfigRegistrySpec, + OpsTrainingRequestSpec, +) +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.training_experiments_models import ( + ConfigSchemaResponse, + CreateTrainingExperimentRequest, + CreateTrainingRequestRequest, + CreateTrainingRequestResponse, + DuplicateTrainingExperimentRequest, + LaunchInfo, + LaunchResponse, + TrainingExperimentCapabilities, + TrainingExperimentDetailResponse, + TrainingExperimentError, + TrainingExperimentModelRow, + TrainingExperimentModelsResponse, + TrainingExperimentRow, + TrainingExperimentsListResponse, + TrainingExperimentsSummary, + TrainingRequest, + TrainingRequestListRow, + TrainingRequestsListResponse, + UpdateTrainingExperimentRequest, +) + +# ------------------------------------------------------------------ run_steps + +# The result of launching a training request (spec §18). +RunStepsResult = Dict[str, Any] # {"started": bool, "run_id": Optional[str]} + +# Callable injected by datapipe-app that filters the pipeline steps by +# ``run_labels`` and runs them with a primary-key filter on the request id +# (spec §18). It is synchronous to match the existing v1alpha3 API style. +RunStepsCallable = Callable[ + [str, Sequence[Tuple[str, str]], Dict[str, List[Any]]], + RunStepsResult, +] + + +def build_capabilities( + *, + source: str, + active: bool, + requests_count: int, +) -> TrainingExperimentCapabilities: + """Compute action flags for an experiment (spec §16). + + The backend is the sole source of these flags. ``active`` means the + experiment is enabled (not archived); ``source`` is ``"builtin"`` or + ``"custom"``. Built-in experiments are always read-only. A custom + experiment's parameters become locked (read-only) as soon as it has been + used by at least one training request. + """ + + if source == "builtin": + return TrainingExperimentCapabilities( + can_edit=False, + can_delete=False, + can_duplicate=True, + can_launch=active, + can_archive=False, + lock_reason="Built-in experiments are managed by pipeline code", + ) + if requests_count == 0: + return TrainingExperimentCapabilities( + can_edit=True, + can_delete=True, + can_duplicate=True, + can_launch=active, + can_archive=True, + lock_reason=None, + ) + return TrainingExperimentCapabilities( + can_edit=False, + can_delete=False, + can_duplicate=True, + can_launch=active, + can_archive=True, + lock_reason=( + "Experiment parameters are locked because " + "the experiment has already been used by a training request" + ), + ) + + +# ------------------------------------------------------------------ helpers + + +def _now_iso() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _is_nan(value: Any) -> bool: + if value is None: + return True + if isinstance(value, float) and math.isnan(value): + return True + try: + if pd.isna(value): + return True + except (TypeError, ValueError): + pass + return False + + +def _clean_str(value: Any) -> Optional[str]: + if _is_nan(value): + return None + text = str(value) + return text + + +def _clean_bool(value: Any, *, default: bool = False) -> bool: + if _is_nan(value): + return default + if isinstance(value, str): + return value.strip().lower() in {"1", "true", "yes", "y"} + return bool(value) + + +def _clean_int(value: Any, *, default: int = 0) -> int: + if _is_nan(value): + return default + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _clean_dict(value: Any) -> dict[str, Any]: + if _is_nan(value): + return {} + if isinstance(value, dict): + return dict(value) + return {} + + +def _guess_column( + df: pd.DataFrame, + *, + suffixes: Sequence[str] = (), + exact: Sequence[str] = (), +) -> Optional[str]: + columns = list(df.columns) + for name in exact: + if name in columns: + return name + for col in columns: + for suffix in suffixes: + if str(col).endswith(suffix): + return str(col) + return None + + +def _record_created_at(record: dict[str, Any]) -> Optional[str]: + for key, value in record.items(): + key_l = str(key).lower() + if key_l.endswith("created_at") or key_l.endswith("started_at") or key_l == "created_at": + text = _clean_str(value) + if text: + return text + return None + + +def _request_not_started( + *, + run_key: Optional[str], + model_id: Optional[str], + status: Optional[str], + started_at: Optional[str], +) -> bool: + """True when no launch / training evidence exists for the request yet.""" + if run_key or model_id or started_at: + return False + if status is None: + return True + return status.strip().lower() in {"", "queued", "pending"} + + +def _request_can_delete( + *, + kind: str, + run_key: Optional[str], + model_id: Optional[str], + status: Optional[str], + started_at: Optional[str], +) -> bool: + """Manual requests may be deleted only before launch / training starts.""" + if kind != "manual": + return False + return _request_not_started( + run_key=run_key, + model_id=model_id, + status=status, + started_at=started_at, + ) + + +def _request_can_launch( + *, + run_labels_configured: bool, + run_key: Optional[str], + model_id: Optional[str], + status: Optional[str], + started_at: Optional[str], +) -> bool: + """Launch is offered when run_labels are set and the request is still idle.""" + if not run_labels_configured: + return False + return _request_not_started( + run_key=run_key, + model_id=model_id, + status=status, + started_at=started_at, + ) + + +class TrainingExperimentsService: + """Backend for the custom training experiments API (spec §14-18).""" + + def __init__( + self, + registry: OpsSpecRegistry, + *, + ds: DataStore, + catalog: Catalog, + run_steps: Optional[RunStepsCallable] = None, + ) -> None: + self.registry = registry + self.ds = ds + self.catalog = catalog + self.run_steps = run_steps + + # ----------------------------------------------------------- spec resolve + + def _spec(self, spec_id: str) -> DatapipeOpsSpec: + try: + return self.registry.get(spec_id) + except KeyError as exc: + raise TrainingExperimentError( + "not_found", + f'Ops spec "{spec_id}" was not found.', + status_code=404, + ) from exc + + def _experiments_spec(self, spec_id: str) -> OpsTrainConfigRegistrySpec: + spec = self._spec(spec_id) + training = spec.training + experiments = training.experiments if training is not None else None + if experiments is None: + raise TrainingExperimentError( + "not_configured", + f'Ops spec "{spec_id}" has no training experiments registry configured.', + status_code=404, + ) + return experiments + + def _requests_spec(self, spec_id: str) -> OpsTrainingRequestSpec: + spec = self._spec(spec_id) + training = spec.training + requests = training.requests if training is not None else None + if requests is None: + raise TrainingExperimentError( + "not_configured", + f'Ops spec "{spec_id}" has no training requests table configured.', + status_code=404, + ) + return requests + + def _frozen_spec(self, spec_id: str) -> Optional[OpsFrozenDatasetSpec]: + return self._spec(spec_id).frozen_dataset + + # ----------------------------------------------------------- table access + + def _read_df(self, table: str) -> pd.DataFrame: + dt = self.catalog.get_datatable(self.ds, table) + df = dt.get_data() + if df is None: + return pd.DataFrame() + return df + + def _write_row(self, table: str, row: dict[str, Any]) -> None: + dt = self.catalog.get_datatable(self.ds, table) + dt.store_chunk(pd.DataFrame([row])) + + def _delete_id(self, table: str, id_column: str, value: Any) -> None: + dt = self.catalog.get_datatable(self.ds, table) + idx = IndexDF(pd.DataFrame([{id_column: value}])) + dt.delete_by_idx(idx) + + # --------------------------------------------------------- codec helpers + + def _codec(self, config_type: str): + try: + return get_train_config_codec(config_type) + except ValueError as exc: + raise TrainingExperimentError( + "unknown_config_type", + str(exc), + status_code=400, + ) from exc + + def _validate_params(self, config_type: str, params: dict[str, Any]) -> dict[str, Any]: + codec = self._codec(config_type) + try: + return codec.normalize(params) + except TrainConfigValidationError as exc: + raise TrainingExperimentError( + "train_config_validation_failed", + str(exc), + status_code=422, + details={"errors": exc.errors}, + ) from exc + + def _summarize(self, config_type: str, params: dict[str, Any]) -> dict[str, Any]: + codec = self._codec(config_type) + try: + return codec.summarize(params) + except Exception: # summarize is best-effort display metadata + return {} + + # ----------------------------------------------------------- row -> model + + def _experiment_from_row( + self, + registry_spec: OpsTrainConfigRegistrySpec, + row: pd.Series, + *, + requests_count: int, + runs_count: int, + last_used_at: Optional[str] = None, + source: Optional[str] = None, + ) -> TrainingExperimentRow: + if source is None: + source = _clean_str(row.get(registry_spec.source_column)) or "builtin" + # Default/builtin table has no is_active column; treat as always active. + if source == "builtin": + active = True + else: + active = _clean_bool(row.get(registry_spec.active_column), default=True) + params = _clean_dict(row.get(registry_spec.params_column)) + config_type = ( + _clean_str(row.get(registry_spec.config_type_column)) + or registry_spec.config_type + ) + return TrainingExperimentRow( + id=str(row.get(registry_spec.id_column)), + source=source, + display_name=_clean_str(row.get(registry_spec.display_name_column)), + description=_clean_str(row.get(registry_spec.description_column)), + config_type=config_type, + params=params, + config_hash=_clean_str(row.get(registry_spec.hash_column)), + active=active, + revision=_clean_int(row.get(registry_spec.revision_column), default=1), + created_at=_clean_str(row.get(registry_spec.created_at_column)), + updated_at=_clean_str(row.get(registry_spec.updated_at_column)), + summary=self._summarize(config_type, params), + requests_count=requests_count, + runs_count=runs_count, + last_used_at=last_used_at, + capabilities=build_capabilities( + source=source, + active=active, + requests_count=requests_count, + ), + ) + + def _iter_registry_rows( + self, registry_spec: OpsTrainConfigRegistrySpec + ) -> list[tuple[pd.Series, str]]: + """Return ``(row, source)`` pairs from default + custom registry tables.""" + rows: list[tuple[pd.Series, str]] = [] + if registry_spec.default_table: + df_default = self._read_df(registry_spec.default_table) + if not df_default.empty and registry_spec.id_column in df_default.columns: + for _, row in df_default.iterrows(): + rows.append((row, "builtin")) + df_custom = self._read_df(registry_spec.table) + if not df_custom.empty and registry_spec.id_column in df_custom.columns: + for _, row in df_custom.iterrows(): + # Legacy single-table mode: honour stored source when no default_table. + if registry_spec.default_table is None: + source = _clean_str(row.get(registry_spec.source_column)) or "custom" + else: + source = "custom" + rows.append((row, source)) + return rows + + # ----------------------------------------------------------- counts + + def _requests_df(self, spec_id: str) -> pd.DataFrame: + spec = self._spec(spec_id) + training = spec.training + requests = training.requests if training is not None else None + if requests is None: + return pd.DataFrame() + return self._read_df(requests.table) + + def _counts_by_config( + self, spec_id: str + ) -> Tuple[dict[str, int], dict[str, int], dict[str, str]]: + """Return ``(requests_count, runs_count, last_used_at)`` keyed by + ``train_config_id``.""" + spec = self._spec(spec_id) + training = spec.training + requests = training.requests if training is not None else None + if requests is None: + return {}, {}, {} + df_req = self._read_df(requests.table) + requests_count: dict[str, int] = {} + last_used_at: dict[str, str] = {} + request_to_config: dict[str, str] = {} + if not df_req.empty and requests.train_config_id_column in df_req.columns: + for _, r in df_req.iterrows(): + config_id = _clean_str(r.get(requests.train_config_id_column)) + request_id = _clean_str(r.get(requests.id_column)) + if config_id is None: + continue + requests_count[config_id] = requests_count.get(config_id, 0) + 1 + if request_id is not None: + request_to_config[request_id] = config_id + requested_at = _clean_str(r.get(requests.requested_at_column)) + if requested_at is not None: + current = last_used_at.get(config_id) + if current is None or requested_at > current: + last_used_at[config_id] = requested_at + + runs_count: dict[str, int] = {} + if ( + requests.status_table + and requests.status_request_id_column + and request_to_config + ): + df_status = self._read_df(requests.status_table) + if ( + not df_status.empty + and requests.status_request_id_column in df_status.columns + ): + for _, r in df_status.iterrows(): + request_id = _clean_str(r.get(requests.status_request_id_column)) + config_id = request_to_config.get(request_id or "") + if config_id is None: + continue + runs_count[config_id] = runs_count.get(config_id, 0) + 1 + return requests_count, runs_count, last_used_at + + def list_training_requests( + self, + spec_id: str, + *, + limit: int = 50, + offset: int = 0, + ) -> TrainingRequestsListResponse: + """List training requests joined with status run/model when available.""" + requests_spec = self._requests_spec(spec_id) + spec = self._spec(spec_id) + df_req = self._read_df(requests_spec.table) + if df_req.empty or requests_spec.id_column not in df_req.columns: + return TrainingRequestsListResponse(rows=[], total=0) + + status_by_request = self._status_by_request_id(spec, requests_spec) + + rows: list[TrainingRequestListRow] = [] + for _, row in df_req.iterrows(): + request_id = _clean_str(row.get(requests_spec.id_column)) + if request_id is None: + continue + train_config_id = _clean_str(row.get(requests_spec.train_config_id_column)) or "" + status = status_by_request.get(request_id) + status_value = status.get("status") if status else None + run_key = status.get("run_key") if status else None + model_id = status.get("model_id") if status else None + started_at = status.get("started_at") if status else None + kind = _clean_str(row.get(requests_spec.kind_column)) or "manual" + not_started_kwargs = dict( + run_key=run_key, + model_id=model_id, + status=status_value, + started_at=started_at, + ) + rows.append( + TrainingRequestListRow( + id=request_id, + kind=kind, + state=status_value or "queued", + frozen_dataset_id=_clean_str(row.get(requests_spec.frozen_dataset_id_column)), + train_config_id=train_config_id, + config_name=_clean_str(row.get(requests_spec.config_name_snapshot_column)), + requested_at=_clean_str(row.get(requests_spec.requested_at_column)), + force=_clean_bool(row.get(requests_spec.force_column), default=False), + enabled=_clean_bool(row.get(requests_spec.enabled_column), default=True), + run_key=run_key, + model_id=model_id, + status=status_value, + started_at=started_at, + can_delete=_request_can_delete(kind=kind, **not_started_kwargs), + can_launch=_request_can_launch( + run_labels_configured=bool(requests_spec.run_labels), + **not_started_kwargs, + ), + ) + ) + + rows.sort(key=lambda r: r.requested_at or "", reverse=True) + total = len(rows) + page = rows[offset : offset + limit] + return TrainingRequestsListResponse(rows=page, total=total) + + def _status_by_request_id( + self, + spec: DatapipeOpsSpec, + requests_spec: OpsTrainingRequestSpec, + ) -> dict[str, dict[str, Optional[str]]]: + """Map ``training_request_id`` → latest status fields (run/model/status).""" + status_table = requests_spec.status_table or ( + spec.training.status_table if spec.training is not None else None + ) + request_col = requests_spec.status_request_id_column + if not status_table or not request_col: + return {} + + df = self._read_df(status_table) + if df.empty or request_col not in df.columns: + return {} + + model_id_col = ( + spec.model.id_column + if spec.model is not None + else _guess_column(df, suffixes=("_model_id",), exact=("model_id",)) + ) + run_key_col = _guess_column( + df, + suffixes=("__run_key",), + exact=("run_key", "training_status__run_key"), + ) + status_col = _guess_column( + df, + suffixes=("__status",), + exact=("status", "training_status__status"), + ) + started_col = _guess_column( + df, + suffixes=("__started_at", "__created_at"), + exact=("started_at", "created_at"), + ) + + # Prefer the chronologically latest status row per request. + if started_col and started_col in df.columns: + df = df.sort_values(by=started_col, ascending=True, na_position="first") + + out: dict[str, dict[str, Optional[str]]] = {} + for _, r in df.iterrows(): + request_id = _clean_str(r.get(request_col)) + if request_id is None: + continue + out[request_id] = { + "run_key": _clean_str(r.get(run_key_col)) if run_key_col else None, + "model_id": _clean_str(r.get(model_id_col)) if model_id_col else None, + "status": _clean_str(r.get(status_col)) if status_col else None, + "started_at": _clean_str(r.get(started_col)) if started_col else None, + } + return out + + # ================================================================= read + + def list_experiments( + self, + spec_id: str, + *, + search: Optional[str] = None, + source: Optional[str] = None, + state: Optional[str] = None, + include_archived: bool = False, + order: Optional[str] = None, + limit: int = 50, + offset: int = 0, + ) -> TrainingExperimentsListResponse: + registry_spec = self._experiments_spec(spec_id) + requests_count, runs_count, last_used_at = self._counts_by_config(spec_id) + + experiments: list[TrainingExperimentRow] = [] + for row, row_source in self._iter_registry_rows(registry_spec): + config_id = str(row.get(registry_spec.id_column)) + experiments.append( + self._experiment_from_row( + registry_spec, + row, + requests_count=requests_count.get(config_id, 0), + runs_count=runs_count.get(config_id, 0), + last_used_at=last_used_at.get(config_id), + source=row_source, + ) + ) + + summary = TrainingExperimentsSummary( + total=len(experiments), + builtin=sum(1 for e in experiments if e.source == "builtin"), + custom=sum(1 for e in experiments if e.source == "custom"), + editable=sum( + 1 for e in experiments if e.source == "custom" and e.capabilities.can_edit + ), + locked=sum( + 1 + for e in experiments + if e.source == "custom" and e.requests_count > 0 and e.active + ), + archived=sum(1 for e in experiments if not e.active), + ) + + rows = experiments + if not include_archived and state != "archived": + rows = [e for e in rows if e.active] + if source: + rows = [e for e in rows if e.source == source] + if state == "active": + rows = [e for e in rows if e.active] + elif state == "archived": + rows = [e for e in rows if not e.active] + if search: + q = search.lower() + rows = [ + e + for e in rows + if q in e.id.lower() + or q in (e.display_name or "").lower() + or q in (e.description or "").lower() + ] + + rows = self._order_experiments(rows, order) + + total = len(rows) + page = rows[offset : offset + limit] + return TrainingExperimentsListResponse( + rows=page, + total=total, + summary=summary, + filters={ + "sources": sorted({e.source for e in experiments}), + "states": ["active", "archived"], + }, + ) + + def _order_experiments( + self, rows: list[TrainingExperimentRow], order: Optional[str] + ) -> list[TrainingExperimentRow]: + field = order or "-updated_at" + reverse = field.startswith("-") + key = field[1:] if reverse else field + allowed = {"updated_at", "created_at", "display_name", "id", "revision"} + if key not in allowed: + key = "updated_at" + reverse = True + + def _sort_key(e: TrainingExperimentRow) -> str: + value = getattr(e, key, None) + return "" if value is None else str(value) + + return sorted(rows, key=_sort_key, reverse=reverse) + + def get_experiment(self, spec_id: str, config_id: str) -> TrainingExperimentDetailResponse: + experiment = self._load_experiment(spec_id, config_id) + models = self._models_for_config(spec_id, config_id) + return TrainingExperimentDetailResponse(experiment=experiment, models=models) + + def list_experiment_models( + self, spec_id: str, config_id: str + ) -> TrainingExperimentModelsResponse: + experiment = self._load_experiment(spec_id, config_id) + models = self._models_for_config(spec_id, config_id) + return TrainingExperimentModelsResponse( + experiment=experiment, + models=models, + total=len(models), + ) + + def _models_for_config( + self, spec_id: str, config_id: str + ) -> list[TrainingExperimentModelRow]: + """Models trained with ``config_id``, including the frozen dataset used.""" + spec = self._spec(spec_id) + try: + requests_spec = self._requests_spec(spec_id) + except TrainingExperimentError: + return [] + + train_config_col = requests_spec.train_config_id_column + dataset_names = self._frozen_dataset_names(spec_id) + rows: list[TrainingExperimentModelRow] = [] + seen: set[tuple[str, str]] = set() + + relation = self._trained_on_relation(spec) + if relation is not None: + df = self._read_df(relation.table) + if ( + not df.empty + and train_config_col in df.columns + and relation.from_column in df.columns + and relation.to_column in df.columns + ): + match = df[df[train_config_col].astype(str) == str(config_id)] + for _, r in match.iterrows(): + model_id = _clean_str(r.get(relation.from_column)) + dataset_id = _clean_str(r.get(relation.to_column)) + if model_id is None or dataset_id is None: + continue + key = (model_id, dataset_id) + if key in seen: + continue + seen.add(key) + rows.append( + TrainingExperimentModelRow( + model_id=model_id, + frozen_dataset_id=dataset_id, + frozen_dataset_display_name=dataset_names.get(dataset_id), + created_at=_record_created_at({str(k): v for k, v in r.to_dict().items()}), + link_table=relation.table, + ) + ) + + if not rows: + rows.extend( + self._models_from_status_table( + spec, + requests_spec, + config_id=config_id, + dataset_names=dataset_names, + seen=seen, + ) + ) + + rows.sort(key=lambda row: row.created_at or "", reverse=True) + return rows + + def _trained_on_relation(self, spec: DatapipeOpsSpec): + relation_id = ( + spec.frozen_dataset.models_count_relation_id + if spec.frozen_dataset is not None + else "model_trained_on_frozen_dataset" + ) + if not relation_id: + return None + return next((rel for rel in spec.relations if rel.id == relation_id), None) + + def _frozen_dataset_names(self, spec_id: str) -> dict[str, str]: + frozen = self._frozen_spec(spec_id) + if frozen is None or not frozen.display_name_column: + return {} + df = self._read_df(frozen.table) + if df.empty or frozen.id_column not in df.columns: + return {} + names: dict[str, str] = {} + for _, r in df.iterrows(): + dataset_id = _clean_str(r.get(frozen.id_column)) + display = _clean_str(r.get(frozen.display_name_column)) + if dataset_id and display: + names[dataset_id] = display + return names + + def _models_from_status_table( + self, + spec: DatapipeOpsSpec, + requests_spec: OpsTrainingRequestSpec, + *, + config_id: str, + dataset_names: dict[str, str], + seen: set[tuple[str, str]], + ) -> list[TrainingExperimentModelRow]: + status_table = requests_spec.status_table or ( + spec.training.status_table if spec.training is not None else None + ) + if not status_table: + return [] + df = self._read_df(status_table) + train_config_col = requests_spec.train_config_id_column + frozen_id_col = requests_spec.frozen_dataset_id_column + model_id_col = ( + spec.model.id_column + if spec.model is not None + else _guess_column(df, suffixes=("_model_id",), exact=("model_id",)) + ) + if ( + df.empty + or train_config_col not in df.columns + or frozen_id_col not in df.columns + or not model_id_col + or model_id_col not in df.columns + ): + return [] + + run_key_col = _guess_column( + df, + suffixes=("__run_key",), + exact=("run_key", "training_status__run_key"), + ) + started_col = _guess_column( + df, + suffixes=("__started_at", "__created_at"), + exact=("started_at", "created_at"), + ) + + rows: list[TrainingExperimentModelRow] = [] + match = df[df[train_config_col].astype(str) == str(config_id)] + for _, r in match.iterrows(): + model_id = _clean_str(r.get(model_id_col)) + dataset_id = _clean_str(r.get(frozen_id_col)) + if model_id is None or dataset_id is None: + continue + key = (model_id, dataset_id) + if key in seen: + continue + seen.add(key) + created_at = _clean_str(r.get(started_col)) if started_col else None + rows.append( + TrainingExperimentModelRow( + model_id=model_id, + frozen_dataset_id=dataset_id, + frozen_dataset_display_name=dataset_names.get(dataset_id), + created_at=created_at, + run_key=_clean_str(r.get(run_key_col)) if run_key_col else None, + link_table=status_table, + ) + ) + return rows + + def _load_experiment(self, spec_id: str, config_id: str) -> TrainingExperimentRow: + registry_spec = self._experiments_spec(spec_id) + requests_count, runs_count, last_used_at = self._counts_by_config(spec_id) + # Prefer the custom table so API-owned rows win over builtins on id clash. + candidates = list(self._iter_registry_rows(registry_spec)) + candidates.sort(key=lambda item: 0 if item[1] == "custom" else 1) + for row, source in candidates: + if str(row.get(registry_spec.id_column)) != str(config_id): + continue + return self._experiment_from_row( + registry_spec, + row, + requests_count=requests_count.get(config_id, 0), + runs_count=runs_count.get(config_id, 0), + last_used_at=last_used_at.get(config_id), + source=source, + ) + raise self._not_found(config_id) + + def _not_found(self, config_id: str) -> TrainingExperimentError: + return TrainingExperimentError( + "experiment_not_found", + f'Training experiment "{config_id}" was not found.', + status_code=404, + ) + + def get_config_schema( + self, spec_id: str, *, config_type: Optional[str] = None + ) -> ConfigSchemaResponse: + registry_spec = self._experiments_spec(spec_id) + resolved = config_type or registry_spec.config_type + codec = self._codec(resolved) + return ConfigSchemaResponse(config_type=resolved, json_schema=codec.json_schema()) + + # ================================================================ write + + def create_experiment( + self, spec_id: str, req: CreateTrainingExperimentRequest + ) -> TrainingExperimentDetailResponse: + registry_spec = self._experiments_spec(spec_id) + config_type = registry_spec.config_type + params = self._validate_params(config_type, req.params) + config_id = build_custom_train_config_id() + now = _now_iso() + row = self._registry_row( + registry_spec, + config_id=config_id, + config_type=config_type, + params=params, + display_name=req.display_name, + description=req.description, + source="custom", + active=True, + revision=1, + created_at=now, + updated_at=now, + ) + self._write_row(registry_spec.table, row) + return self.get_experiment(spec_id, config_id) + + def update_experiment( + self, spec_id: str, config_id: str, req: UpdateTrainingExperimentRequest + ) -> TrainingExperimentDetailResponse: + registry_spec = self._experiments_spec(spec_id) + current = self._load_experiment(spec_id, config_id) + if current.source != "custom": + raise TrainingExperimentError( + "builtin_experiment_read_only", + "Built-in experiments are managed by pipeline code and cannot be edited.", + status_code=403, + ) + if current.requests_count > 0: + raise TrainingExperimentError( + "experiment_locked", + "Experiment parameters are locked because the experiment has " + "already been used by a training request.", + status_code=409, + ) + # Optimistic concurrency: caller-provided revision must match current + # (spec §14). DataTable has no multi-row transaction, so this check and + # the write below are best-effort but ordered. + if req.expected_revision != current.revision: + raise TrainingExperimentError( + "experiment_revision_conflict", + "Experiment was modified by someone else.", + status_code=409, + details={"expected": req.expected_revision, "actual": current.revision}, + ) + + params = self._validate_params(current.config_type, req.params) + now = _now_iso() + row = self._registry_row( + registry_spec, + config_id=config_id, + config_type=current.config_type, + params=params, + display_name=req.display_name, + description=req.description, + source="custom", + active=current.active, + revision=current.revision + 1, + created_at=current.created_at or now, + updated_at=now, + ) + self._write_row(registry_spec.table, row) + return self.get_experiment(spec_id, config_id) + + def delete_experiment(self, spec_id: str, config_id: str) -> None: + registry_spec = self._experiments_spec(spec_id) + current = self._load_experiment(spec_id, config_id) + if current.source != "custom": + raise TrainingExperimentError( + "builtin_experiment_read_only", + "Built-in experiments cannot be deleted.", + status_code=403, + ) + if current.requests_count > 0: + raise TrainingExperimentError( + "experiment_locked", + "Experiment has training requests and cannot be deleted.", + status_code=409, + details={"requests_count": current.requests_count}, + ) + self._delete_id(registry_spec.table, registry_spec.id_column, config_id) + + def duplicate_experiment( + self, spec_id: str, config_id: str, req: DuplicateTrainingExperimentRequest + ) -> TrainingExperimentDetailResponse: + registry_spec = self._experiments_spec(spec_id) + source_exp = self._load_experiment(spec_id, config_id) + new_id = build_custom_train_config_id() + now = _now_iso() + display_name = req.display_name or self._copy_name(source_exp.display_name) + description = source_exp.description if req.description is None else req.description + row = self._registry_row( + registry_spec, + config_id=new_id, + config_type=source_exp.config_type, + params=source_exp.params, + display_name=display_name, + description=description, + source="custom", + active=True, + revision=1, + created_at=now, + updated_at=now, + ) + self._write_row(registry_spec.table, row) + return self.get_experiment(spec_id, new_id) + + def _copy_name(self, display_name: Optional[str]) -> str: + base = display_name or "Experiment" + return f"{base} (copy)" + + def archive_experiment(self, spec_id: str, config_id: str) -> TrainingExperimentDetailResponse: + return self._set_active(spec_id, config_id, active=False) + + def unarchive_experiment(self, spec_id: str, config_id: str) -> TrainingExperimentDetailResponse: + return self._set_active(spec_id, config_id, active=True) + + def _set_active( + self, spec_id: str, config_id: str, *, active: bool + ) -> TrainingExperimentDetailResponse: + registry_spec = self._experiments_spec(spec_id) + current = self._load_experiment(spec_id, config_id) + if current.source != "custom": + raise TrainingExperimentError( + "builtin_experiment_read_only", + "Built-in experiments cannot be archived.", + status_code=403, + ) + if current.active == active: + return TrainingExperimentDetailResponse(experiment=current) + now = _now_iso() + row = self._registry_row( + registry_spec, + config_id=config_id, + config_type=current.config_type, + params=current.params, + display_name=current.display_name, + description=current.description, + source="custom", + active=active, + revision=current.revision + 1, + created_at=current.created_at or now, + updated_at=now, + ) + self._write_row(registry_spec.table, row) + return self.get_experiment(spec_id, config_id) + + def _registry_row( + self, + registry_spec: OpsTrainConfigRegistrySpec, + *, + config_id: str, + config_type: str, + params: dict[str, Any], + display_name: Optional[str], + description: Optional[str], + source: str, + active: bool, + revision: int, + created_at: str, + updated_at: str, + ) -> dict[str, Any]: + # ``source`` is derived from which table the row lives in (custom vs + # default); the custom table schema does not store a source column. + _ = source + return { + registry_spec.id_column: config_id, + registry_spec.params_column: params, + registry_spec.display_name_column: display_name, + registry_spec.description_column: description, + registry_spec.config_type_column: config_type, + registry_spec.hash_column: hash_train_config_params(params, length=40), + registry_spec.active_column: active, + registry_spec.revision_column: revision, + registry_spec.created_at_column: created_at, + registry_spec.updated_at_column: updated_at, + } + + # =========================================================== requests + + def _frozen_dataset_exists(self, spec_id: str, frozen_dataset_id: str) -> bool: + frozen = self._frozen_spec(spec_id) + if frozen is None: + # No frozen dataset spec configured: cannot verify, treat as present. + return True + df = self._read_df(frozen.table) + if df.empty or frozen.id_column not in df.columns: + return False + return bool((df[frozen.id_column].astype(str) == str(frozen_dataset_id)).any()) + + def create_training_request( + self, spec_id: str, req: CreateTrainingRequestRequest + ) -> CreateTrainingRequestResponse: + """Create a manual training request for an experiment (spec §17).""" + requests_spec = self._requests_spec(spec_id) + experiment = self._load_experiment(spec_id, req.train_config_id) + + # 1. Experiment must be usable. + if not experiment.active: + raise TrainingExperimentError( + "experiment_inactive", + "Cannot create a request for an inactive (archived) experiment.", + status_code=409, + ) + + # 2. Frozen dataset must exist. + if not self._frozen_dataset_exists(spec_id, req.frozen_dataset_id): + raise TrainingExperimentError( + "frozen_dataset_not_found", + f'Frozen dataset "{req.frozen_dataset_id}" was not found.', + status_code=404, + ) + + # 3. Idempotency by client_request_id. + df_req = self._read_df(requests_spec.table) + existing = self._find_by_client_request_id( + df_req, requests_spec, req.client_request_id + ) + if existing is not None: + return CreateTrainingRequestResponse( + request=self._request_from_row(requests_spec, existing), + launch=None, + ) + + # 4. Snapshot config + build request. + # ``force`` bypasses max_within_time at train time (stale datasets). + # Without force, stamp the ops-spec freshness window onto the request. + request_id = build_manual_training_request_id() + now = _now_iso() + max_within_time = None if req.force else requests_spec.max_within_time + row = { + requests_spec.id_column: request_id, + requests_spec.train_config_id_column: req.train_config_id, + requests_spec.frozen_dataset_id_column: req.frozen_dataset_id, + requests_spec.kind_column: "manual", + requests_spec.enabled_column: True, + requests_spec.force_column: bool(req.force), + requests_spec.max_within_time_column: max_within_time, + requests_spec.config_source_column: experiment.source, + requests_spec.config_name_snapshot_column: experiment.display_name, + requests_spec.config_params_snapshot_column: experiment.params, + requests_spec.config_hash_column: experiment.config_hash, + requests_spec.requested_at_column: now, + requests_spec.requested_by_column: None, + requests_spec.client_request_id_column: req.client_request_id, + } + self._write_row(requests_spec.table, row) + request_info = self._request_from_row(requests_spec, pd.Series(row)) + + launch_info: Optional[LaunchInfo] = None + if req.launch: + self._ensure_launch_configured(requests_spec) + launch_info = self._launch(requests_spec, request_id) + + return CreateTrainingRequestResponse(request=request_info, launch=launch_info) + + def _find_by_client_request_id( + self, + df_req: pd.DataFrame, + requests_spec: OpsTrainingRequestSpec, + client_request_id: str, + ) -> Optional[pd.Series]: + if df_req.empty or requests_spec.client_request_id_column not in df_req.columns: + return None + match = df_req[ + df_req[requests_spec.client_request_id_column].astype(str) + == str(client_request_id) + ] + if match.empty: + return None + return match.iloc[0] + + def _request_from_row( + self, requests_spec: OpsTrainingRequestSpec, row: pd.Series + ) -> TrainingRequest: + return TrainingRequest( + id=str(row.get(requests_spec.id_column)), + kind=_clean_str(row.get(requests_spec.kind_column)) or "manual", + state="queued", + frozen_dataset_id=_clean_str(row.get(requests_spec.frozen_dataset_id_column)), + train_config_id=_clean_str(row.get(requests_spec.train_config_id_column)) or "", + config_name=_clean_str(row.get(requests_spec.config_name_snapshot_column)), + config_hash=_clean_str(row.get(requests_spec.config_hash_column)), + enabled=_clean_bool(row.get(requests_spec.enabled_column), default=True), + force=_clean_bool(row.get(requests_spec.force_column), default=False), + max_within_time=_clean_str(row.get(requests_spec.max_within_time_column)), + config_source=_clean_str(row.get(requests_spec.config_source_column)), + config_params_snapshot=_clean_dict(row.get(requests_spec.config_params_snapshot_column)), + requested_at=_clean_str(row.get(requests_spec.requested_at_column)), + requested_by=_clean_str(row.get(requests_spec.requested_by_column)), + client_request_id=_clean_str(row.get(requests_spec.client_request_id_column)), + ) + + def _ensure_launch_configured(self, requests_spec: OpsTrainingRequestSpec) -> None: + if requests_spec.run_labels: + return + raise TrainingExperimentError( + "training_launch_not_configured", + "Immediate training launch is not configured for this ops spec " + "(set OpsTrainingRequestSpec.run_labels to a pipeline stage such as " + 'stage=train-without-freeze).', + status_code=400, + ) + + def _launch( + self, requests_spec: OpsTrainingRequestSpec, request_id: str + ) -> LaunchInfo: + if self.run_steps is None: + raise TrainingExperimentError( + "training_launch_failed", + "Launching training requests is not available on this instance.", + status_code=503, + ) + self._ensure_launch_configured(requests_spec) + # Never HTTP-call our own API: run the pipeline steps in-process, scoped + # by run_labels and a primary-key filter on the request id (spec §18). + filters: Dict[str, List[Any]] = {requests_spec.id_column: [request_id]} + result = self.run_steps(request_id, list(requests_spec.run_labels), filters) + return LaunchInfo( + started=bool(result.get("started", False)), + run_id=result.get("run_id"), + ) + + def launch_training_request(self, spec_id: str, request_id: str) -> LaunchResponse: + """Launch the pipeline for a single training request (spec §18).""" + requests_spec = self._requests_spec(spec_id) + df_req = self._read_df(requests_spec.table) + if df_req.empty or requests_spec.id_column not in df_req.columns: + raise self._request_not_found(request_id) + match = df_req[df_req[requests_spec.id_column].astype(str) == str(request_id)] + if match.empty: + raise self._request_not_found(request_id) + + launch_info = self._launch(requests_spec, request_id) + return LaunchResponse( + training_request_id=request_id, + started=launch_info.started, + run_id=launch_info.run_id, + ) + + def delete_training_request(self, spec_id: str, request_id: str) -> None: + """Delete a manual request that has not been launched or trained yet.""" + requests_spec = self._requests_spec(spec_id) + spec = self._spec(spec_id) + df_req = self._read_df(requests_spec.table) + if df_req.empty or requests_spec.id_column not in df_req.columns: + raise self._request_not_found(request_id) + match = df_req[df_req[requests_spec.id_column].astype(str) == str(request_id)] + if match.empty: + raise self._request_not_found(request_id) + + row = match.iloc[0] + kind = _clean_str(row.get(requests_spec.kind_column)) or "manual" + status = self._status_by_request_id(spec, requests_spec).get(request_id) + run_key = status.get("run_key") if status else None + model_id = status.get("model_id") if status else None + status_value = status.get("status") if status else None + started_at = status.get("started_at") if status else None + if not _request_can_delete( + kind=kind, + run_key=run_key, + model_id=model_id, + status=status_value, + started_at=started_at, + ): + raise TrainingExperimentError( + "request_not_deletable", + "Only manual training requests that have not been launched or " + "trained can be deleted.", + status_code=409, + details={ + "kind": kind, + "run_key": run_key, + "model_id": model_id, + "status": status_value, + "started_at": started_at, + }, + ) + self._delete_id(requests_spec.table, requests_spec.id_column, request_id) + + def _request_not_found(self, request_id: str) -> TrainingExperimentError: + return TrainingExperimentError( + "not_found", + f'Training request "{request_id}" was not found.', + status_code=404, + ) + + +__all__ = [ + "TrainingExperimentsService", + "RunStepsCallable", + "build_capabilities", +] diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/py.typed b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/viz/__init__.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/viz/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/viz/image_visualization.py b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/viz/image_visualization.py new file mode 100644 index 000000000..5a85110d5 --- /dev/null +++ b/libs/datapipe-app-ml-ops/datapipe_app_ml_ops/viz/image_visualization.py @@ -0,0 +1,240 @@ +from __future__ import annotations + +import io +from collections.abc import Sequence +from typing import Any, Literal + +import httpx +import numpy as np +from PIL import Image + +OverlayMode = Literal["record", "gt", "prediction", "both", "plain"] + + +def _as_aligned_list(value: Any, *, length: int, default: Any) -> list[Any]: + """Align a per-bbox field to ``length``, accepting scalar classification values.""" + if value is None: + return [default] * length + if isinstance(value, (str, bytes)) or not isinstance(value, Sequence): + if length <= 0: + return [] + return [value] + [default] * (length - 1) + values = list(value) + if len(values) != length: + values = (values + [default] * length)[:length] + return values + + +def iter_bbox_fields_from_record( + record: dict[str, Any], + *, + scores_column: str | None = None, +) -> list[tuple[Any, Any | None, Any, Any, Any, Any]]: + bboxes = record.get("bboxes") or [] + if not isinstance(bboxes, Sequence) or isinstance(bboxes, (str, bytes)): + bboxes = [] + scores_key = scores_column or "prediction__detection_scores" + labels = _as_aligned_list(record.get("labels"), length=len(bboxes), default=None) + scores = _as_aligned_list(record.get(scores_key), length=len(bboxes), default=None) + return [ + (label, score, xmin, ymin, xmax, ymax) + for (xmin, ymin, xmax, ymax), label, score in zip(bboxes, labels, scores) + ] + + +def _cv_pipeliner(): + from cv_pipeliner import ( + ImageData, + ImageDataMatching, + visualize_image_data, + visualize_image_data_matching_side_by_side, + ) + from cv_pipeliner.core.data import BboxData + + return ImageData, visualize_image_data, BboxData, ImageDataMatching, visualize_image_data_matching_side_by_side + + +def _aligned_per_bbox_field(record: dict[str, Any], field: str, *, length: int, default: Any) -> list[Any]: + return _as_aligned_list(record.get(field), length=length, default=default) + + +def bboxes_data_from_record(record: dict[str, Any], *, scores_column: str | None = None) -> list[Any]: + _, _, BboxData, _, _ = _cv_pipeliner() + bboxes = record.get("bboxes") or [] + if not bboxes: + return [] + + labels = _aligned_per_bbox_field(record, "labels", length=len(bboxes), default=None) + scores_key = scores_column or "prediction__detection_scores" + scores = _aligned_per_bbox_field(record, scores_key, length=len(bboxes), default=None) + keypoints = _aligned_per_bbox_field(record, "keypoints", length=len(bboxes), default=[]) + masks = _aligned_per_bbox_field(record, "masks", length=len(bboxes), default=[]) + keypoints_scores = _aligned_per_bbox_field( + record, + "prediction__keypoints_scores", + length=len(bboxes), + default=None, + ) + keypoints_visibility = _aligned_per_bbox_field( + record, + "keypoints_visibility", + length=len(bboxes), + default=None, + ) + + result: list[Any] = [] + for ( + (xmin, ymin, xmax, ymax), + label, + score, + bbox_keypoints, + mask, + bbox_keypoints_scores, + bbox_keypoints_visibility, + ) in zip( + bboxes, + labels, + scores, + keypoints, + masks, + keypoints_scores, + keypoints_visibility, + ): + result.append( + BboxData( + xmin=xmin, + ymin=ymin, + xmax=xmax, + ymax=ymax, + label=label, + keypoints=bbox_keypoints, + keypoints_visibility=bbox_keypoints_visibility, + keypoints_scores=bbox_keypoints_scores, + mask=mask, + detection_score=score, + ) + ) + return result + + +def record_to_image_data( + record: dict[str, Any] | None, + *, + image_url: str | None, + scores_column: str | None = None, +) -> Any | None: + ImageData, _, _, _, _ = _cv_pipeliner() + if image_url is None: + return None + bboxes_data = bboxes_data_from_record(record or {}, scores_column=scores_column) if record else [] + return ImageData(image_path=image_url, bboxes_data=bboxes_data) + + +def load_image_bytes(image_url: str) -> bytes: + if image_url.startswith(("http://", "https://")): + response = httpx.get(image_url, timeout=30.0, follow_redirects=True) + response.raise_for_status() + return response.content + with open(image_url, "rb") as handle: + return handle.read() + + +def _resize_numpy_image(image: np.ndarray, max_side: int | None) -> np.ndarray: + if max_side is None: + return image + height, width = image.shape[:2] + longest = max(height, width) + if longest <= max_side: + return image + scale = max_side / float(longest) + new_size = (max(int(width * scale), 1), max(int(height * scale), 1)) + pil_image = Image.fromarray(image) + return np.asarray(pil_image.resize(new_size, Image.Resampling.LANCZOS)) + + +def _numpy_to_png_bytes(image: np.ndarray) -> tuple[bytes, str]: + if image.dtype != np.uint8: + image = image.astype(np.uint8) + if image.ndim == 2: + pil_image = Image.fromarray(image, mode="L") + else: + pil_image = Image.fromarray(image) + buffer = io.BytesIO() + pil_image.save(buffer, format="PNG") + return buffer.getvalue(), "image/png" + + +def render_visualization_bytes( + *, + image_url: str, + record: dict[str, Any] | None = None, + gt_record: dict[str, Any] | None = None, + prediction_record: dict[str, Any] | None = None, + overlay: OverlayMode = "record", + scores_column: str | None = None, + annotations: bool = True, + max_side: int | None = None, +) -> tuple[bytes, str]: + if overlay == "plain" or not annotations: + image = Image.open(io.BytesIO(load_image_bytes(image_url))).convert("RGB") + if max_side is not None: + image.thumbnail((max_side, max_side), Image.Resampling.LANCZOS) + buffer = io.BytesIO() + image.save(buffer, format="PNG") + return buffer.getvalue(), "image/png" + + ImageData, visualize_image_data, _, ImageDataMatching, visualize_image_data_matching_side_by_side = _cv_pipeliner() + + if overlay == "both": + gt_image_data = record_to_image_data(gt_record, image_url=image_url, scores_column=scores_column) + pred_image_data = record_to_image_data(prediction_record, image_url=image_url, scores_column=scores_column) + if gt_image_data is None or pred_image_data is None: + raise ValueError("GT and prediction records are required for overlay=both") + matching = ImageDataMatching( + true_image_data=gt_image_data, + pred_image_data=pred_image_data, + minimum_iou=0.5, + ) + rendered = visualize_image_data_matching_side_by_side( + image_data_matching=matching, + error_type="detection", + include_additional_bboxes_data=True, + true_include_labels=True, + pred_include_labels=True, + true_include_keypoints=True, + pred_include_keypoints=True, + true_include_keypoint_scores=False, + pred_include_keypoint_scores=True, + true_include_mask=True, + pred_include_mask=True, + mask_alpha=0.5, + fontsize=24, + thickness=2, + keypoints_radius=2, + ) + return _numpy_to_png_bytes(_resize_numpy_image(rendered, max_side)) + + source_record = record + if overlay == "gt": + source_record = gt_record + elif overlay == "prediction": + source_record = prediction_record + elif overlay == "record": + source_record = record + + image_data = record_to_image_data(source_record, image_url=image_url, scores_column=scores_column) + if image_data is None: + raise ValueError("image_url is required for visualization") + rendered = visualize_image_data( + image_data, + include_additional_bboxes_data=True, + include_labels=True, + include_keypoints=True, + include_keypoint_scores=True, + include_mask=True, + keypoints_radius=2, + mask_alpha=0.5, + fontsize=24, + thickness=2, + ) + return _numpy_to_png_bytes(_resize_numpy_image(rendered, max_side)) diff --git a/libs/datapipe-app-ml-ops/pyproject.toml b/libs/datapipe-app-ml-ops/pyproject.toml new file mode 100644 index 000000000..67126dd80 --- /dev/null +++ b/libs/datapipe-app-ml-ops/pyproject.toml @@ -0,0 +1,53 @@ +[project] +name = "datapipe-app-ml-ops" +version = "0.1.0" +description = "ML ops specs, image records, and observability routes for datapipe-app" +authors = [{ name = "Aleksandr Kozlov", email = "bobokvsky@epoch8.co" }] +readme = "README.md" +requires-python = ">=3.10,<3.13" +dependencies = [ + "datapipe-app", + "datapipe-ml", + "httpx", + "cv-pipeliner @ git+https://github.com/epoch8/cv-pipeliner@0.22.3", +] + +[project.entry-points."datapipe.observability"] +datapipe_app_ml_ops = "datapipe_app_ml_ops.observability.plugin:register" + +[project.entry-points."datapipe.observability_db"] +datapipe_app_ml_ops = "datapipe_app_ml_ops.observability.db_plugin:extend_observability_db" + +[project.entry-points."datapipe.v1alpha3_extensions"] +datapipe_app_ml_ops = "datapipe_app_ml_ops.observability.api_plugin:register_v1alpha3_extension" + +[project.urls] +Repository = "https://github.com/epoch8/datapipe" + +[dependency-groups] +dev = [ + "pytest<8", + "mypy", + "datapipe-ml[sqlite]", +] + +[tool.hatch.build.targets.sdist] +include = ["datapipe_app_ml_ops", "datapipe_app_ml_ops/py.typed"] + +[tool.hatch.build.targets.wheel] +include = ["datapipe_app_ml_ops", "datapipe_app_ml_ops/py.typed"] + +[tool.uv.sources] +datapipe-app = { workspace = true } +datapipe-ml = { workspace = true } +cv-pipeliner = { git = "https://github.com/epoch8/cv-pipeliner", tag = "0.22.3" } + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.pytest.ini_options] +testpaths = ["tests"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/libs/datapipe-app-ml-ops/tests/conftest.py b/libs/datapipe-app-ml-ops/tests/conftest.py new file mode 100644 index 000000000..7fd690e91 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/conftest.py @@ -0,0 +1,73 @@ +import tempfile + +import pandas as pd +import pytest +from datapipe.compute import Catalog, DataStore, Pipeline, Table +from datapipe.step.batch_transform import BatchTransform +from datapipe.store.database import DBConn, TableStoreDB +from fastapi.testclient import TestClient +from sqlalchemy import Column, Integer, String + +from datapipe_app import DatapipeAPI + + +@pytest.fixture +def agent_env(monkeypatch): + monkeypatch.delenv("DATAPIPE_APP_PIPELINE_ID", raising=False) + + +@pytest.fixture +def ops_app(agent_env): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + + def transform(df: pd.DataFrame) -> pd.DataFrame: + return df.assign(v=df["v"].astype(str) + "_x") + + catalog = Catalog( + { + "input": Table( + store=TableStoreDB( + name="input", + dbconn=dbconn, + data_sql_schema=[ + Column("id", Integer(), primary_key=True), + Column("v", String()), + ], + create_table=True, + ) + ), + "output": Table( + store=TableStoreDB( + name="output", + dbconn=dbconn, + data_sql_schema=[ + Column("id", Integer(), primary_key=True), + Column("v", String()), + ], + create_table=True, + ) + ), + } + ) + + pipeline = Pipeline( + [ + BatchTransform( + transform, + inputs=["input"], + outputs=["output"], + labels=[("stage", "process")], + ), + ] + ) + ds = DataStore(dbconn, create_meta_table=True) + input_dt = catalog.get_datatable(ds, "input") + catalog.get_datatable(ds, "output") + input_dt.store_chunk(pd.DataFrame([{"id": 1, "v": "a"}, {"id": 2, "v": "b"}])) + yield DatapipeAPI(ds, catalog, pipeline, pipeline_id="test_pipeline") + + +@pytest.fixture +def ops_client(ops_app): + return TestClient(ops_app) diff --git a/libs/datapipe-app-ml-ops/tests/ops/conftest.py b/libs/datapipe-app-ml-ops/tests/ops/conftest.py new file mode 100644 index 000000000..3fda79750 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/conftest.py @@ -0,0 +1,379 @@ +from __future__ import annotations + +import tempfile +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Sequence, Tuple + +import pandas as pd +import pytest +from datapipe.compute import Catalog, Table +from datapipe.datatable import DataStore +from datapipe.store.database import DBConn, TableStoreDB +from sqlalchemy import JSON, Boolean, Column, Integer, String + +from datapipe_app_ml_ops.ops.ops_specs import ( + DatapipeOpsSpec, + OpsColumn, + OpsDataSpec, + OpsFrozenDatasetSpec, + OpsModelSpec, + OpsTrainConfigRegistrySpec, + OpsTrainingRequestSpec, + OpsTrainingSpec, +) +from datapipe_app.ops.specs import OpsRelationSpec +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_ml.training import config_codec + +REGISTRY_TABLE = "custom_train_config" +DEFAULT_REGISTRY_TABLE = "default_train_config" +REQUESTS_TABLE = "training_request" +FROZEN_TABLE = "frozen_dataset" +STATUS_TABLE = "training_status" +LINK_TABLE = "model_is_trained_on_frozen_dataset" + +SPEC_ID = "detection" + +# The real yolov8 codec pulls the optional torch/ultralytics extra, which is not +# installed in CI. Register a lightweight stand-in with the same public contract +# when the real codec is unavailable so codec-dependent paths can be tested. +_YOLO_FIELDS = { + "model", + "imgsz", + "batch", + "epochs", + "optimizer", + "lr0", + "weight_decay", + "seed", + "patience", +} + + +class _StubYoloV8Codec: + config_type = "yolov8_detection" + + def validate(self, params): + errors = [ + {"field": key, "message": f"Unknown field: {key!r}"} + for key in params + if key not in _YOLO_FIELDS + ] + if errors: + raise config_codec.TrainConfigValidationError( + "Invalid train config parameters", errors=errors + ) + return dict(params) + + def normalize(self, params): + return self.validate(params) + + def json_schema(self): + return {"type": "object", "properties": {f: {"type": "string"} for f in _YOLO_FIELDS}} + + def summarize(self, params): + return {"display": f"{params.get('model')} · {params.get('epochs')} epochs"} + + +def _ensure_yolo_codec() -> None: + try: + config_codec.get_train_config_codec("yolov8_detection") + except ValueError: + config_codec.register_train_config_codec(_StubYoloV8Codec()) + + +_ensure_yolo_codec() + + +class RunStepsSpy: + """Mock ``run_steps`` callable that records its arguments (spec §35).""" + + def __init__(self, result: Optional[Dict[str, Any]] = None) -> None: + self.calls: List[Tuple[str, Sequence[Tuple[str, str]], Dict[str, List[Any]]]] = [] + self.result = result or {"started": True, "run_id": "run-123"} + + def __call__( + self, + request_id: str, + run_labels: Sequence[Tuple[str, str]], + filters: Dict[str, List[Any]], + ) -> Dict[str, Any]: + self.calls.append((request_id, list(run_labels), dict(filters))) + return self.result + + +@dataclass +class Env: + ds: DataStore + catalog: Catalog + registry: OpsSpecRegistry + run_steps: RunStepsSpy + spec_id: str = SPEC_ID + + def write(self, table: str, rows: List[Dict[str, Any]]) -> None: + dt = self.catalog.get_datatable(self.ds, table) + dt.store_chunk(pd.DataFrame(rows)) + + def read(self, table: str) -> pd.DataFrame: + return self.catalog.get_datatable(self.ds, table).get_data() + + def write_builtin_config( + self, + config_id: str = "builtin-1", + *, + display_name: str = "Standard", + params: Optional[Dict[str, Any]] = None, + active: bool = True, + ) -> str: + # Built-ins live in default_table (no is_active / source / timestamps). + _ = active + self.write( + DEFAULT_REGISTRY_TABLE, + [ + { + "train_config_id": config_id, + "train_config__params": params or {"model": "yolov8n.pt", "epochs": 5}, + "train_config__display_name": display_name, + "train_config__description": None, + "train_config__config_type": "yolov8_detection", + "train_config__config_hash": "builtinhash", + "train_config__revision": 1, + } + ], + ) + return config_id + + def write_frozen_dataset(self, frozen_dataset_id: str = "fd-1") -> str: + self.write( + FROZEN_TABLE, + [ + { + "frozen_dataset_id": frozen_dataset_id, + "frozen_dataset__created_at": "2026-01-01T00:00:00+00:00", + } + ], + ) + return frozen_dataset_id + + +def _build_catalog(dbconn: DBConn) -> Catalog: + return Catalog( + { + DEFAULT_REGISTRY_TABLE: Table( + TableStoreDB( + name=DEFAULT_REGISTRY_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("train_config_id", String(), primary_key=True), + Column("train_config__params", JSON()), + Column("train_config__display_name", String()), + Column("train_config__description", String()), + Column("train_config__config_type", String()), + Column("train_config__config_hash", String()), + Column("train_config__revision", Integer()), + ], + create_table=True, + ) + ), + REGISTRY_TABLE: Table( + TableStoreDB( + name=REGISTRY_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("train_config_id", String(), primary_key=True), + Column("train_config__params", JSON()), + Column("train_config__display_name", String()), + Column("train_config__description", String()), + Column("train_config__config_type", String()), + Column("train_config__config_hash", String()), + Column("train_config__is_active", Boolean()), + Column("train_config__revision", Integer()), + Column("train_config__created_at", String()), + Column("train_config__updated_at", String()), + ], + create_table=True, + ) + ), + REQUESTS_TABLE: Table( + TableStoreDB( + name=REQUESTS_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("training_request_id", String(), primary_key=True), + Column("train_config_id", String()), + Column("frozen_dataset_id", String()), + Column("training_request__kind", String()), + Column("training_request__enabled", Boolean()), + Column("training_request__force", Boolean()), + Column("training_request__max_within_time", String()), + Column("training_request__config_source", String()), + Column("training_request__config_name_snapshot", String()), + Column("training_request__config_params_snapshot", JSON()), + Column("training_request__config_hash", String()), + Column("training_request__requested_at", String()), + Column("training_request__requested_by", String()), + Column("training_request__client_request_id", String()), + ], + create_table=True, + ) + ), + FROZEN_TABLE: Table( + TableStoreDB( + name=FROZEN_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("frozen_dataset_id", String(), primary_key=True), + Column("frozen_dataset__created_at", String()), + ], + create_table=True, + ) + ), + STATUS_TABLE: Table( + TableStoreDB( + name=STATUS_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("run_key", String(), primary_key=True), + Column("training_request_id", String()), + ], + create_table=True, + ) + ), + LINK_TABLE: Table( + TableStoreDB( + name=LINK_TABLE, + dbconn=dbconn, + data_sql_schema=[ + Column("model_id", String(), primary_key=True), + Column("frozen_dataset_id", String(), primary_key=True), + Column("train_config_id", String()), + Column("created_at", String()), + ], + create_table=True, + ) + ), + } + ) + + +def _build_spec() -> DatapipeOpsSpec: + return DatapipeOpsSpec( + id=SPEC_ID, + title="Detection", + description="Detection training experiments", + data=OpsDataSpec( + tables=[ + DEFAULT_REGISTRY_TABLE, + REGISTRY_TABLE, + REQUESTS_TABLE, + FROZEN_TABLE, + STATUS_TABLE, + LINK_TABLE, + ] + ), + frozen_dataset=OpsFrozenDatasetSpec( + table=FROZEN_TABLE, + id_column="frozen_dataset_id", + created_at_column="frozen_dataset__created_at", + display_name_column=None, + columns=[OpsColumn("frozen_dataset_id", "Dataset", "frozen_dataset_id")], + models_count_relation_id="model_trained_on_frozen_dataset", + ), + model=OpsModelSpec( + table=LINK_TABLE, + id_column="model_id", + ), + relations=[ + OpsRelationSpec( + id="model_trained_on_frozen_dataset", + table=LINK_TABLE, + from_entity="model", + from_column="model_id", + to_entity="frozen_dataset", + to_column="frozen_dataset_id", + ) + ], + training=OpsTrainingSpec( + status_table=STATUS_TABLE, + columns=[OpsColumn("run_key", "Run", "run_key")], + experiments=OpsTrainConfigRegistrySpec( + table=REGISTRY_TABLE, + default_table=DEFAULT_REGISTRY_TABLE, + id_column="train_config_id", + params_column="train_config__params", + config_type="yolov8_detection", + ), + requests=OpsTrainingRequestSpec( + table=REQUESTS_TABLE, + id_column="training_request_id", + train_config_id_column="train_config_id", + frozen_dataset_id_column="frozen_dataset_id", + run_labels=[("stage", "train")], + status_table=STATUS_TABLE, + status_request_id_column="training_request_id", + ), + ), + ) + + +@pytest.fixture +def env(): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + ds = DataStore(dbconn, create_meta_table=True) + catalog = _build_catalog(dbconn) + # Materialize datatables / meta. + for name in ( + DEFAULT_REGISTRY_TABLE, + REGISTRY_TABLE, + REQUESTS_TABLE, + FROZEN_TABLE, + STATUS_TABLE, + LINK_TABLE, + ): + catalog.get_datatable(ds, name) + registry = OpsSpecRegistry() + registry.add_many([_build_spec()]) + yield Env(ds=ds, catalog=catalog, registry=registry, run_steps=RunStepsSpy()) + + +@dataclass +class FullApiEnv: + api: Any + ds: DataStore + catalog: Catalog + client: Any + spec_id: str = SPEC_ID + + def write(self, table: str, rows: List[Dict[str, Any]]) -> None: + self.catalog.get_datatable(self.ds, table).store_chunk(pd.DataFrame(rows)) + + +@pytest.fixture +def full_api_env(agent_env): + """A real ``DatapipeAPI`` with the training spec registered end-to-end. + + Exercises the v1alpha3 entry-point extension wiring (spec §20), including + passing the real ``run_steps`` callable. + """ + from fastapi.testclient import TestClient + + from datapipe.compute import Pipeline + from datapipe_app import DatapipeAPI + + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + ds = DataStore(dbconn, create_meta_table=True) + catalog = _build_catalog(dbconn) + for name in ( + DEFAULT_REGISTRY_TABLE, + REGISTRY_TABLE, + REQUESTS_TABLE, + FROZEN_TABLE, + STATUS_TABLE, + LINK_TABLE, + ): + catalog.get_datatable(ds, name) + api = DatapipeAPI(ds, catalog, Pipeline([]), pipeline_id="test_pipeline") + api.add_specs([_build_spec()]) + yield FullApiEnv(api=api, ds=ds, catalog=catalog, client=TestClient(api)) diff --git a/libs/datapipe-app-ml-ops/tests/ops/test_frozen_datasets_launch.py b/libs/datapipe-app-ml-ops/tests/ops/test_frozen_datasets_launch.py new file mode 100644 index 000000000..a191eeeb8 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/test_frozen_datasets_launch.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +from dataclasses import replace + +import pytest + +from datapipe_app_ml_ops.ops.frozen_datasets_launch_service import FrozenDatasetsLaunchService +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry +from datapipe_app_ml_ops.ops.training_experiments_models import TrainingExperimentError + + +def test_launch_freeze_uses_run_labels(env): + svc = FrozenDatasetsLaunchService(env.registry, run_steps=env.run_steps) + # Default conftest frozen_dataset has no run_labels → configure them. + spec = env.registry.get(env.spec_id) + assert spec.frozen_dataset is not None + configured = replace(spec.frozen_dataset, run_labels=[("stage", "train-prepare")]) + registry = OpsSpecRegistry() + registry.add_many([replace(spec, frozen_dataset=configured)]) + svc = FrozenDatasetsLaunchService(registry, run_steps=env.run_steps) + + resp = svc.launch_freeze(env.spec_id) + assert resp.started is True + assert resp.run_id == "run-123" + assert len(env.run_steps.calls) == 1 + request_id, run_labels, filters = env.run_steps.calls[0] + assert request_id == "freeze" + assert run_labels == [("stage", "train-prepare")] + assert filters == {} + + +def test_launch_freeze_rejected_when_run_labels_empty(env): + svc = FrozenDatasetsLaunchService(env.registry, run_steps=env.run_steps) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.launch_freeze(env.spec_id) + assert excinfo.value.code == "freeze_launch_not_configured" + assert excinfo.value.status_code == 400 + assert len(env.run_steps.calls) == 0 + + +def test_launch_freeze_requires_run_steps(env): + spec = env.registry.get(env.spec_id) + assert spec.frozen_dataset is not None + configured = replace(spec.frozen_dataset, run_labels=[("stage", "train-prepare")]) + registry = OpsSpecRegistry() + registry.add_many([replace(spec, frozen_dataset=configured)]) + svc = FrozenDatasetsLaunchService(registry, run_steps=None) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.launch_freeze(env.spec_id) + assert excinfo.value.code == "freeze_launch_failed" + assert excinfo.value.status_code == 503 diff --git a/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_e2e_scenarios.py b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_e2e_scenarios.py new file mode 100644 index 000000000..a54fbc442 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_e2e_scenarios.py @@ -0,0 +1,159 @@ +"""API-level e2e scenarios for Custom Training Experiments (spec §38).""" + +from __future__ import annotations + +import uuid + +import pytest + +from datapipe_app_ml_ops.ops.training_experiments_models import ( + CreateTrainingExperimentRequest, + CreateTrainingRequestRequest, + DuplicateTrainingExperimentRequest, + TrainingExperimentError, + UpdateTrainingExperimentRequest, +) +from datapipe_app_ml_ops.ops.training_experiments_service import TrainingExperimentsService + + +def _svc(env) -> TrainingExperimentsService: + return TrainingExperimentsService( + env.registry, ds=env.ds, catalog=env.catalog, run_steps=env.run_steps + ) + + +def test_scenario_crud_before_launch(env): + """§38 scenario 1: create → edit → delete unused custom experiment.""" + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest( + display_name="Large image test", + description="Detection on high-resolution images", + params={"model": "yolov8m.pt", "imgsz": 1280, "batch": 4, "epochs": 50}, + ), + ).experiment + assert exp.capabilities.can_edit is True + assert exp.source == "custom" + + updated = svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest( + display_name="Large image test", + description="Detection on high-resolution images", + params={"model": "yolov8m.pt", "imgsz": 1280, "batch": 4, "epochs": 60}, + expected_revision=exp.revision, + ), + ).experiment + assert updated.revision == exp.revision + 1 + assert updated.params["epochs"] == 60 + + svc.delete_experiment(env.spec_id, updated.id) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.get_experiment(env.spec_id, updated.id) + assert excinfo.value.code == "experiment_not_found" + assert excinfo.value.status_code == 404 + + +def test_scenario_lock_after_request(env): + """§38 scenario 2: request locks custom experiment.""" + svc = _svc(env) + dataset_id = env.write_frozen_dataset("fd-lock") + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest( + display_name="Lock me", + params={"model": "yolov8s.pt", "imgsz": 640, "batch": 8, "epochs": 10}, + ), + ).experiment + + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id=dataset_id, + train_config_id=exp.id, + client_request_id=str(uuid.uuid4()), + launch=False, + ), + ) + + locked = svc.get_experiment(env.spec_id, exp.id).experiment + assert locked.capabilities.can_edit is False + assert locked.capabilities.can_delete is False + assert locked.capabilities.lock_reason is not None + + with pytest.raises(TrainingExperimentError) as excinfo: + svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest( + display_name="Nope", + params={"model": "yolov8s.pt", "imgsz": 640, "batch": 8, "epochs": 99}, + expected_revision=locked.revision, + ), + ) + assert excinfo.value.code == "experiment_locked" + assert excinfo.value.status_code == 409 + + +def test_scenario_duplicate_builtin(env): + """§38 scenario 3: duplicate built-in → editable custom.""" + svc = _svc(env) + builtin_id = env.write_builtin_config("builtin-std", display_name="Standard YOLOv8s 640") + dup = svc.duplicate_experiment( + env.spec_id, + builtin_id, + DuplicateTrainingExperimentRequest(), + ).experiment + assert dup.source == "custom" + assert dup.id.startswith("custom_") + assert dup.capabilities.can_edit is True + assert dup.display_name.startswith("Standard") or "copy" in dup.display_name.lower() + + +def test_scenario_snapshot_immutable(env): + """§38 scenario 4: request snapshot stays fixed after lock.""" + svc = _svc(env) + dataset_id = env.write_frozen_dataset("fd-snap") + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest( + display_name="Snap", + params={"model": "yolov8s.pt", "imgsz": 640, "batch": 4, "epochs": 10}, + ), + ).experiment + + req_resp = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id=dataset_id, + train_config_id=exp.id, + client_request_id=str(uuid.uuid4()), + launch=False, + ), + ) + request = req_resp.request + snapshot = getattr(request, "config_params_snapshot", None) + if snapshot is None: + # Normative response may omit full snapshot; read from table. + df = env.read("training_request") + row = df[df["training_request_id"] == request.id].iloc[0] + snapshot = row["training_request__config_params_snapshot"] + assert snapshot["epochs"] == 10 + + with pytest.raises(TrainingExperimentError) as excinfo: + svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest( + display_name="Snap", + params={"model": "yolov8s.pt", "imgsz": 640, "batch": 4, "epochs": 99}, + expected_revision=exp.revision, + ), + ) + assert excinfo.value.code == "experiment_locked" + + df = env.read("training_request") + row = df[df["training_request_id"] == request.id].iloc[0] + assert row["training_request__config_params_snapshot"]["epochs"] == 10 diff --git a/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_routes.py b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_routes.py new file mode 100644 index 000000000..9f03083d9 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_routes.py @@ -0,0 +1,224 @@ +from __future__ import annotations + +import pytest +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from datapipe_app_ml_ops.ops.training_experiments_routes import ( + register_training_experiments_routes, +) + +BASE = "/pipelines/detection/ops-specs/detection/training" +API_BASE = "/api/v1alpha3" + BASE + + +@pytest.fixture +def client(env): + app = FastAPI() + register_training_experiments_routes( + app, + registry=env.registry, + ds=env.ds, + catalog=env.catalog, + run_steps=env.run_steps, + ) + return TestClient(app) + + +def test_list_experiments_route_empty(client): + res = client.get(f"{BASE}/experiments") + assert res.status_code == 200 + payload = res.json() + assert payload["total"] == 0 + assert payload["rows"] == [] + + +def test_create_and_get_experiment_route(client): + res = client.post( + f"{BASE}/experiments", + json={"display_name": "R1", "params": {"model": "yolov8m.pt", "epochs": 12}}, + ) + assert res.status_code == 201, res.text + exp = res.json()["experiment"] + assert exp["source"] == "custom" + assert exp["display_name"] == "R1" + assert exp["active"] is True + assert exp["archived"] is False + + got = client.get(f"{BASE}/experiments/{exp['id']}") + assert got.status_code == 200 + assert got.json()["experiment"]["id"] == exp["id"] + + +def test_get_experiment_404_error_envelope(client): + res = client.get(f"{BASE}/experiments/nope") + assert res.status_code == 404 + body = res.json() + assert body["error"]["code"] == "experiment_not_found" + assert "message" in body["error"] + assert "details" in body["error"] + + +def test_create_experiment_validation_error(client): + res = client.post( + f"{BASE}/experiments", json={"display_name": "Bad", "params": {"bogus": 1}} + ) + assert res.status_code == 422 + assert res.json()["error"]["code"] == "train_config_validation_failed" + + +def test_config_schema_route(client): + res = client.get(f"{BASE}/config-schema") + assert res.status_code == 200 + payload = res.json() + assert payload["config_type"] == "yolov8_detection" + assert "properties" in payload["json_schema"] + + +def test_delete_experiment_route(client): + created = client.post( + f"{BASE}/experiments", json={"display_name": "D1", "params": {"epochs": 3}} + ).json() + config_id = created["experiment"]["id"] + res = client.delete(f"{BASE}/experiments/{config_id}") + assert res.status_code == 200 + assert client.get(f"{BASE}/experiments").json()["total"] == 0 + + +def test_archive_route(client): + created = client.post( + f"{BASE}/experiments", json={"display_name": "A1", "params": {"epochs": 3}} + ).json() + config_id = created["experiment"]["id"] + res = client.post(f"{BASE}/experiments/{config_id}/archive") + assert res.status_code == 200 + exp = res.json()["experiment"] + assert exp["active"] is False + assert exp["archived"] is True + + +def test_update_locked_experiment_returns_409(env, client): + env.write_frozen_dataset("fd-1") + created = client.post( + f"{BASE}/experiments", json={"display_name": "L1", "params": {"epochs": 3}} + ).json() + config_id = created["experiment"]["id"] + client.post( + f"{BASE}/requests", + json={ + "frozen_dataset_id": "fd-1", + "train_config_id": config_id, + "client_request_id": "cli-lock", + "launch": False, + }, + ) + res = client.patch( + f"{BASE}/experiments/{config_id}", + json={"display_name": "New", "params": {"epochs": 3}, "expected_revision": 1}, + ) + assert res.status_code == 409 + assert res.json()["error"]["code"] == "experiment_locked" + + +def test_create_request_route_with_train_config_id_in_body(env, client): + env.write_frozen_dataset("fd-1") + created = client.post( + f"{BASE}/experiments", json={"display_name": "R1", "params": {"epochs": 3}} + ).json() + config_id = created["experiment"]["id"] + res = client.post( + f"{BASE}/requests", + json={ + "frozen_dataset_id": "fd-1", + "train_config_id": config_id, + "client_request_id": "cli-req-1", + "launch": True, + }, + ) + assert res.status_code == 201, res.text + body = res.json() + assert body["request"]["train_config_id"] == config_id + assert body["launch"]["started"] is True + assert body["launch"]["run_id"] == "run-123" + + listed = client.get(f"{BASE}/requests") + assert listed.status_code == 200, listed.text + payload = listed.json() + assert payload["total"] >= 1 + match = next(row for row in payload["rows"] if row["id"] == body["request"]["id"]) + assert match["train_config_id"] == config_id + assert match["frozen_dataset_id"] == "fd-1" + assert match["can_delete"] is True + assert match["can_launch"] is True + + deleted = client.delete(f"{BASE}/requests/{body['request']['id']}") + assert deleted.status_code == 200, deleted.text + assert deleted.json()["deleted"] == body["request"]["id"] + after = client.get(f"{BASE}/requests").json() + assert all(row["id"] != body["request"]["id"] for row in after["rows"]) + + +def test_launch_route_invokes_run_steps(env, client): + env.write_frozen_dataset("fd-1") + created = client.post( + f"{BASE}/experiments", json={"display_name": "L1", "params": {"epochs": 3}} + ).json() + config_id = created["experiment"]["id"] + req = client.post( + f"{BASE}/requests", + json={ + "frozen_dataset_id": "fd-1", + "train_config_id": config_id, + "client_request_id": "cli-launch-1", + "launch": False, + }, + ).json()["request"] + + res = client.post(f"{BASE}/requests/{req['id']}/launch") + assert res.status_code == 200 + payload = res.json() + assert payload["started"] is True + assert payload["run_id"] == "run-123" + + assert len(env.run_steps.calls) == 1 + _, _, filters = env.run_steps.calls[0] + assert filters["training_request_id"] == [req["id"]] + + +def test_routes_mounted_through_datapipe_api(full_api_env): + """Full-stack wiring (spec §20): routes are reachable through the v1alpha3 + entry-point extension and ``run_steps`` is passed without error.""" + client = full_api_env.client + + res = client.get(f"{API_BASE}/experiments") + assert res.status_code == 200, res.text + assert res.json()["total"] == 0 + + created = client.post( + f"{API_BASE}/experiments", json={"display_name": "F1", "params": {"epochs": 4}} + ) + assert created.status_code == 201, created.text + config_id = created.json()["experiment"]["id"] + + full_api_env.write( + "frozen_dataset", + [{"frozen_dataset_id": "fd-1", "frozen_dataset__created_at": "2026-01-01"}], + ) + req = client.post( + f"{API_BASE}/requests", + json={ + "frozen_dataset_id": "fd-1", + "train_config_id": config_id, + "client_request_id": "cli-full-1", + "launch": False, + }, + ) + assert req.status_code == 201, req.text + request_id = req.json()["request"]["id"] + + # No pipeline step carries the run_labels, so the real run_steps callable is + # a no-op, but the route must still be wired and return 200. + launched = client.post(f"{API_BASE}/requests/{request_id}/launch") + assert launched.status_code == 200, launched.text + assert launched.json()["training_request_id"] == request_id + assert launched.json()["started"] is False diff --git a/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_service.py b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_service.py new file mode 100644 index 000000000..320c7a795 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/test_training_experiments_service.py @@ -0,0 +1,378 @@ +from __future__ import annotations + +import pytest + +from datapipe_app_ml_ops.ops.training_experiments_models import ( + CreateTrainingExperimentRequest, + DuplicateTrainingExperimentRequest, + TrainingExperimentError, + UpdateTrainingExperimentRequest, +) +from datapipe_app_ml_ops.ops.training_experiments_service import ( + TrainingExperimentsService, + build_capabilities, +) + + +def _svc(env) -> TrainingExperimentsService: + return TrainingExperimentsService( + env.registry, ds=env.ds, catalog=env.catalog, run_steps=env.run_steps + ) + + +def test_build_capabilities_builtin_read_only(): + caps = build_capabilities(source="builtin", active=True, requests_count=0) + assert caps.can_edit is False + assert caps.can_delete is False + assert caps.can_duplicate is True + assert caps.can_archive is False + assert caps.can_launch is True + assert caps.lock_reason == "Built-in experiments are managed by pipeline code" + + +def test_build_capabilities_custom_unlocked_when_no_requests(): + caps_empty = build_capabilities(source="custom", active=True, requests_count=0) + assert caps_empty.can_edit is True + assert caps_empty.can_delete is True + assert caps_empty.can_archive is True + assert caps_empty.lock_reason is None + + +def test_build_capabilities_custom_locked_with_requests(): + # A custom experiment that has already been used by a training request + # MUST become read-only (can_edit=False), even though it can still be + # duplicated and archived. + caps = build_capabilities(source="custom", active=True, requests_count=2) + assert caps.can_edit is False + assert caps.can_delete is False + assert caps.can_duplicate is True + assert caps.can_archive is True + assert caps.can_launch is True + assert caps.lock_reason == ( + "Experiment parameters are locked because " + "the experiment has already been used by a training request" + ) + + +def test_build_capabilities_can_launch_follows_active(): + assert build_capabilities(source="custom", active=False, requests_count=0).can_launch is False + assert build_capabilities(source="builtin", active=False, requests_count=0).can_launch is False + + +def test_list_experiments_empty(env): + resp = _svc(env).list_experiments(env.spec_id) + assert resp.total == 0 + assert resp.rows == [] + assert resp.summary.total == 0 + + +def test_create_experiment_and_get(env): + svc = _svc(env) + resp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest( + params={"model": "yolov8m.pt", "epochs": 10, "imgsz": 640}, + display_name="My experiment", + ), + ) + exp = resp.experiment + assert exp.source == "custom" + assert exp.id.startswith("custom_") + assert exp.display_name == "My experiment" + assert exp.params["epochs"] == 10 + assert exp.revision == 1 + assert exp.active is True + assert exp.archived is False + assert exp.capabilities.can_edit is True + assert exp.capabilities.can_delete is True + + fetched = svc.get_experiment(env.spec_id, exp.id).experiment + assert fetched.id == exp.id + assert fetched.config_hash is not None + + +def test_create_experiment_invalid_params(env): + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Bad", params={"not_a_field": 1}), + ) + assert excinfo.value.code == "train_config_validation_failed" + assert excinfo.value.status_code == 422 + + +def test_get_experiment_not_found(env): + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).get_experiment(env.spec_id, "nope") + assert excinfo.value.code == "experiment_not_found" + assert excinfo.value.status_code == 404 + + +def test_list_experiment_models(env): + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="With models", params={"epochs": 3}), + ).experiment + env.write_frozen_dataset("fd-a") + env.write_frozen_dataset("fd-b") + env.write( + "model_is_trained_on_frozen_dataset", + [ + { + "model_id": "m-1", + "frozen_dataset_id": "fd-a", + "train_config_id": exp.id, + "created_at": "2026-03-01T10:00:00+00:00", + }, + { + "model_id": "m-2", + "frozen_dataset_id": "fd-b", + "train_config_id": exp.id, + "created_at": "2026-03-02T10:00:00+00:00", + }, + { + "model_id": "m-other", + "frozen_dataset_id": "fd-a", + "train_config_id": "other-config", + "created_at": "2026-03-03T10:00:00+00:00", + }, + ], + ) + + detail = svc.get_experiment(env.spec_id, exp.id) + assert len(detail.models) == 2 + assert {row.model_id for row in detail.models} == {"m-1", "m-2"} + assert detail.models[0].model_id == "m-2" # newest first + assert detail.models[0].frozen_dataset_id == "fd-b" + + listed = svc.list_experiment_models(env.spec_id, exp.id) + assert listed.total == 2 + assert listed.experiment.id == exp.id + + +def test_update_experiment_bumps_revision(env): + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + updated = svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest( + display_name="Renamed", params={"epochs": 5}, expected_revision=1 + ), + ).experiment + assert updated.display_name == "Renamed" + assert updated.revision == 2 + + +def test_update_experiment_revision_mismatch(env): + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + with pytest.raises(TrainingExperimentError) as excinfo: + svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest(display_name="X", params={"epochs": 5}, expected_revision=99), + ) + assert excinfo.value.code == "experiment_revision_conflict" + assert excinfo.value.status_code == 409 + + +def test_update_builtin_is_read_only(env): + config_id = env.write_builtin_config() + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).update_experiment( + env.spec_id, + config_id, + UpdateTrainingExperimentRequest(display_name="x", params={}, expected_revision=1), + ) + assert excinfo.value.code == "builtin_experiment_read_only" + assert excinfo.value.status_code == 403 + + +def test_update_locked_experiment_is_blocked(env): + """A custom experiment that already has a training request MUST become + read-only: can_edit is False and updates are rejected with + ``experiment_locked``.""" + svc = _svc(env) + env.write_frozen_dataset() + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + from datapipe_app_ml_ops.ops.training_experiments_models import CreateTrainingRequestRequest + + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=exp.id, client_request_id="cli-lock" + ), + ) + locked = svc.get_experiment(env.spec_id, exp.id).experiment + assert locked.requests_count == 1 + assert locked.capabilities.can_edit is False + + with pytest.raises(TrainingExperimentError) as excinfo: + svc.update_experiment( + env.spec_id, + exp.id, + UpdateTrainingExperimentRequest(display_name="New", params={"epochs": 5}, expected_revision=1), + ) + assert excinfo.value.code == "experiment_locked" + assert excinfo.value.status_code == 409 + + +def test_delete_experiment_success(env): + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + svc.delete_experiment(env.spec_id, exp.id) + assert svc.list_experiments(env.spec_id).total == 0 + + +def test_delete_experiment_blocked_with_requests(env): + svc = _svc(env) + env.write_frozen_dataset() + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + from datapipe_app_ml_ops.ops.training_experiments_models import CreateTrainingRequestRequest + + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=exp.id, client_request_id="cli-1" + ), + ) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.delete_experiment(env.spec_id, exp.id) + assert excinfo.value.code == "experiment_locked" + + +def test_delete_builtin_blocked(env): + config_id = env.write_builtin_config() + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).delete_experiment(env.spec_id, config_id) + assert excinfo.value.code == "builtin_experiment_read_only" + assert excinfo.value.status_code == 403 + + +def test_duplicate_experiment(env): + svc = _svc(env) + src = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(params={"epochs": 7}, display_name="Base"), + ).experiment + dup = svc.duplicate_experiment( + env.spec_id, src.id, DuplicateTrainingExperimentRequest() + ).experiment + assert dup.id != src.id + assert dup.source == "custom" + assert dup.params["epochs"] == 7 + assert "copy" in (dup.display_name or "").lower() + + +def test_duplicate_builtin_creates_custom(env): + config_id = env.write_builtin_config(display_name="Std") + dup = _svc(env).duplicate_experiment( + env.spec_id, config_id, DuplicateTrainingExperimentRequest(display_name="Mine") + ).experiment + assert dup.source == "custom" + assert dup.display_name == "Mine" + + +def test_archive_unarchive(env): + svc = _svc(env) + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + archived = svc.archive_experiment(env.spec_id, exp.id).experiment + assert archived.active is False + assert archived.archived is True + assert archived.capabilities.can_launch is False + + # Archived experiments are hidden unless include_archived. + assert svc.list_experiments(env.spec_id).total == 0 + assert svc.list_experiments(env.spec_id, include_archived=True).total == 1 + + unarchived = svc.unarchive_experiment(env.spec_id, exp.id).experiment + assert unarchived.active is True + assert unarchived.archived is False + + +def test_archive_builtin_blocked(env): + config_id = env.write_builtin_config() + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).archive_experiment(env.spec_id, config_id) + assert excinfo.value.code == "builtin_experiment_read_only" + assert excinfo.value.status_code == 403 + + +def test_get_config_schema(env): + resp = _svc(env).get_config_schema(env.spec_id) + assert resp.config_type == "yolov8_detection" + assert "properties" in resp.json_schema + + +def test_list_experiments_filters(env): + svc = _svc(env) + env.write_builtin_config(config_id="builtin-1", display_name="Builtin one") + svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Alpha", params={"epochs": 1}), + ) + svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Beta", params={"epochs": 2}), + ) + + all_resp = svc.list_experiments(env.spec_id) + assert all_resp.total == 3 + assert all_resp.summary.builtin == 1 + assert all_resp.summary.custom == 2 + assert all_resp.summary.editable == 2 + assert all_resp.summary.locked == 0 + assert all_resp.summary.archived == 0 + + only_custom = svc.list_experiments(env.spec_id, source="custom") + assert only_custom.total == 2 + + searched = svc.list_experiments(env.spec_id, search="alpha") + assert searched.total == 1 + assert searched.rows[0].display_name == "Alpha" + + +def test_summary_reflects_locked_and_archived(env): + svc = _svc(env) + env.write_frozen_dataset() + exp = svc.create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Base", params={"epochs": 5}), + ).experiment + from datapipe_app_ml_ops.ops.training_experiments_models import CreateTrainingRequestRequest + + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=exp.id, client_request_id="cli-1" + ), + ) + resp = svc.list_experiments(env.spec_id, include_archived=True) + assert resp.summary.locked == 1 + assert resp.summary.editable == 0 + + svc.archive_experiment(env.spec_id, exp.id) + resp2 = svc.list_experiments(env.spec_id, include_archived=True) + assert resp2.summary.archived == 1 + # Once archived, the experiment is no longer counted as "locked". + assert resp2.summary.locked == 0 diff --git a/libs/datapipe-app-ml-ops/tests/ops/test_training_requests.py b/libs/datapipe-app-ml-ops/tests/ops/test_training_requests.py new file mode 100644 index 000000000..f9a7b8a0f --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/ops/test_training_requests.py @@ -0,0 +1,309 @@ +from __future__ import annotations + +import pytest + +from datapipe_app_ml_ops.ops.training_experiments_models import ( + CreateTrainingExperimentRequest, + CreateTrainingRequestRequest, + TrainingExperimentError, +) +from datapipe_app_ml_ops.ops.training_experiments_service import ( + TrainingExperimentsService, +) + + +def _svc(env, *, run_steps=...) -> TrainingExperimentsService: + return TrainingExperimentsService( + env.registry, + ds=env.ds, + catalog=env.catalog, + run_steps=env.run_steps if run_steps is ... else run_steps, + ) + + +def _make_experiment(env) -> str: + exp = _svc(env).create_experiment( + env.spec_id, + CreateTrainingExperimentRequest(display_name="Exp", params={"model": "yolov8n.pt", "epochs": 5}), + ).experiment + return exp.id + + +def test_list_training_requests_can_launch_when_idle_and_run_labels_set(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + req = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-list-launch", + launch=False, + ), + ).request + + listed = svc.list_training_requests(env.spec_id) + match = next(row for row in listed.rows if row.id == req.id) + assert match.can_launch is True + assert match.can_delete is True + + +def test_create_training_request_success(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + + resp = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-1", + launch=True, + ), + ) + req = resp.request + assert req.id.startswith("request_") + assert req.train_config_id == config_id + assert req.frozen_dataset_id == "fd-1" + assert req.kind == "manual" + assert req.state == "queued" + # Config is snapshotted onto the request. + assert req.config_params_snapshot["epochs"] == 5 + assert req.config_hash is not None + assert req.config_name == "Exp" + + assert resp.launch is not None + assert resp.launch.started is True + assert resp.launch.run_id == "run-123" + + # Row is persisted. + df = env.read("training_request") + assert len(df) == 1 + + +def test_create_training_request_defaults_to_no_launch(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + + resp = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=config_id, client_request_id="cli-default" + ), + ) + assert resp.launch is None + assert len(env.run_steps.calls) == 0 + + +def test_create_training_request_no_launch(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + + resp = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-no-launch", + launch=False, + ), + ) + assert resp.launch is None + assert len(env.run_steps.calls) == 0 + + +def test_create_training_request_idempotent(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + + first = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=config_id, client_request_id="cli-1" + ), + ) + second = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=config_id, client_request_id="cli-1" + ), + ) + assert first.request.id == second.request.id + # The idempotent replay does not re-launch. + assert second.launch is None + assert len(env.read("training_request")) == 1 + + +def test_create_training_request_experiment_not_found(env): + env.write_frozen_dataset("fd-1") + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id="nope", client_request_id="cli-1" + ), + ) + assert excinfo.value.code == "experiment_not_found" + assert excinfo.value.status_code == 404 + + +def test_create_training_request_frozen_not_found(env): + config_id = _make_experiment(env) + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="missing", train_config_id=config_id, client_request_id="cli-1" + ), + ) + assert excinfo.value.code == "frozen_dataset_not_found" + assert excinfo.value.status_code == 404 + + +def test_create_training_request_inactive_experiment(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + svc.archive_experiment(env.spec_id, config_id) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", train_config_id=config_id, client_request_id="cli-1" + ), + ) + assert excinfo.value.code == "experiment_inactive" + assert excinfo.value.status_code == 409 + + +def test_launch_training_request_uses_pk_filter(env): + svc = _svc(env) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + req = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-1", + launch=False, + ), + ).request + + resp = svc.launch_training_request(env.spec_id, req.id) + assert resp.started is True + assert resp.run_id == "run-123" + assert resp.training_request_id == req.id + + # run_steps must be called with the training_request_id primary-key filter. + assert len(env.run_steps.calls) == 1 + call_request_id, run_labels, filters = env.run_steps.calls[0] + assert call_request_id == req.id + assert run_labels == [("stage", "train")] + assert "training_request_id" in filters + assert filters["training_request_id"] == [req.id] + + +def test_launch_training_request_not_found(env): + with pytest.raises(TrainingExperimentError) as excinfo: + _svc(env).launch_training_request(env.spec_id, "request_missing") + assert excinfo.value.status_code == 404 + + +def test_launch_without_run_steps_configured(env): + svc = _svc(env, run_steps=None) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + req = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-1", + launch=False, + ), + ).request + with pytest.raises(TrainingExperimentError) as excinfo: + svc.launch_training_request(env.spec_id, req.id) + assert excinfo.value.code == "training_launch_failed" + assert excinfo.value.status_code == 503 + + +def test_create_training_request_launch_failed_when_no_run_steps(env): + svc = _svc(env, run_steps=None) + env.write_frozen_dataset("fd-1") + config_id = _make_experiment(env) + with pytest.raises(TrainingExperimentError) as excinfo: + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-1", + launch=True, + ), + ) + assert excinfo.value.code == "training_launch_failed" + assert excinfo.value.status_code == 503 + + +def test_launch_rejected_when_run_labels_empty(env): + from dataclasses import replace + + from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + spec = env.registry.get(env.spec_id) + assert spec.training is not None and spec.training.requests is not None + empty_requests = replace(spec.training.requests, run_labels=[]) + empty_training = replace(spec.training, requests=empty_requests) + empty_spec = replace(spec, training=empty_training) + registry = OpsSpecRegistry() + registry.add_many([empty_spec]) + + svc = TrainingExperimentsService( + registry, + ds=env.ds, + catalog=env.catalog, + run_steps=env.run_steps, + ) + env.write_frozen_dataset("fd-1") + # Seed an experiment via the original env registry tables. + config_id = _make_experiment(env) + + with pytest.raises(TrainingExperimentError) as excinfo: + svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-no-labels", + launch=True, + ), + ) + assert excinfo.value.code == "training_launch_not_configured" + assert excinfo.value.status_code == 400 + + # Creating without launch still works. + resp = svc.create_training_request( + env.spec_id, + CreateTrainingRequestRequest( + frozen_dataset_id="fd-1", + train_config_id=config_id, + client_request_id="cli-no-labels-ok", + launch=False, + ), + ) + assert resp.launch is None + with pytest.raises(TrainingExperimentError) as excinfo: + svc.launch_training_request(env.spec_id, resp.request.id) + assert excinfo.value.code == "training_launch_not_configured" + + listed = svc.list_training_requests(env.spec_id) + match = next(row for row in listed.rows if row.id == resp.request.id) + assert match.can_launch is False + assert match.can_delete is True diff --git a/libs/datapipe-app-ml-ops/tests/test_db_schema.py b/libs/datapipe-app-ml-ops/tests/test_db_schema.py new file mode 100644 index 000000000..888bafeb6 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_db_schema.py @@ -0,0 +1,17 @@ +from datapipe.store.database import DBConn + +from datapipe_app.app.db_schema import register_observability_tables_in_metadata +from datapipe_app.observability.config.tables import ObservabilityTableConfig +from datapipe_app_ml_ops.observability.config.tables import MLObservabilityTableConfig + + +def test_register_observability_tables_in_metadata() -> None: + dbconn = DBConn("sqlite:///:memory:") + register_observability_tables_in_metadata(dbconn) + + table_names = {table.name for table in dbconn.sqla_metadata.tables.values()} + config = ObservabilityTableConfig() + ml_config = MLObservabilityTableConfig() + assert config.pipeline_runs in table_names + assert "datapipe_api__run_logs" not in table_names + assert ml_config.metrics_candidates in table_names diff --git a/libs/datapipe-app-ml-ops/tests/test_image_visualization.py b/libs/datapipe-app-ml-ops/tests/test_image_visualization.py new file mode 100644 index 000000000..88693f47b --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_image_visualization.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +import pytest + + +pytest.importorskip("cv_pipeliner") + +from datapipe_app_ml_ops.viz.image_visualization import bboxes_data_from_record, iter_bbox_fields_from_record + + +def test_bboxes_data_from_record_includes_keypoints_and_masks(): + record = { + "bboxes": [[10, 20, 100, 120], [30, 40, 80, 90]], + "labels": ["cat", "dog"], + "keypoints": [[[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]]], + "masks": [[[[1, 1], [2, 2]]], []], + "prediction__detection_scores": [0.9, 0.8], + "prediction__keypoints_scores": [[0.95, 0.85], [0.7, 0.6, 0.5]], + "keypoints_visibility": [[0, 2], [1, 2, 2]], + } + + bboxes_data = bboxes_data_from_record(record) + + assert len(bboxes_data) == 2 + assert bboxes_data[0].keypoints.tolist() == [[1, 2], [3, 4]] + assert bboxes_data[1].keypoints.tolist() == [[5, 6], [7, 8], [9, 10]] + assert len(bboxes_data[0].mask) == 1 + assert bboxes_data[1].mask == [] + assert bboxes_data[0].detection_score == 0.9 + assert bboxes_data[0].keypoints_scores == [0.95, 0.85] + assert [int(v) for v in bboxes_data[0].keypoints_visibility] == [0, 2] + assert [int(v) for v in bboxes_data[1].keypoints_visibility] == [1, 2, 2] + + +def test_iter_bbox_fields_handles_scalar_classification_scores(): + rows = iter_bbox_fields_from_record( + { + "bboxes": [], + "labels": "Has Animal", + "prediction__classification_score": 0.97, + }, + scores_column="prediction__classification_score", + ) + assert rows == [] + + +def test_iter_bbox_fields_aligns_scalar_label_and_score_to_bboxes(): + rows = iter_bbox_fields_from_record( + { + "bboxes": [[1, 2, 3, 4]], + "labels": "cat", + "prediction__detection_scores": 0.5, + } + ) + assert rows == [("cat", 0.5, 1, 2, 3, 4)] diff --git a/libs/datapipe-app-ml-ops/tests/test_metrics_candidates.py b/libs/datapipe-app-ml-ops/tests/test_metrics_candidates.py new file mode 100644 index 000000000..7d9a82b10 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_metrics_candidates.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +from datapipe_app.observability.store.db import ObservabilityStore +from datapipe_app_ml_ops.observability.metrics.metrics_service import MetricsService, _normalize_metric_nulls +from datapipe_app_ml_ops.observability.schemas.models import MetricsCandidateCreate + + +def test_metrics_candidates_persist_in_store(tmp_path) -> None: + store = ObservabilityStore.from_url(f"sqlite:///{tmp_path / 'obs.db'}") + svc = MetricsService(store=store) + + created = svc.add_candidate( + "pipeline_a", + MetricsCandidateCreate( + model_id="yolov8n", + dataset_id="ds-1", + subset="val", + ), + ) + assert created.id + assert created.metrics_state == "not_computed" + + listed = svc.list_candidates("pipeline_a") + assert listed.total == 1 + assert listed.rows[0].model_id == "yolov8n" + + store2 = ObservabilityStore.from_url(f"sqlite:///{tmp_path / 'obs.db'}") + svc2 = MetricsService(store=store2) + reloaded = svc2.list_candidates("pipeline_a") + assert reloaded.total == 1 + assert reloaded.rows[0].id == created.id + + assert svc.delete_candidate("pipeline_a", created.id) is True + assert svc.list_candidates("pipeline_a").total == 0 + + +def test_normalize_metric_nulls_fills_zero_recall_gaps() -> None: + metrics = _normalize_metric_nulls( + { + "weighted_recall": 0.0, + "weighted_precision": None, + "weighted_f1_score": None, + "macro_recall": 0.0, + "macro_precision": None, + "macro_f1_score": None, + "accuracy": 0.0, + } + ) + assert metrics["weighted_precision"] == 0.0 + assert metrics["weighted_f1_score"] == 0.0 + assert metrics["macro_precision"] == 0.0 + assert metrics["macro_f1_score"] == 0.0 + + +def test_parse_model_ids_or_filter() -> None: + from datapipe_app_ml_ops.observability.metrics.metrics_service import _parse_model_ids + + assert _parse_model_ids("a,b, c") == ["a", "b", "c"] + assert _parse_model_ids(None) is None + assert _parse_model_ids("") is None diff --git a/libs/datapipe-app-ml-ops/tests/test_observability_ml_integration.py b/libs/datapipe-app-ml-ops/tests/test_observability_ml_integration.py new file mode 100644 index 000000000..36985c71c --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_observability_ml_integration.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import pytest + +pytest.importorskip("datapipe_ml") + +from datapipe_app.observability.store.db import ObservabilityStore +from datapipe_app.observability.logging.log_buffer import RunLogBuffer +from datapipe_app.observability.plugins.registry import ObservabilityRegistry, load_observability_plugins +from datapipe_app.observability.runs.run_output_capture import capture_run_output +from datapipe_app_ml_ops.observability.training.training_service import TrainingService +from datapipe_ml.core.multiprocessing import _spawn + + +def _subprocess_print_child(queue, message: str) -> None: + import sys + + print(message, flush=True) + sys.stdout.flush() + queue.put("ok") + + +def test_ml_observability_plugin_registers_enricher_on_attach() -> None: + from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsDataSpec + from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + registry = ObservabilityRegistry() + load_observability_plugins(registry) + + assert registry.collectors == [] + assert registry.enrichers == [] + + ops_specs = OpsSpecRegistry() + ops_specs.add_many([DatapipeOpsSpec(id="demo", title="Demo", data=OpsDataSpec(tables=[]))]) + registry.attach_ops_specs(ops_specs) + + assert len(registry.enrichers) == 1 + + +def test_training_service_without_specs_returns_empty(tmp_path) -> None: + store = ObservabilityStore.from_url(f"sqlite:///{tmp_path / 'obs.db'}") + service = TrainingService(store=store, ds=None, catalog=None) + + response = service.list_runs("demo", limit=10) + assert response.total == 0 + assert response.rows == [] + + +def test_capture_run_output_records_subprocess_stdout(tmp_path) -> None: + store = ObservabilityStore.from_url(f"sqlite:///{tmp_path / 'obs3.db'}") + buffer = RunLogBuffer(store) + run_id = "run-3" + buffer.start_run(run_id) + + with capture_run_output(buffer, run_id): + assert _spawn(_subprocess_print_child, "Ultralytics epoch 1/30") == "ok" + + messages = [line.message for line in buffer.get_lines(run_id)] + assert "Ultralytics epoch 1/30" in messages diff --git a/libs/datapipe-app-ml-ops/tests/test_ops_filters.py b/libs/datapipe-app-ml-ops/tests/test_ops_filters.py new file mode 100644 index 000000000..739480315 --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_ops_filters.py @@ -0,0 +1,231 @@ +import json +import tempfile + +import pandas as pd +import pytest +from datapipe.compute import Catalog, Pipeline, Table +from datapipe.datatable import DataStore +from datapipe.step.batch_transform import BatchTransform +from datapipe.store.database import DBConn, TableStoreDB +from fastapi.testclient import TestClient +from sqlalchemy import Column, Integer, String + +from datapipe_app import DatapipeAPI +from datapipe_app.ops.ops_filters import OpsFilterRule, parse_filter_rules +from datapipe_app.ops.ops_query import OpsQuery +from datapipe_app.app.errors import OpsSpecValidationError +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsDataSpec +from datapipe_app.ops.specs import OpsColumn, OpsMetricTableSpec + + +def metrics_spec(table_name: str = "metrics_rows") -> DatapipeOpsSpec: + return DatapipeOpsSpec( + id="filter_spec", + title="Filter Spec", + description="Filter tests", + data=OpsDataSpec(tables=[table_name]), + metrics=[ + OpsMetricTableSpec( + id="model_metrics", + title="Model metrics", + table=table_name, + metric_source="pipeline_model__metrics_on_subset", + primary_key_columns=["model", "subset"], + entity_links={"model": "model", "subset": "subset"}, + primary_columns=[ + OpsColumn("model", "Model ID", "model", "link", filterable=True, link_to="model"), + OpsColumn("subset", "Subset", "subset", "chip", filterable=True), + ], + metric_columns=[OpsColumn("score", "Score", "score", "number")], + filters=[ + OpsColumn("subset_filter", "Subset", "subset", filterable=True), + OpsColumn("model_filter", "Model ID", "model", filterable=True), + ], + best_metric_column="score", + default_sort=[("model", "asc")], + ) + ], + ) + + +@pytest.fixture +def filter_app(agent_env): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + catalog = Catalog( + { + "metrics_rows": Table( + store=TableStoreDB( + name="metrics_rows", + dbconn=dbconn, + data_sql_schema=[ + Column("id", Integer(), primary_key=True), + Column("model", String()), + Column("subset", String()), + Column("score", Integer()), + ], + create_table=True, + ) + ) + } + ) + pipeline = Pipeline([BatchTransform(lambda df: df, inputs=["metrics_rows"], outputs=["metrics_rows"])]) + ds = DataStore(dbconn, create_meta_table=True) + dt = catalog.get_datatable(ds, "metrics_rows") + dt.store_chunk( + pd.DataFrame( + [ + {"id": 1, "model": "cat_dog_yolo_smoke", "subset": "train", "score": 80}, + {"id": 2, "model": "cat_dog_yolo_smoke", "subset": "val", "score": 70}, + {"id": 3, "model": "other_model", "subset": "val", "score": 50}, + {"id": 4, "model": "empty_model", "subset": "none", "score": 10}, + {"id": 5, "model": None, "subset": "test", "score": 20}, + ] + ) + ) + app = DatapipeAPI(ds, catalog, pipeline, pipeline_id="test_pipeline") + app.add_specs([metrics_spec()]) + yield app + + +def _rows(client: TestClient, **params): + return client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/filter_spec/metrics/model_metrics/rows", + params=params, + ) + + +def test_contains_filter(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "model", "operator": "contains", "value": "cat_dog"}]) + res = _rows(client, filters=filters) + assert res.status_code == 200 + models = {row["model"] for row in res.json()["rows"]} + assert models == {"cat_dog_yolo_smoke"} + + +def test_not_contains_filter(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "model", "operator": "not_contains", "value": "cat_dog"}]) + res = _rows(client, filters=filters) + assert res.status_code == 200 + models = {row["model"] for row in res.json()["rows"] if row["model"]} + assert "cat_dog_yolo_smoke" not in models + + +def test_equal_and_not_equal_filters(filter_app): + client = TestClient(filter_app) + equal = json.dumps([{"column_id": "subset", "operator": "equal", "value": "train"}]) + res = _rows(client, filters=equal) + assert res.status_code == 200 + assert all(row["subset"] == "train" for row in res.json()["rows"]) + + not_equal = json.dumps([{"column_id": "subset", "operator": "not_equal", "value": "val"}]) + res = _rows(client, filters=not_equal) + assert res.status_code == 200 + assert all(row["subset"] != "val" for row in res.json()["rows"]) + + +def test_is_empty_filter(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "model", "operator": "is_empty"}]) + res = _rows(client, filters=filters) + assert res.status_code == 200 + assert any(row["model"] in {None, ""} for row in res.json()["rows"]) + + +def test_filter_mode_or(filter_app): + client = TestClient(filter_app) + filters = json.dumps( + [ + {"column_id": "subset", "operator": "equal", "value": "train"}, + {"column_id": "subset", "operator": "equal", "value": "test"}, + ] + ) + res = _rows(client, filters=filters, filter_mode="or") + assert res.status_code == 200 + subsets = {row["subset"] for row in res.json()["rows"]} + assert subsets == {"train", "test"} + + +def test_filter_mode_and(filter_app): + client = TestClient(filter_app) + filters = json.dumps( + [ + {"column_id": "model", "operator": "contains", "value": "cat_dog"}, + {"column_id": "subset", "operator": "equal", "value": "val"}, + ] + ) + res = _rows(client, filters=filters, filter_mode="and") + assert res.status_code == 200 + payload = res.json() + assert payload["total"] == 1 + assert payload["rows"][0]["subset"] == "val" + + +def test_regex_filter_sqlite(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "model", "operator": "regex", "value": "^cat_dog.*"}]) + res = _rows(client, filters=filters) + assert res.status_code == 200 + assert all(str(row["model"]).startswith("cat_dog") for row in res.json()["rows"]) + + +def test_unknown_column_is_skipped(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "missing", "operator": "equal", "value": "x"}]) + res = _rows(client, filters=filters) + assert res.status_code == 200 + assert res.json()["total"] == 5 + + +def test_shared_filter_skipped_when_column_absent_from_table(filter_app): + """Tag filter from a sibling metric table must not 400 on model_metrics.""" + query = OpsQuery(filter_app.ds, filter_app.catalog) + columns = metrics_spec().metrics[0].primary_columns + metrics_spec().metrics[0].filters + rows, total = query.rows( + "metrics_rows", + allowed_columns=columns, + filter_rules=[ + OpsFilterRule(column_id="subset", operator="equal", value="val"), + OpsFilterRule(column_id="tag_id", operator="equal", value="night"), + ], + filter_mode="and", + ) + assert total == 2 + assert all(row["subset"] == "val" for row in rows) + + +def test_unknown_operator_returns_400(): + with pytest.raises(OpsSpecValidationError): + parse_filter_rules(json.dumps([{"column_id": "model", "operator": "greater_than", "value": "1"}])) + + +def test_legacy_model_subset_params(filter_app): + client = TestClient(filter_app) + res = _rows(client, subset=["val"]) + assert res.status_code == 200 + assert all(row["subset"] == "val" for row in res.json()["rows"]) + + +def test_search_and_filters_combine(filter_app): + client = TestClient(filter_app) + filters = json.dumps([{"column_id": "subset", "operator": "equal", "value": "val"}]) + res = _rows(client, filters=filters, search="cat_dog") + assert res.status_code == 200 + payload = res.json() + assert payload["total"] == 1 + assert payload["rows"][0]["model"] == "cat_dog_yolo_smoke" + + +def test_ops_query_direct_non_filterable_column(filter_app): + query = OpsQuery(filter_app.ds, filter_app.catalog) + with pytest.raises(OpsSpecValidationError, match="not configured"): + query.rows( + "metrics_rows", + allowed_columns=[ + OpsColumn("model", "Model ID", "model", filterable=True), + OpsColumn("score", "Score", "score", "number", filterable=False), + ], + filter_rules=[OpsFilterRule(column_id="score", operator="equal", value="1")], + ) diff --git a/libs/datapipe-app-ml-ops/tests/test_ops_image_records.py b/libs/datapipe-app-ml-ops/tests/test_ops_image_records.py new file mode 100644 index 000000000..947f4ba3d --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_ops_image_records.py @@ -0,0 +1,364 @@ +import tempfile + +import pandas as pd +import pytest +from fastapi.testclient import TestClient +from sqlalchemy import JSON, Column, Integer, String + +from datapipe.compute import Catalog, Pipeline, Table +from datapipe.store.database import DBConn, TableStoreDB + +from datapipe_app import DatapipeAPI, OpsSpecRegistry +from datapipe_app_ml_ops.ops.ops_image_records import OpsImageRecordsSupport +from datapipe_app.ops.ops_query import OpsQuery +from datapipe_app.ops.specs import OpsColumn +from datapipe_app_ml_ops.ops.ops_specs import ( + DatapipeOpsSpec, + OpsDataSpec, + OpsFrozenDatasetSpec, + OpsImageAnnotationSpec, + OpsImageDataSpec, + OpsImageRecordViewSpec, + OpsModelSpec, +) + + +def image_spec(**overrides): + values = { + "id": "detection", + "title": "Detection", + "description": "Image detection ops.", + "data": OpsDataSpec( + tables=["images"], + image_view=OpsImageDataSpec( + image_table="images", + image_primary_key_columns=["image_name"], + image_url_column="image_url", + ground_truth=None, + ), + ), + "frozen_dataset": OpsFrozenDatasetSpec( + table="frozen_snapshots", + id_column="detection_frozen_dataset_id", + created_at_column="created_at", + record_view=OpsImageRecordViewSpec( + table="frozen_has_image_gt", + scope_column="detection_frozen_dataset_id", + primary_key_columns=["detection_frozen_dataset_id", "image_name", "subset_id"], + bboxes_column="bboxes", + labels_column="labels", + ), + columns=[ + OpsColumn("detection_frozen_dataset_id", "Dataset", "detection_frozen_dataset_id", kind="link", link_to="frozen_dataset"), + OpsColumn("created_at", "Frozen at", "created_at", kind="datetime"), + OpsColumn("split", "Split", "split", kind="split"), + OpsColumn("models", "Models", "models_count", kind="models_count"), + ], + ), + "model": OpsModelSpec( + table="models", + id_column="model_id", + prediction_view=None, + ), + "metrics": [], + } + values.update(overrides) + return DatapipeOpsSpec(**values) + + +@pytest.fixture +def image_ops_app(): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + catalog = Catalog( + { + "images": Table( + store=TableStoreDB( + name="images", + dbconn=dbconn, + data_sql_schema=[ + Column("image_name", String(), primary_key=True), + Column("image_url", String()), + Column("bboxes", JSON()), + Column("labels", JSON()), + ], + create_table=True, + ) + ), + "frozen_snapshots": Table( + store=TableStoreDB( + name="frozen_snapshots", + dbconn=dbconn, + data_sql_schema=[ + Column("detection_frozen_dataset_id", String(), primary_key=True), + Column("created_at", String()), + ], + create_table=True, + ) + ), + "frozen_has_image_gt": Table( + store=TableStoreDB( + name="frozen_has_image_gt", + dbconn=dbconn, + data_sql_schema=[ + Column("detection_frozen_dataset_id", String(), primary_key=True), + Column("image_name", String(), primary_key=True), + Column("subset_id", String(), primary_key=True), + Column("bboxes", JSON()), + Column("labels", JSON()), + ], + create_table=True, + ) + ), + "models": Table( + store=TableStoreDB( + name="models", + dbconn=dbconn, + data_sql_schema=[ + Column("model_id", String(), primary_key=True), + ], + create_table=True, + ) + ), + } + ) + from datapipe.datatable import DataStore + + ds = DataStore(dbconn, create_meta_table=True) + images_dt = catalog.get_datatable(ds, "images") + frozen_dt = catalog.get_datatable(ds, "frozen_has_image_gt") + images_dt.store_chunk( + pd.DataFrame( + [ + { + "image_name": "img_a.jpg", + "image_url": "https://example.com/a.jpg", + "bboxes": [[10, 10, 50, 50]], + "labels": ["cat"], + }, + { + "image_name": "img_b.jpg", + "image_url": "https://example.com/b.jpg", + "bboxes": [], + "labels": [], + }, + ] + ) + ) + frozen_dt.store_chunk( + pd.DataFrame( + [ + { + "detection_frozen_dataset_id": "ds-1", + "image_name": "img_a.jpg", + "subset_id": "train", + "bboxes": [[10, 10, 50, 50]], + "labels": ["cat"], + }, + { + "detection_frozen_dataset_id": "ds-1", + "image_name": "img_b.jpg", + "subset_id": "val", + "bboxes": [[1, 2, 3, 4]], + "labels": ["dog"], + }, + { + "detection_frozen_dataset_id": "ds-2", + "image_name": "img_c.jpg", + "subset_id": "test", + "bboxes": [], + "labels": [], + }, + ] + ) + ) + app = DatapipeAPI(ds, catalog, pipeline=Pipeline([]), pipeline_id="test_pipeline") + app.add_specs([image_spec()]) + yield app + + +def test_ops_specs_metadata_has_image_flags(image_ops_app): + client = TestClient(image_ops_app) + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs") + assert res.status_code == 200 + spec = res.json()["specs"][0] + assert spec["has_image"] is True + assert spec["has_model_predictions"] is False + + +def test_get_spec_serializes_image_view(image_ops_app): + client = TestClient(image_ops_app) + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection") + assert res.status_code == 200 + payload = res.json() + assert payload["data"]["image_view"]["image_table"] == "images" + assert payload["frozen_dataset"]["record_view"]["table"] == "frozen_has_image_gt" + + +def test_record_key_roundtrip(): + registry = OpsSpecRegistry() + support = OpsImageRecordsSupport(registry, OpsQuery(None, None)) + pk = {"image_name": "img_a.jpg", "subset_id": "train"} + encoded = support._encode_record_key(pk) + decoded = support._decode_record_key(encoded) + assert decoded == pk + + +def test_image_records_limit_clamped(image_ops_app): + client = TestClient(image_ops_app) + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/image/records?limit=100&offset=0") + assert res.status_code == 200 + payload = res.json() + assert payload["limit"] == 100 + assert payload["total"] is None + assert len(payload["rows"]) == 2 + assert payload["list_columns"] == ["image_name"] + + +def test_image_records_list_all_images_without_subset_rows(agent_env): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + catalog = Catalog( + { + "s3_images": Table( + store=TableStoreDB( + name="s3_images", + dbconn=dbconn, + data_sql_schema=[ + Column("image_name", String(), primary_key=True), + Column("image_url", String()), + ], + create_table=True, + ) + ), + "image__subset": Table( + store=TableStoreDB( + name="image__subset", + dbconn=dbconn, + data_sql_schema=[ + Column("image_name", String(), primary_key=True), + Column("subset_id", String()), + ], + create_table=True, + ) + ), + "image__ground_truth": Table( + store=TableStoreDB( + name="image__ground_truth", + dbconn=dbconn, + data_sql_schema=[ + Column("image_name", String(), primary_key=True), + Column("bboxes", JSON()), + Column("labels", JSON()), + ], + create_table=True, + ) + ), + } + ) + from datapipe.datatable import DataStore + + ds = DataStore(dbconn, create_meta_table=True) + images_dt = catalog.get_datatable(ds, "s3_images") + images_dt.store_chunk( + pd.DataFrame( + [ + {"image_name": "img_a.jpg", "image_url": "https://example.com/a.jpg"}, + {"image_name": "img_b.jpg", "image_url": "https://example.com/b.jpg"}, + ] + ) + ) + spec = DatapipeOpsSpec( + id="catalog", + title="Catalog", + description="Catalog images without subset split.", + data=OpsDataSpec( + tables=["s3_images", "image__subset", "image__ground_truth"], + image_view=OpsImageDataSpec( + image_table="s3_images", + image_primary_key_columns=["image_name"], + image_url_column="image_url", + subset_table="image__subset", + subset_join_columns={"image_name": "image_name"}, + subset_column="subset_id", + ground_truth=OpsImageAnnotationSpec( + table="image__ground_truth", + primary_key_columns=["image_name"], + bboxes_column="bboxes", + labels_column="labels", + join_columns={"image_name": "image_name"}, + ), + ), + ), + metrics=[], + ) + app = DatapipeAPI(ds, catalog, pipeline=Pipeline([]), pipeline_id="test_pipeline") + app.add_specs([spec]) + client = TestClient(app) + + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/catalog/image/records?limit=10&offset=0") + assert res.status_code == 200 + payload = res.json() + assert payload["list_columns"] == ["image_name"] + assert len(payload["rows"]) == 2 + assert {row["pk"]["image_name"] for row in payload["rows"]} == {"img_a.jpg", "img_b.jpg"} + assert all(row["subset"] is None for row in payload["rows"]) + assert all(row["bbox_count"] is None for row in payload["rows"]) + + +def test_image_records_count_endpoint(image_ops_app): + client = TestClient(image_ops_app) + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/image/records/count") + assert res.status_code == 200 + assert res.json()["total"] == 2 + + +def test_frozen_dataset_records_scoped_by_dataset_id(image_ops_app): + client = TestClient(image_ops_app) + res = client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/frozen-datasets/ds-1/records?limit=10&offset=0&include_total=true" + ) + assert res.status_code == 200 + payload = res.json() + assert payload["total"] == 2 + subsets = {row["pk"]["subset_id"] for row in payload["rows"]} + assert subsets == {"train", "val"} + + +def test_image_records_sort_by_image_name_desc(image_ops_app): + client = TestClient(image_ops_app) + res = client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/image/records" + "?limit=10&sort_by=image_name&sort_dir=desc" + ) + assert res.status_code == 200 + names = [row["pk"]["image_name"] for row in res.json()["rows"]] + assert names == ["img_b.jpg", "img_a.jpg"] + + +def test_frozen_dataset_records_sort_by_subset_id(image_ops_app): + client = TestClient(image_ops_app) + res = client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/frozen-datasets/ds-1/records" + "?limit=10&sort_by=subset_id&sort_dir=asc" + ) + assert res.status_code == 200 + subsets = [row["pk"]["subset_id"] for row in res.json()["rows"]] + assert subsets == ["train", "val"] + + +def test_frozen_dataset_record_detail_with_string_subset_id(image_ops_app): + client = TestClient(image_ops_app) + registry = image_ops_app.ops_specs + support = OpsImageRecordsSupport(registry, OpsQuery(image_ops_app.ds, image_ops_app.catalog)) + record_key = support._encode_record_key( + {"detection_frozen_dataset_id": "ds-1", "image_name": "img_a.jpg", "subset_id": "train"} + ) + res = client.get( + f"/api/v1alpha3/pipelines/test_pipeline/ops-specs/detection/frozen-datasets/ds-1/records/{record_key}" + ) + assert res.status_code == 200 + payload = res.json() + assert payload["subset"] == "train" + assert payload["bbox_count"] == 1 + assert payload["pk"]["image_name"] == "img_a.jpg" diff --git a/libs/datapipe-app-ml-ops/tests/test_ops_specs.py b/libs/datapipe-app-ml-ops/tests/test_ops_specs.py new file mode 100644 index 000000000..c46c95d3c --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_ops_specs.py @@ -0,0 +1,315 @@ +import tempfile + +import pandas as pd +import pytest +from fastapi.testclient import TestClient + +from datapipe.compute import Catalog, Pipeline, Table +from datapipe.datatable import DataStore +from datapipe.store.database import DBConn, TableStoreDB +from sqlalchemy import Column, Integer, String + +from datapipe_app.app.errors import OpsSpecValidationError +from datapipe_app import DatapipeAPI +from datapipe_app.ops.specs import ( + OpsColumn, + OpsColumnGroup, + OpsFilterRule, + OpsMetricTableSpec, +) +from datapipe_app_ml_ops.ops.ops_spec_metrics import latest_eval_metric_from_specs +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsDataSpec, OpsFrozenDatasetSpec +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + +def input_spec(**overrides): + values = { + "id": "catalog_tags", + "title": "Catalog Tags", + "description": "Tag quality checks over catalog events.", + "data": OpsDataSpec(tables=["input"]), + "metrics": [ + OpsMetricTableSpec( + id="input_metrics", + title="Input metrics", + table="input", + metric_source="input", + primary_key_columns=["id"], + entity_links={"item": "id"}, + primary_columns=[OpsColumn("id", "ID", "id", filterable=True)], + metric_columns=[OpsColumn("value", "Value", "v")], + filters=[OpsColumn("value_filter", "Value", "v", filterable=True)], + best_metric_column="v", + default_sort=[("id", "asc")], + ) + ], + } + values.update(overrides) + return DatapipeOpsSpec(**values) + + +def test_latest_eval_metric_from_specs(): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/store.sqlite") + ds = DataStore(dbconn, create_meta_table=True) + catalog = Catalog({ + "eval": Table( + TableStoreDB( + name="eval", + dbconn=dbconn, + data_sql_schema=[ + Column("id", Integer(), primary_key=True), + Column("model_id", String()), + Column("score", Integer()), + ], + create_table=True, + ) + ) + }) + dt = catalog.get_datatable(ds, "eval") + dt.store_chunk( + pd.DataFrame([ + {"id": 1, "model_id": "m1", "score": 50}, + {"id": 2, "model_id": "m2", "score": 90}, + ]) + ) + + registry = OpsSpecRegistry() + registry.add_many([ + input_spec( + metrics=[ + OpsMetricTableSpec( + id="eval_metrics", + title="Eval metrics", + table="eval", + metric_source="eval", + primary_key_columns=["id"], + entity_links={"model": "model_id"}, + primary_columns=[OpsColumn("id", "ID", "id")], + metric_columns=[OpsColumn("score", "Score", "score")], + best_metric_column="score", + default_sort=[("score", "desc")], + ) + ] + ) + ]) + + latest = latest_eval_metric_from_specs(registry, ds, catalog) + assert latest is not None + assert latest["metric_name"] == "score" + assert latest["metric_value"] == pytest.approx(90.0) + assert latest["model_id"] == "m2" + + scoped = latest_eval_metric_from_specs(registry, ds, catalog, model_id="m1") + assert scoped is not None + assert scoped["metric_value"] == pytest.approx(50.0) + assert scoped["model_id"] == "m1" + + +def test_duplicate_spec_id_validation(): + registry = OpsSpecRegistry() + registry.add_many([input_spec()]) + with pytest.raises(OpsSpecValidationError, match="already registered"): + registry.add_many([input_spec()]) + + +def test_missing_table_validation(ops_app): + spec = input_spec(data=OpsDataSpec(tables=["missing_table"])) + with pytest.raises(OpsSpecValidationError, match='missing table "missing_table"'): + ops_app.add_specs([spec]) + + +def test_missing_column_validation(ops_app): + broken = input_spec( + metrics=[ + OpsMetricTableSpec( + id="broken", + title="Broken", + table="input", + metric_source="input", + primary_key_columns=["id"], + entity_links={}, + primary_columns=[OpsColumn("missing", "Missing", "missing_column")], + metric_columns=[], + ) + ] + ) + with pytest.raises(OpsSpecValidationError, match='missing column "missing_column"'): + ops_app.add_specs([broken]) + + +def test_ops_specs_metadata_endpoint(ops_app): + ops_app.add_specs([input_spec()]) + client = TestClient(ops_app) + + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs") + + assert res.status_code == 200 + payload = res.json() + assert payload["pipeline_id"] == "test_pipeline" + assert payload["specs"][0]["title"] == "Catalog Tags" + assert payload["specs"][0]["metric_tables_count"] == 1 + + +def test_grouped_metric_columns_serialize(ops_app): + grouped = input_spec( + metrics=[ + OpsMetricTableSpec( + id="grouped", + title="Grouped", + table="input", + metric_source="input", + primary_key_columns=["id"], + entity_links={}, + primary_columns=[OpsColumn("id", "ID", "id")], + metric_columns=[ + OpsColumnGroup( + "Quality", + [OpsColumn("precision", "Precision", "v")], + ) + ], + ) + ] + ) + ops_app.add_specs([grouped]) + client = TestClient(ops_app) + + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/catalog_tags") + + assert res.status_code == 200 + table = res.json()["metrics"][0] + assert table["metric_columns"][0]["label"] == "Quality" + assert table["metric_columns"][0]["columns"][0]["label"] == "Precision" + + +def test_default_filters_serialize(ops_app): + spec = input_spec( + metrics=[ + OpsMetricTableSpec( + id="filtered", + title="Filtered", + table="input", + metric_source="input", + primary_key_columns=["id"], + entity_links={"item": "id"}, + primary_columns=[OpsColumn("id", "ID", "id", filterable=True)], + metric_columns=[OpsColumn("value", "Value", "v")], + filters=[OpsColumn("value_filter", "Value", "v", filterable=True)], + default_filters=[OpsFilterRule(column_id="value_filter", operator="equal", value="a")], + ) + ] + ) + ops_app.add_specs([spec]) + client = TestClient(ops_app) + + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/catalog_tags") + + assert res.status_code == 200 + table = res.json()["metrics"][0] + assert table["default_filters"] == [ + {"column_id": "value_filter", "operator": "equal", "value": "a"}, + ] + + +def test_metric_rows_reject_unknown_sort(ops_app): + ops_app.add_specs([input_spec()]) + client = TestClient(ops_app) + + res = client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/catalog_tags/metrics/input_metrics/rows", + params={"sort_by": "not_configured"}, + ) + + assert res.status_code == 400 + assert "not_configured" in res.text + + +def test_metric_rows_return_configured_columns(ops_app): + ops_app.add_specs([input_spec()]) + client = TestClient(ops_app) + + res = client.get( + "/api/v1alpha3/pipelines/test_pipeline/ops-specs/catalog_tags/metrics/input_metrics/rows", + params={"sort_by": "id", "sort_dir": "asc"}, + ) + + assert res.status_code == 200 + payload = res.json() + assert payload["total"] == 2 + assert payload["rows"][0] == {"id": 1, "v": "a", "item_id": 1} + + +def test_frozen_rows_split_counts(ops_app): + with tempfile.TemporaryDirectory() as tmpdir: + dbconn = DBConn(f"sqlite+pysqlite3:///{tmpdir}/frozen.sqlite") + ds = DataStore(dbconn, create_meta_table=True) + catalog = Catalog({ + "detection_frozen_dataset": Table( + TableStoreDB( + name="detection_frozen_dataset", + dbconn=dbconn, + data_sql_schema=[ + Column("detection_frozen_dataset_id", String(), primary_key=True), + Column("detection_frozen_dataset__created_at", String()), + Column("detection_frozen_dataset__train_images_count", Integer()), + Column("detection_frozen_dataset__val_images_count", Integer()), + Column("detection_frozen_dataset__test_images_count", Integer()), + ], + create_table=True, + ) + ) + }) + dt = catalog.get_datatable(ds, "detection_frozen_dataset") + dt.store_chunk( + pd.DataFrame([ + { + "detection_frozen_dataset_id": "fd-1", + "detection_frozen_dataset__created_at": "2026-01-01T00:00:00", + "detection_frozen_dataset__train_images_count": 12, + "detection_frozen_dataset__val_images_count": 4, + "detection_frozen_dataset__test_images_count": 0, + } + ]) + ) + + spec = DatapipeOpsSpec( + id="cat_dog", + title="Cat/Dog", + description="Frozen datasets", + data=OpsDataSpec(tables=["detection_frozen_dataset"]), + frozen_dataset=OpsFrozenDatasetSpec( + table="detection_frozen_dataset", + id_column="detection_frozen_dataset_id", + created_at_column="detection_frozen_dataset__created_at", + split_columns={ + "train": "detection_frozen_dataset__train_images_count", + "val": "detection_frozen_dataset__val_images_count", + "test": "detection_frozen_dataset__test_images_count", + }, + columns=[ + OpsColumn( + "detection_frozen_dataset_id", + "Dataset", + "detection_frozen_dataset_id", + kind="link", + link_to="frozen_dataset", + ), + OpsColumn( + "created_at", + "Frozen at", + "detection_frozen_dataset__created_at", + kind="datetime", + ), + OpsColumn("split", "Split", "split", kind="split"), + ], + ), + ) + api = DatapipeAPI(ds, catalog, Pipeline([]), pipeline_id="test_pipeline") + api.add_specs([spec]) + client = TestClient(api) + + res = client.get("/api/v1alpha3/pipelines/test_pipeline/ops-specs/cat_dog/frozen-datasets") + assert res.status_code == 200 + payload = res.json() + assert payload["rows"][0]["split"] == "12 / 4 / 0" + diff --git a/libs/datapipe-app-ml-ops/tests/test_sql_analytics.py b/libs/datapipe-app-ml-ops/tests/test_sql_analytics.py new file mode 100644 index 000000000..f9a9bb8af --- /dev/null +++ b/libs/datapipe-app-ml-ops/tests/test_sql_analytics.py @@ -0,0 +1,37 @@ +from datapipe_app.ops.specs import OpsColumn, OpsMetricTableSpec +from datapipe_app_ml_ops.observability.analytics.sql_analytics import build_sql_analytics_context +from datapipe_app_ml_ops.ops.ops_specs import DatapipeOpsSpec, OpsDataSpec +from datapipe_app_ml_ops.ops.spec_registry import OpsSpecRegistry + + +def test_build_sql_analytics_context_maps_spec_tables() -> None: + registry = OpsSpecRegistry() + registry.add_many( + [ + DatapipeOpsSpec( + id="demo", + title="Demo", + data=OpsDataSpec(tables=["pipeline_model__metrics_on_subset"]), + metrics=[ + OpsMetricTableSpec( + id="model_metrics", + title="Model metrics", + table="pipeline_model__metrics_on_subset", + metric_source="pipeline_model__metrics_on_subset", + primary_key_columns=["detection_model_id", "subset_id"], + entity_links={"model": "detection_model_id", "subset": "subset_id"}, + primary_columns=[ + OpsColumn("detection_model_id", "model", "detection_model_id"), + OpsColumn("subset_id", "subset", "subset_id"), + ], + metric_columns=[OpsColumn("f1", "F1", "calc__weighted_f1_score")], + ) + ], + ) + ] + ) + + ctx = build_sql_analytics_context(registry) + + assert ctx.schema_tables[0]["name"] == "metrics_on_subset" + assert ctx.schema_tables[0]["physical_table"] == "pipeline_model__metrics_on_subset" diff --git a/libs/datapipe-app/CHANGELOG.md b/libs/datapipe-app/CHANGELOG.md index 9bf8d32b4..1549ab538 100644 --- a/libs/datapipe-app/CHANGELOG.md +++ b/libs/datapipe-app/CHANGELOG.md @@ -1,3 +1,45 @@ +# Unreleased (WIP) + +## Package layout + +* Restructured into `app/`, `api/`, `observability/`, `ops/`, `pipeline/` +* Ops UI moved out of this package — install `[ui]` / `[ml]` extras + (`datapipe-ui`, `datapipe-ui-ml`, `datapipe-app-ml-ops`) +* Frontend static assets resolved via `datapipe.ui_static` entry points +* Requires Python `>=3.10,<3.14` + +## Ops API (`/api/v1alpha3`) + +* New Ops API: pipeline overview, capabilities/settings, runs lifecycle + (`list` / `get` / `start` / logs), stage recent-runs, transform metadata + reset, catalog metrics, and plugin extension registration +* Spec-driven Ops surface via `OpsSpecRegistry` / `add_specs()`: + `OpsMetricTableSpec`, `OpsRelationSpec`, `OpsDataSpec`, filters/columns +* Pipeline debug graph UI routes (`/graph`, table/transform data, + websocket run status) live under the Ops app + +## Observability + +* Persist pipeline runs (`ObservabilityStore`, `RunRecorder` / + `RecordingRunCallback`) with optional CLI recording + (`DATAPIPE_APP_RECORD_CLI_RUNS`, `--no-callbacks`) +* Buffered run log capture; optional ClickHouse backend + (`RunLogsBackend.clickhouse`, extra `[clickhouse]`) +* Entry points wired into core CLI: + `datapipe.pipeline_init`, `datapipe.run_callbacks`, `datapipe.db_create_all` +* Settings: `DATAPIPE_APP_PIPELINE_ID`, `DATAPIPE_APP_SHOW_STEP_STATUS`, + `DATAPIPE_APP_RECORD_CLI_RUNS`, + `DATAPIPE_APP_CREATE_OBSERVABILITY_TABLES` (default `false` — no DDL on + `DatapipeAPI` / `ObservabilityStore` construct; use Alembic or + `datapipe db create-all`, or pass `create_observability_tables=True` / + `create_tables=True`) + +## Compatibility + +* Existing `/api/v1alpha1` and `/api/v1alpha2` kept (moved under `api/`) +* Public exports lazy-loaded from `datapipe_app` (`DatapipeAPI`, ops specs, + observability helpers) + # 0.5.4 * Improve granularity of prometheus metrics latency buckets diff --git a/libs/datapipe-app/Makefile b/libs/datapipe-app/Makefile index 334734f31..5eeb6cc88 100644 --- a/libs/datapipe-app/Makefile +++ b/libs/datapipe-app/Makefile @@ -1,12 +1,20 @@ +HOST_UID := $(shell id -u) +HOST_GID := $(shell id -g) +UI_ROOT := $(abspath ../datapipe-ui) +FRONTEND_VOLUMES = -v $(UI_ROOT):/app -v $(CURDIR)/../datapipe-ui/datapipe_ui/static:/app/build -w /app +DOCKER_RUN_NODE = docker run --rm --user $(HOST_UID):$(HOST_GID) -e HOME=/tmp $(FRONTEND_VOLUMES) + build-example: - docker build -f examples/datapipe_app/Dockerfile . + docker build -f ../../examples/datapipe_app/Dockerfile ../.. build-frontend: - docker run --rm -v ${CURDIR}/frontend:/app -v ${CURDIR}/datapipe_app/frontend:/app/build -w /app node:18.7.0-slim yarn - docker run --rm -v ${CURDIR}/frontend:/app -v ${CURDIR}/datapipe_app/frontend:/app/build -w /app node:18.7.0-slim yarn build + $(DOCKER_RUN_NODE) node:18.7.0-slim yarn + $(DOCKER_RUN_NODE) node:18.7.0-slim yarn build + cd ../datapipe-ui && bash scripts/copy-static.sh -build: build-frontend - uv build --package datapipe-app +build-ui: + cd ../datapipe-ui && yarn build:package + uv build --package datapipe-ui lint: black --line-length=120 datapipe_app diff --git a/libs/datapipe-app/README.md b/libs/datapipe-app/README.md index b15714971..2d7d559f0 100644 --- a/libs/datapipe-app/README.md +++ b/libs/datapipe-app/README.md @@ -1,23 +1,30 @@ # datapipe-app -`datapipe-app` implements two aspects to make every [datapipe](https://github.com/epoch8/datapipe) pipeline to work as -an application. +FastAPI REST API, `datapipe` CLI, and observability hooks for Datapipe pipelines. The Ops UI is **not** embedded here — it ships in [`datapipe-ui`](../datapipe-ui/) (core) and [`datapipe-ui-ml`](../datapipe-ui-ml/) (ML plugin SPA). ML API extensions live in [`datapipe-app-ml-ops`](../datapipe-app-ml-ops/). -From the monorepo root: +## Install ```bash -uv sync --package datapipe-app --package datapipe-core --extra sqlite -uv run pytest libs/datapipe-app/tests -``` +# API only +uv pip install -e "libs/datapipe-app" -1. REST API + debug UI based of FastAPI -1. `datapipe` CLI tool +# API + Ops UI +uv pip install -e "libs/datapipe-app[ui]" -## Common usage +# API + UI + ML ops backend + ML UI plugin +uv pip install -e "libs/datapipe-app[ml]" +``` -Common pattern to use `datapipe-app` is to create `app.py` with the following code: +Build static assets before running the API locally: +```bash +make -C libs/datapipe-ui build-package # core-only UI +make -C libs/datapipe-ui-ml build-package # ML UI (preferred when [ml] extra is installed) ``` + +## Usage + +```python from datapipe_app import DatapipeApp from pipeline import ds, catalog, pipeline @@ -25,22 +32,34 @@ from pipeline import ds, catalog, pipeline app = DatapipeApp(ds, catalog, pipeline) ``` -Where `pipeline` is a module that defines common elements: `ds`, `catalog` and -`pipeline`. - -## REST API + UI +`DatapipeAPI` adds the Ops dashboard (`/`) and debug graph UI (`/graph`). Start with: -`DatapipeApp` inherits from `FastApi` app and can be started with datapipe CLI -or directly with server like `uvicorn`. - -``` +```bash datapipe --pipeline app:app api ``` -### UI +Ops API: `/api/v1alpha3/runs`, `/pipelines/{id}`, spec-driven `/ops-specs/*`, catalog metrics under `/pipelines/{id}/metrics/*`. + +Optional env: `DATAPIPE_APP_PIPELINE_ID` (default pipeline id for single-pipeline apps). +Observability DDL is **off by default** — use Alembic / `datapipe db create-all`, or set +`DATAPIPE_APP_CREATE_OBSERVABILITY_TABLES=true` / `DatapipeAPI(..., create_observability_tables=True)`. + +## Makefile + +From `libs/datapipe-app`: + +| Target | Description | +|--------|-------------| +| `make build-ui` | Build frontend + `datapipe-ui` Python wheel | +| `make build-frontend` | Same via Docker (Node 18) | +| `make lint` | black, flake8, mypy | +| `make build-example` | Docker image for `examples/datapipe_app` | -![Datapipe App UI](docs/datapipe-example-app.png) +## Tests -### REST API +```bash +uv sync --package datapipe-app --package datapipe-core --extra sqlite +uv run pytest libs/datapipe-app/tests +``` -API documentation can be found at `/api/v1alpha1/docs` sub URL. +CI: `.github/workflows/lib-datapipe-app.yml` diff --git a/libs/datapipe-app/datapipe_app/__init__.py b/libs/datapipe-app/datapipe_app/__init__.py index b2525088f..31f8265af 100644 --- a/libs/datapipe-app/datapipe_app/__init__.py +++ b/libs/datapipe-app/datapipe_app/__init__.py @@ -1,3 +1,45 @@ -from datapipe_app.datapipe_api import DatapipeAPI, setup_logging +"""Datapipe app package.""" -__all__ = ["DatapipeAPI", "setup_logging"] +_LAZY_EXPORTS = { + "DatapipeAPI": ("datapipe_app.app.datapipe_api", "DatapipeAPI"), + "DatapipeApp": ("datapipe.compute", "DatapipeApp"), + "setup_logging": ("datapipe_app.app.datapipe_api", "setup_logging"), + "RunLogsBackend": ("datapipe_app.observability.run_logs", "RunLogsBackend"), + "ObservabilityTableConfig": ("datapipe_app.observability.config.tables", "ObservabilityTableConfig"), + "OpsSpecRegistry": ("datapipe_app.ops.spec_registry", "OpsSpecRegistry"), + "OpsColumn": ("datapipe_app.ops.specs", "OpsColumn"), + "OpsColumnGroup": ("datapipe_app.ops.specs", "OpsColumnGroup"), + "OpsFilterRule": ("datapipe_app.ops.specs", "OpsFilterRule"), + "OpsMetricTableSpec": ("datapipe_app.ops.specs", "OpsMetricTableSpec"), + "OpsRelationSpec": ("datapipe_app.ops.specs", "OpsRelationSpec"), + "OpsTableRef": ("datapipe_app.ops.specs", "OpsTableRef"), + "register_observability_tables_in_metadata": ( + "datapipe_app.app.db_schema", + "register_observability_tables_in_metadata", + ), +} + + +def __getattr__(name: str): + if name not in _LAZY_EXPORTS: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + module_name, attr_name = _LAZY_EXPORTS[name] + module = __import__(module_name, fromlist=[attr_name]) + return getattr(module, attr_name) + + +__all__ = [ + "DatapipeAPI", + "DatapipeApp", + "ObservabilityTableConfig", + "RunLogsBackend", + "OpsColumn", + "OpsColumnGroup", + "OpsFilterRule", + "OpsMetricTableSpec", + "OpsRelationSpec", + "OpsSpecRegistry", + "OpsTableRef", + "register_observability_tables_in_metadata", + "setup_logging", +] diff --git a/libs/datapipe-app/datapipe_app/api/__init__.py b/libs/datapipe-app/datapipe_app/api/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app/datapipe_app/api_v1alpha1.py b/libs/datapipe-app/datapipe_app/api/v1alpha1.py similarity index 97% rename from libs/datapipe-app/datapipe_app/api_v1alpha1.py rename to libs/datapipe-app/datapipe_app/api/v1alpha1.py index 6636bda73..ad6c56d64 100644 --- a/libs/datapipe-app/datapipe_app/api_v1alpha1.py +++ b/libs/datapipe-app/datapipe_app/api/v1alpha1.py @@ -15,11 +15,12 @@ from fastapi import BackgroundTasks, FastAPI, Query, Response from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from pydantic import BaseModel, Field -from sqlalchemy.sql.expression import and_, asc, desc, select, text +from sqlalchemy.sql.expression import and_, asc, desc, select from sqlalchemy.sql.functions import count -from datapipe_app.meta_sql import require_sql_table_meta -from datapipe_app.settings import API_SETTINGS +from datapipe_app.app.meta_sql import require_sql_table_meta +from datapipe_app.app.settings import API_SETTINGS +from datapipe_app.sql.query import apply_table_order_by class PipelineStepResponse(BaseModel): @@ -232,8 +233,7 @@ def get_data_post(ds: DataStore, catalog: Catalog, req: GetDataRequest) -> GetDa # Data table has no delete_ts # sql = sql.where(sql_table.c.delete_ts.is_(None)) if req.order_by: - sql = sql.where(text(f"{req.order_by} is not null")) - sql = sql.order_by(text(f"{req.order_by} {req.order}")) + sql = apply_table_order_by(sql, sql_table, req.order_by, req.order) sql = sql.offset(req.page * req.page_size).limit(req.page_size) for col, val in req.filters.items(): diff --git a/libs/datapipe-app/datapipe_app/api_v1alpha2.py b/libs/datapipe-app/datapipe_app/api/v1alpha2.py similarity index 96% rename from libs/datapipe-app/datapipe_app/api_v1alpha2.py rename to libs/datapipe-app/datapipe_app/api/v1alpha2.py index f50567bd1..13c73539b 100644 --- a/libs/datapipe-app/datapipe_app/api_v1alpha2.py +++ b/libs/datapipe-app/datapipe_app/api/v1alpha2.py @@ -12,12 +12,13 @@ from datapipe.types import IndexDF, Labels from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor -from sqlalchemy.sql.expression import and_, or_, select, text +from sqlalchemy.sql.expression import and_, or_, select from sqlalchemy.sql.functions import count, func -from datapipe_app import models -from datapipe_app.meta_sql import require_sql_transform_meta -from datapipe_app.settings import API_SETTINGS +from datapipe_app.app import models +from datapipe_app.sql.query import apply_table_order_by +from datapipe_app.app.meta_sql import require_sql_transform_meta +from datapipe_app.app.settings import API_SETTINGS def get_table_store_db_data(table_store: TableStoreDB, req: models.GetDataRequest) -> models.GetDataResponse: @@ -38,8 +39,7 @@ def get_table_store_db_data(table_store: TableStoreDB, req: models.GetDataReques sql_count = select(count()).select_from(sql.subquery()) if req.order_by: - sql = sql.where(text(f"{req.order_by} is not null")) - sql = sql.order_by(text(f"{req.order_by} {req.order}")) + sql = apply_table_order_by(sql, sql_table, req.order_by, req.order) sql.offset(req.page * req.page_size).limit(req.page_size) @@ -92,8 +92,7 @@ def get_transform_data(step: BaseBatchTransformStep, req: models.GetDataRequest) sql_count = select(count()).select_from(sql.subquery()) if req.order_by: - sql = sql.where(text(f"{req.order_by} is not null")) - sql = sql.order_by(text(f"{req.order_by} {req.order}")) + sql = apply_table_order_by(sql, sql_table, req.order_by, req.order) sql = sql.offset(req.page * req.page_size).limit(req.page_size) diff --git a/libs/datapipe-app/datapipe_app/api/v1alpha3.py b/libs/datapipe-app/datapipe_app/api/v1alpha3.py new file mode 100644 index 000000000..49c8c9a8d --- /dev/null +++ b/libs/datapipe-app/datapipe_app/api/v1alpha3.py @@ -0,0 +1,527 @@ +from __future__ import annotations + +import importlib.metadata +import threading +from datetime import datetime +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple + +from datapipe.compute import Catalog, ComputeStep, DataStore, Pipeline, run_steps +from datapipe.executor import Executor +from datapipe.run_config import RunConfig +from datapipe.step.batch_transform import BaseBatchTransformStep +from fastapi import BackgroundTasks, FastAPI, HTTPException, Query +from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor +from pydantic import BaseModel + +from datapipe_app.api.v1alpha1 import filter_steps_by_labels +from datapipe_app.observability.config.settings import get_ops_settings +from datapipe_app.observability.extensions import register_v1alpha3_extensions +from datapipe_app.observability.graph.discovery import build_stage_edges, build_stage_summary +from datapipe_app.observability.graph.label_graph import build_label_graph +from datapipe_app.observability.plugins.registry import ObservabilityRegistry +from datapipe_app.observability.plugins.schemas import StartRunRequest, StartRunResponse +from datapipe_app.observability.runs.recorder import RunRecorder +from datapipe_app.observability.runs.run_scope import ( + derive_run_scope, + labels_from_json, + labels_to_json, + trigger_from_labels, +) +from datapipe_app.observability.store.db import ObservabilityStore, PipelineRunRow +from datapipe_app.ops.spec_registry import OpsSpecRegistry +from datapipe_app.pipeline.pipeline_ui import register_pipeline_ui_routes + +if TYPE_CHECKING: + from datapipe_app.app.datapipe_api import DatapipeAPI + + +class ResetTransformMetadataResponse(BaseModel): + transform_name: str + status: str = "ok" + + +class CapabilitiesResponse(BaseModel): + ml_metrics: bool + ml_training: bool + pipeline_id: Optional[str] = None + run_logs_configured: bool = False + + +class SettingsResponse(BaseModel): + pipeline_id: Optional[str] + observability_db_connected: bool + version: str + run_logs_configured: bool = False + + +def _step_compatible_with_pk_filters(step: ComputeStep, filter_keys: set[str]) -> bool: + """Skip steps where a PK RunConfig filter would delete scoped rows. + + ``OpsTrainingRequestSpec`` launches with ``filters={id_column: [request_id]}``. + Datapipe stamps filters that are not transform keys onto the batch idx; + ``store_chunk`` then treats matching output primary keys as + ``processed_idx`` and deletes missing rows. Auto-request materialization + (transform keys = dataset × config, output PK = request id) would wipe the + manual request being launched. Skip those steps for filtered runs; they + still run on unfiltered ``labels=…`` CLI trains. + """ + if not filter_keys: + return True + if not isinstance(step, BaseBatchTransformStep): + return True + stamped_extras = filter_keys - set(step.transform_keys) + if not stamped_extras: + return True + for out in step.output_dts: + if stamped_extras & set(out.dt.primary_keys): + return False + return True + + +def make_run_steps_callable( + *, + ds: DataStore, + steps: List[ComputeStep], + recorder: Optional[RunRecorder], + resolve_executor: Callable[[], Executor | None], +) -> Callable[[str, Sequence[Tuple[str, str]], Dict[str, List[Any]]], Dict[str, Any]]: + """Build the ``run_steps`` callback passed to v1alpha3 extensions (spec §18). + + The returned callable selects steps by ``run_labels`` and runs them with a + primary-key ``RunConfig`` filter so only the requested row is materialized. + Single-element list filter values are unwrapped to scalars because + ``RunConfig.filters`` applies equality on primary keys. + + Steps incompatible with those PK filters (see + ``_step_compatible_with_pk_filters``) are omitted from the filtered run. + + Execution is always started in a background thread so the HTTP request can + return the ``run_id`` immediately (UI navigates to the run page). + """ + + def _run_steps_for_request( + request_id: str, + run_labels: Sequence[Tuple[str, str]], + filters: Dict[str, List[Any]], + ) -> Dict[str, Any]: + labels = list(run_labels) + selected = filter_steps_by_labels(steps, labels=labels) if labels else list(steps) + filter_keys = set(filters.keys()) + if filter_keys: + selected = [s for s in selected if _step_compatible_with_pk_filters(s, filter_keys)] + if not selected: + return {"started": False, "run_id": None} + + run_config_filters = { + key: (value[0] if isinstance(value, (list, tuple)) and len(value) == 1 else value) + for key, value in filters.items() + } + run_config = RunConfig(filters=run_config_filters) + + if recorder is not None: + trigger = trigger_from_labels(labels) + labels_json = labels_to_json(labels) + cb = recorder.create_callback(trigger=trigger, labels_json=labels_json) + run_config = RunConfig.with_callback(run_config, cb) + + def _execute() -> None: + try: + run_steps( + ds=ds, + steps=selected, + run_config=RunConfig.with_callback(run_config, cb), + executor=resolve_executor(), + ) + except BaseException: + # Failure / interrupt already recorded via the RunCallback hooks. + return + + thread = threading.Thread( + target=_execute, + name=f"datapipe-run-{cb.run_id}", + daemon=True, + ) + thread.start() + return {"started": True, "run_id": cb.run_id} + + def _execute_unrecorded() -> None: + try: + run_steps( + ds=ds, + steps=selected, + run_config=run_config, + executor=resolve_executor(), + ) + except Exception: + return + + threading.Thread( + target=_execute_unrecorded, + name=f"datapipe-run-{request_id}", + daemon=True, + ).start() + return {"started": True, "run_id": None} + + return _run_steps_for_request + + +def make_app( + store: ObservabilityStore, + registry: ObservabilityRegistry, + *, + ds: DataStore, + catalog: Catalog, + pipeline: Pipeline, + steps: List[ComputeStep], + recorder: Optional[RunRecorder] = None, + ops_specs: Optional[OpsSpecRegistry] = None, + executor: Executor | None = None, + executor_host: Optional["DatapipeAPI"] = None, +) -> FastAPI: + app = FastAPI(title="Datapipe Ops API v1alpha3") + ops_spec_registry = ops_specs or OpsSpecRegistry() + + def _resolve_executor() -> Executor | None: + if executor_host is not None: + return executor_host.executor + return executor + + def _pipeline_id() -> Optional[str]: + return get_ops_settings().pipeline_id + + def _require_pipeline(requested_pipeline_id: str) -> None: + pid = _pipeline_id() + if not pid or pid != requested_pipeline_id: + raise HTTPException(404, f"Pipeline {requested_pipeline_id} not available on this instance") + + def _has_catalog_metrics() -> bool: + return any(table_spec.best_metric_column for spec in ops_spec_registry.list() for table_spec in spec.metrics) + + @app.get("/capabilities", response_model=CapabilitiesResponse) + def get_capabilities() -> CapabilitiesResponse: + has_ml_plugin = len(registry.enrichers) > 0 or len(registry.collectors) > 0 + return CapabilitiesResponse( + ml_metrics=has_ml_plugin and _has_catalog_metrics(), + ml_training=has_ml_plugin, + pipeline_id=get_ops_settings().pipeline_id, + run_logs_configured=store.run_logs_configured, + ) + + @app.get("/settings", response_model=SettingsResponse) + def get_settings() -> SettingsResponse: + try: + importlib.metadata.version("datapipe-app") + version = importlib.metadata.version("datapipe-app") + except Exception: + version = "unknown" + connected = False + try: + with store.session() as session: + session.connection() + connected = True + except Exception: + pass + return SettingsResponse( + pipeline_id=get_ops_settings().pipeline_id, + observability_db_connected=connected, + version=version, + run_logs_configured=store.run_logs_configured, + ) + + def _serialize_recent_runs(runs: list[Any]) -> list[dict[str, Any]]: + return [ + { + "run_id": r.run_id, + "status": r.status, + "started_at": r.started_at.isoformat() if r.started_at else None, + "finished_at": r.finished_at.isoformat() if r.finished_at else None, + "trigger": r.trigger, + } + for r in runs + ] + + @app.get("/pipelines/{pipeline_id}") + def get_pipeline_detail(pipeline_id: str) -> dict[str, Any]: + reg = store.get_pipeline(pipeline_id) + if reg is None: + raise HTTPException(404, f"Pipeline {pipeline_id} not found") + + last_run = store.get_last_run(pipeline_id) + recent_runs = store.list_recent_runs(pipeline_id) + + stages: list[dict[str, Any]] = [] + stage_edges: list[dict[str, Any]] = [] + label_graph: dict[str, Any] | None = None + if get_ops_settings().pipeline_id == pipeline_id: + status_cache: dict[str, dict[str, Any]] = {} + stages = build_stage_summary(steps, ds, status_cache) + stage_edges = build_stage_edges(steps) + label_graph = build_label_graph(steps, ds, status_cache=status_cache) + + enrichments: list[dict[str, Any]] = [] + for enricher in registry.enrichers: + try: + enrichments.extend( + enricher.enrich_pipeline_detail( + pipeline_id=pipeline_id, + ds=ds, + catalog=catalog, + store=store, + ) + ) + except Exception: + pass + + for collector in registry.collectors: + try: + rows = collector.collect_pipeline_status( + pipeline_id=pipeline_id, + ds=ds, + catalog=catalog, + ) + if rows: + enrichments.append({"type": "ml_training", "payload": {"rows": rows}}) + except Exception: + pass + + return { + "pipeline_id": pipeline_id, + "display_name": reg.display_name, + "task_type": reg.task_type, + "health": "failed" if last_run and last_run.status == "failed" else "healthy", + "stages": stages, + "stage_edges": stage_edges, + "label_graph": label_graph, + "recent_runs": _serialize_recent_runs(recent_runs), + "last_error": last_run.error if last_run else None, + "enrichments": enrichments, + } + + @app.get("/pipelines/{pipeline_id}/stages/{stage_name}/recent-runs") + def get_stage_recent_runs(pipeline_id: str, stage_name: str, limit: int = 10) -> dict[str, Any]: + reg = store.get_pipeline(pipeline_id) + if reg is None: + raise HTTPException(404, f"Pipeline {pipeline_id} not found") + if get_ops_settings().pipeline_id != pipeline_id: + return {"pipeline_id": pipeline_id, "stage": stage_name, "recent_runs": []} + + stage_steps = filter_steps_by_labels(steps, labels=[("stage", stage_name)]) + if not stage_steps: + return {"pipeline_id": pipeline_id, "stage": stage_name, "recent_runs": []} + + stage_step_names = [s.name for s in stage_steps] + runs = store.list_recent_runs_for_stage( + pipeline_id, + stage_step_names, + stage_name=stage_name, + limit=min(limit, 50), + ) + return { + "pipeline_id": pipeline_id, + "stage": stage_name, + "recent_runs": _serialize_recent_runs(runs), + } + + def _serialize_run_list_row(run: PipelineRunRow) -> dict[str, Any]: + labels = labels_from_json(run.labels_json) + scope = derive_run_scope(labels=labels, trigger=run.trigger) + duration_s: int | None = None + if run.started_at and run.finished_at: + duration_s = int((run.finished_at - run.started_at).total_seconds()) + return { + "run_id": run.run_id, + "pipeline_id": run.pipeline_id, + "status": run.status, + "scope": scope["run_scope"], + "target_label": scope.get("target_label_display"), + "started_at": run.started_at.isoformat() if run.started_at else None, + "finished_at": run.finished_at.isoformat() if run.finished_at else None, + "duration_s": duration_s, + "trigger": run.trigger, + } + + @app.get("/runs") + def list_runs( + pipeline_id: Optional[str] = None, + status: Optional[str] = None, + stage: Optional[str] = None, + trigger: Optional[str] = None, + search: Optional[str] = None, + from_: Optional[str] = Query(None, alias="from"), + to: Optional[str] = None, + limit: int = 25, + offset: int = 0, + sort_by: str = "started_at", + sort_dir: Literal["asc", "desc"] = "desc", + ) -> dict[str, Any]: + pid = pipeline_id or _pipeline_id() + from_parsed = datetime.fromisoformat(from_) if from_ else None + to_parsed = datetime.fromisoformat(to) if to else None + rows, total, filters, counts_by_status = store.list_runs( + pipeline_id=pid, + status=status, + stage=stage, + trigger=trigger, + search=search, + from_dt=from_parsed, + to_dt=to_parsed, + sort_by=sort_by, + sort_dir=sort_dir, + limit=min(limit, 200), + offset=offset, + ) + return { + "rows": [_serialize_run_list_row(r) for r in rows], + "total": total, + "filters": filters, + "counts_by_status": counts_by_status, + } + + @app.get("/runs/{run_id}") + def get_run(run_id: str) -> dict[str, Any]: + run = store.get_run(run_id) + if run is None: + raise HTTPException(404, f"Run {run_id} not found") + steps_rows = store.get_run_steps(run_id) + labels = labels_from_json(run.labels_json) + scope = derive_run_scope(labels=labels, trigger=run.trigger) + return { + "run_id": run.run_id, + "pipeline_id": run.pipeline_id, + "status": run.status, + "started_at": run.started_at.isoformat() if run.started_at else None, + "finished_at": run.finished_at.isoformat() if run.finished_at else None, + "error": run.error, + "trigger": run.trigger, + **scope, + "steps": [ + { + "step_name": s.step_name, + "status": s.status, + "started_at": s.started_at.isoformat() if s.started_at else None, + "finished_at": s.finished_at.isoformat() if s.finished_at else None, + "processed": s.processed, + "total": s.total, + "error": s.error, + } + for s in steps_rows + ], + } + + @app.get("/runs/{run_id}/logs") + def get_run_logs( + run_id: str, + after: int = 0, + limit: int = 500, + ) -> dict[str, Any]: + run = store.get_run(run_id) + if run is None: + raise HTTPException(404, f"Run {run_id} not found") + from datapipe_app.observability.logging.log_buffer import get_log_buffer + + buf = get_log_buffer(store) + lines = buf.get_lines(run_id, after=after, limit=min(limit, 1000)) + max_seq = buf.get_max_seq(run_id) + return { + "run_id": run_id, + "lines": [ + { + "seq": ln.seq, + "logged_at": ln.logged_at, + "level": ln.level, + "message": ln.message, + } + for ln in lines + ], + "last_seq": lines[-1].seq if lines else after, + "max_seq": max_seq, + } + + @app.post("/runs", response_model=StartRunResponse) + def start_run(req: StartRunRequest, background_tasks: BackgroundTasks) -> StartRunResponse: + pid = _pipeline_id() + if not pid: + raise HTTPException(400, "PIPELINE_ID not configured") + _require_pipeline(pid) + assert recorder is not None + + selected = filter_steps_by_labels(steps, labels=req.labels) if req.labels else steps + trigger = trigger_from_labels(req.labels) + labels_json = labels_to_json(req.labels) + + if req.background: + cb = recorder.create_callback(trigger=trigger, labels_json=labels_json) + + def _execute() -> None: + try: + run_steps( + ds=ds, + steps=selected, + run_config=RunConfig(callback=cb), + executor=_resolve_executor(), + ) + except BaseException: + # Failure / interrupt already recorded via RunCallback hooks. + return + + background_tasks.add_task(_execute) + return StartRunResponse(run_id=cb.run_id, status="running") + + cb = recorder.create_callback(trigger=trigger, labels_json=labels_json) + try: + run_steps( + ds=ds, + steps=selected, + run_config=RunConfig(callback=cb), + executor=_resolve_executor(), + ) + except Exception as exc: + raise HTTPException(500, str(exc)) from exc + return StartRunResponse(run_id=cb.run_id, status="completed") + + @app.post( + "/pipelines/{pipeline_id}/transforms/{transform_name}/reset-metadata", + response_model=ResetTransformMetadataResponse, + ) + def reset_transform_metadata(pipeline_id: str, transform_name: str) -> ResetTransformMetadataResponse: + _require_pipeline(pipeline_id) + + filtered_steps = filter_steps_by_labels(steps, name_prefix=transform_name) + if len(filtered_steps) != 1: + raise HTTPException(404, f"Transform {transform_name} not found") + step = filtered_steps[0] + if not isinstance(step, BaseBatchTransformStep): + raise HTTPException(400, f"Transform {transform_name} does not have SQL metadata") + step.reset_metadata(ds) + return ResetTransformMetadataResponse(transform_name=transform_name) + + register_v1alpha3_extensions( + app=app, + store=store, + registry=registry, + ds=ds, + catalog=catalog, + ops_spec_registry=ops_spec_registry, + recorder=recorder, + steps=steps, + pipeline=pipeline, + run_steps=make_run_steps_callable( + ds=ds, + steps=steps, + recorder=recorder, + resolve_executor=_resolve_executor, + ), + ) + + register_pipeline_ui_routes( + app, + ds=ds, + catalog=catalog, + pipeline=pipeline, + steps=steps, + recorder=recorder, + executor=_resolve_executor, + ) + + FastAPIInstrumentor.instrument_app(app, excluded_urls="docs") + return app diff --git a/libs/datapipe-app/datapipe_app/app/__init__.py b/libs/datapipe-app/datapipe_app/app/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/datapipe-app/datapipe_app/app/cli.py b/libs/datapipe-app/datapipe_app/app/cli.py new file mode 100644 index 000000000..22175fa2d --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/cli.py @@ -0,0 +1,27 @@ +import click + +from datapipe_app import DatapipeAPI + + +def register_commands(cli: click.Group): + @cli.command() + @click.option("--host", type=click.STRING, default="0.0.0.0") + @click.option("--port", type=click.INT, default=8000) + @click.pass_context + def api(ctx: click.Context, host: str, port: int) -> None: + parent = ctx.parent + assert parent is not None + pipeline = ctx.obj["pipeline"] + pipeline_spec = parent.params.get("pipeline", "app") + executor = parent.obj.get("executor") + + import uvicorn + + if isinstance(pipeline, DatapipeAPI): + api_app = pipeline + if executor is not None: + api_app.executor = executor + else: + api_app = DatapipeAPI(app=pipeline, pipeline_spec=pipeline_spec, executor=executor) + + uvicorn.run(api_app, host=host, port=port) diff --git a/libs/datapipe-app/datapipe_app/app/datapipe_api.py b/libs/datapipe-app/datapipe_app/app/datapipe_api.py new file mode 100644 index 000000000..053d6aaab --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/datapipe_api.py @@ -0,0 +1,286 @@ +import logging +import os.path +import sys +from contextlib import asynccontextmanager +from types import ModuleType +from typing import Optional + +from datapipe.compute import Catalog, DatapipeApp, Pipeline +from datapipe.datatable import DataStore +from datapipe.executor import Executor +from datapipe.store.database import DBConn +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles + +import datapipe_app.api.v1alpha1 as api_v1alpha1 +import datapipe_app.api.v1alpha2 as api_v1alpha2 +import datapipe_app.api.v1alpha3 as api_v1alpha3 +from datapipe_app.app.metrics import setup_prometheus_metrics +from datapipe_app.app.ops_specs import OpsSpecsMixin +from datapipe_app.ops.spec_registry import OpsSpecRegistry +from datapipe_app.pipeline.pipeline_binding import pipeline_module_for +from datapipe_app.observability.store.db import ObservabilityStore +from datapipe_app.observability.connections.dbconn import dbconn_same_target +from datapipe_app.observability.logging.log_buffer import get_log_buffer +from datapipe_app.observability.runs.recorder import RunRecorder +from datapipe_app.observability.plugins.registry import ObservabilityRegistry, load_observability_plugins +from datapipe_app.observability.run_logs import RunLogsBackend, warn_if_run_logs_backend_missing +from datapipe_app.observability.config.settings import OpsSettings, configure_active_ops, resolve_ops_settings +from datapipe_app.observability.config.tables import ( + ObservabilityTableConfig, + ensure_observability_tables_compatible_with_pipeline, +) + +from datapipe_app.app.frontend_static import resolve_frontend_dir + +logger = logging.getLogger(__name__) + + +def _resolve_observability_dbconn( + ds: DataStore, + observability_dbconn: Optional[DBConn], +) -> DBConn: + if observability_dbconn is not None: + return observability_dbconn + return ds.meta_dbconn + + +def _make_lifespan(api: "DatapipeAPI"): + @asynccontextmanager + async def lifespan(_app: FastAPI): + yield + try: + from datapipe_app.observability.logging.log_buffer import get_log_buffer + + get_log_buffer(api.observability_store).flush_all() + except Exception: + logger.exception("Failed to flush run log buffers on shutdown") + + return lifespan + + +class DatapipeAPI(FastAPI, OpsSpecsMixin, DatapipeApp): + catalog: Catalog + pipeline: Pipeline + steps: list + ops_specs: OpsSpecRegistry + observability_registry: ObservabilityRegistry + observability_table_config: Optional[ObservabilityTableConfig] + observability_dbconn: DBConn + run_logs_backend: Optional[RunLogsBackend] + ops_settings: OpsSettings + executor: Executor | None + + def __init__( + self, + ds: Optional[DataStore] = None, + catalog: Optional[Catalog] = None, + pipeline: Optional[Pipeline] = None, + app: Optional[DatapipeApp] = None, + observability_table_config: Optional[ObservabilityTableConfig] = None, + pipeline_id: Optional[str] = None, + observability_dbconn: Optional[DBConn] = None, + run_logs_backend: Optional[RunLogsBackend] = None, + pipeline_spec: Optional[str] = None, + executor: Executor | None = None, + create_observability_tables: bool | None = None, + ): + self.observability_registry = ObservabilityRegistry() + load_observability_plugins(self.observability_registry) + + self.observability_table_config = observability_table_config + observability_tables = observability_table_config or ObservabilityTableConfig() + self.run_logs_backend = run_logs_backend + + if app is not None: + if isinstance(app, DatapipeAPI): + raise TypeError( + "Cannot wrap DatapipeAPI in DatapipeAPI. " + "Use the existing app instance directly (e.g. `datapipe --pipeline app:app api`)." + ) + self.ds = app.ds + self.catalog = app.catalog + self.pipeline = app.pipeline + self.steps = app.steps + self.ops_specs = OpsSpecRegistry() + else: + assert ds is not None and catalog is not None and pipeline is not None + DatapipeApp.__init__(self, ds, catalog, pipeline) + self.ops_specs = OpsSpecRegistry() + + if self.ds is None: + raise ValueError("DataStore is required") + + pipeline_module = pipeline_module_for(app) + explicit_pipeline_id = pipeline_id + self.ops_settings = resolve_ops_settings( + pipeline_id=explicit_pipeline_id, + pipeline_spec=pipeline_spec, + pipeline_module=pipeline_module, + ) + if create_observability_tables is not None: + self.ops_settings.create_observability_tables = create_observability_tables + configure_active_ops(self.ops_settings) + ops = self.ops_settings + self.executor = executor + + self.observability_dbconn = _resolve_observability_dbconn(self.ds, observability_dbconn) + + ensure_observability_tables_compatible_with_pipeline( + observability_dbconn=self.observability_dbconn, + pipeline_dbconn=self.ds.meta_dbconn, + config=observability_tables, + catalog=self.catalog, + ) + self.ops_specs.validate(self.catalog, self.ds, strict=True) + + self.observability_registry.attach_ops_specs(self.ops_specs) + + if dbconn_same_target(self.observability_dbconn, self.ds.meta_dbconn): + from datapipe_app.app.db_schema import register_observability_tables_in_metadata + + register_observability_tables_in_metadata( + self.ds.meta_dbconn, + tables=observability_tables, + ) + + warn_if_run_logs_backend_missing(self.run_logs_backend) + + FastAPI.__init__(self, lifespan=_make_lifespan(self)) + + self.observability_store = ObservabilityStore.from_dbconn( + self.observability_dbconn, + tables=observability_tables, + run_logs_backend=self.run_logs_backend, + create_tables=ops.create_observability_tables, + ) + self.run_recorder: Optional[RunRecorder] = None + if ops.pipeline_id: + try: + self.observability_store.register_pipeline( + ops.pipeline_id, + display_name=ops.pipeline_id.replace("_", " ").title(), + ) + except Exception: + logger.warning( + "Observability tables missing; skip pipeline registry update. " + "Create schema via Alembic / `datapipe db create-all`, or set " + "DATAPIPE_APP_CREATE_OBSERVABILITY_TABLES=true.", + exc_info=True, + ) + else: + self.run_recorder = RunRecorder( + self.observability_store, + ops.pipeline_id, + registry=self.observability_registry, + ds=self.ds, + catalog=self.catalog, + ops_specs=self.ops_specs, + log_buffer=get_log_buffer(self.observability_store), + ) + from datapipe_app.observability.runs.run_reconciler import reconcile_orphaned_runs_on_startup + + reconciled = reconcile_orphaned_runs_on_startup( + self.observability_store, + ops.pipeline_id, + ) + if reconciled: + logger.info( + "Marked %s orphaned run(s) as interrupted on startup: %s", + len(reconciled), + ", ".join(reconciled), + ) + + self.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + self.api = FastAPI() + + setup_prometheus_metrics( + app=self, + app_name="datapipe", + datapipe_app=self, + ) + self.api.mount( + "/v1alpha1", + api_v1alpha1.make_app(self.ds, self.catalog, self.pipeline, self.steps), + name="v1alpha1", + ) + self.api.mount( + "/v1alpha2", + api_v1alpha2.make_app(self.ds, self.catalog, self.pipeline, self.steps), + name="v1alpha2", + ) + self.api.mount( + "/v1alpha3", + api_v1alpha3.make_app( + self.observability_store, + self.observability_registry, + ds=self.ds, + catalog=self.catalog, + pipeline=self.pipeline, + steps=self.steps, + recorder=self.run_recorder, + ops_specs=self.ops_specs, + executor_host=self, + ), + name="v1alpha3", + ) + + self.mount("/api", self.api, name="api") + frontend_dir = resolve_frontend_dir() + if frontend_dir is not None: + self.mount( + "/static", + StaticFiles(directory=os.path.join(frontend_dir, "static")), + name="assets", + ) + + index_path = os.path.join(frontend_dir, "index.html") + + @self.get("/") + async def spa_index() -> FileResponse: + return FileResponse(index_path) + + @self.get("/{spa_path:path}") + async def spa_fallback(spa_path: str) -> FileResponse: + if spa_path.startswith("api") or spa_path.startswith("static"): + raise HTTPException(status_code=404) + asset_path = os.path.join(frontend_dir, spa_path) + if os.path.isfile(asset_path): + return FileResponse(asset_path) + return FileResponse(index_path) + else: + logger.warning( + "datapipe-ui is not installed; Ops UI static files will not be served. " + "Install with: pip install datapipe-app[ui]" + ) + + def refresh_ops_settings( + self, + *, + pipeline_module: ModuleType | None = None, + pipeline_spec: Optional[str] = None, + pipeline_id: Optional[str] = None, + ) -> None: + self.ops_settings = resolve_ops_settings( + pipeline_id=pipeline_id, + pipeline_spec=pipeline_spec, + pipeline_module=pipeline_module or pipeline_module_for(self), + ) + configure_active_ops(self.ops_settings) + + +def setup_logging(level=logging.INFO): + root_logger = logging.getLogger("datapipe") + root_logger.setLevel(level) + + handler = logging.StreamHandler(stream=sys.stdout) + root_logger.addHandler(handler) diff --git a/libs/datapipe-app/datapipe_app/app/db_schema.py b/libs/datapipe-app/datapipe_app/app/db_schema.py new file mode 100644 index 000000000..e93b0c84e --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/db_schema.py @@ -0,0 +1,127 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, cast + +from sqlalchemy import MetaData, Table +from sqlalchemy.orm import DeclarativeBase + +from datapipe_app.observability.config.tables import ObservabilityTableConfig +from datapipe_app.observability.extensions import run_observability_db_extensions + +if TYPE_CHECKING: + from datapipe.compute import DatapipeApp + from datapipe.store.database import DBConn + from datapipe_app.app.datapipe_api import DatapipeAPI + +metadata = MetaData() + + +class ObservabilityBase(DeclarativeBase): + metadata = metadata + + +def apply_observability_table_config( + tables: ObservabilityTableConfig, + schema: str | None, +) -> None: + from datapipe_app.observability.store.db import ( + PipelineRegistryRow, + PipelineRunRow, + PipelineRunStepRow, + ) + + mapping: dict[type[ObservabilityBase], str] = { + PipelineRegistryRow: tables.pipeline_registry, + PipelineRunRow: tables.pipeline_runs, + PipelineRunStepRow: tables.pipeline_run_steps, + } + for model_cls, table_name in mapping.items(): + table = cast(Table, model_cls.__table__) + table.name = table_name + table.schema = schema + + run_observability_db_extensions(phase="apply_config", tables=tables, schema=schema) + + +def register_observability_tables_in_metadata( + dbconn: DBConn, + *, + tables: ObservabilityTableConfig | None = None, +) -> None: + """Attach datapipe-app observability tables to the pipeline ``sqla_metadata``.""" + tables = tables or ObservabilityTableConfig() + apply_observability_table_config(tables, dbconn.schema) + + from datapipe_app.observability.store.db import ( + PipelineRegistryRow, + PipelineRunRow, + PipelineRunStepRow, + ) + + target = dbconn.sqla_metadata + model_classes = [ + PipelineRegistryRow, + PipelineRunRow, + PipelineRunStepRow, + ] + for model_cls in model_classes: + src = cast(Table, model_cls.__table__) + if not _metadata_has_table(target, src.name, dbconn.schema): + if dbconn.schema is not None: + src.to_metadata(target, schema=dbconn.schema) + else: + src.to_metadata(target) + + run_observability_db_extensions( + phase="register_metadata", + dbconn=dbconn, + tables=tables, + metadata=target, + ) + + +def _metadata_has_table(metadata: MetaData, name: str, schema: str | None) -> bool: + for table in metadata.tables.values(): + if table.name == name and table.schema == schema: + return True + return False + + +def _observability_tables_registered(dbconn: DBConn, tables: ObservabilityTableConfig) -> bool: + return _metadata_has_table(dbconn.sqla_metadata, tables.pipeline_runs, dbconn.schema) + + +def create_observability_tables_hook(app: DatapipeApp, dbconn: DBConn) -> None: + if app.ds is None: + return + + from datapipe_app.app.datapipe_api import DatapipeAPI + + tables = app.observability_table_config if isinstance(app, DatapipeAPI) and app.observability_table_config else ObservabilityTableConfig() + + if not _observability_tables_registered(dbconn, tables): + if app.catalog is not None and app.catalog.catalog: + from datapipe_app.observability.config.tables import ( + ensure_observability_tables_compatible_with_pipeline, + ) + + observability_dbconn = ( + app.observability_dbconn + if isinstance(app, DatapipeAPI) + else dbconn + ) + ensure_observability_tables_compatible_with_pipeline( + observability_dbconn=observability_dbconn, + pipeline_dbconn=dbconn, + config=tables, + catalog=app.catalog, + ) + + if dbconn.schema is not None and not dbconn.connstr.startswith("sqlite"): + from datapipe.store.database import ensure_db_schema + + ensure_db_schema(dbconn) + register_observability_tables_in_metadata( + dbconn, + tables=tables, + ) diff --git a/libs/datapipe-app/datapipe_app/app/errors.py b/libs/datapipe-app/datapipe_app/app/errors.py new file mode 100644 index 000000000..57af35a8b --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/errors.py @@ -0,0 +1,5 @@ +from __future__ import annotations + + +class OpsSpecValidationError(ValueError): + pass diff --git a/libs/datapipe-app/datapipe_app/app/frontend_static.py b/libs/datapipe-app/datapipe_app/app/frontend_static.py new file mode 100644 index 000000000..07cafc519 --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/frontend_static.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +import logging +from importlib.metadata import entry_points +from typing import Optional + +logger = logging.getLogger(__name__) + +_UI_STATIC_PREFERENCE = ("datapipe_ui_ml", "datapipe_ui") + + +def resolve_frontend_dir() -> Optional[str]: + """Load a registered datapipe.ui_static entry point (ML SPA preferred).""" + available = {ep.name: ep for ep in entry_points(group="datapipe.ui_static")} + for name in _UI_STATIC_PREFERENCE: + ep = available.get(name) + if ep is None: + continue + try: + return ep.load()() + except Exception: + logger.exception("Failed to load UI static entry point %s", ep.name) + + for ep in available.values(): + if ep.name in _UI_STATIC_PREFERENCE: + continue + try: + return ep.load()() + except Exception: + logger.exception("Failed to load UI static entry point %s", ep.name) + return None diff --git a/libs/datapipe-app/datapipe_app/meta_sql.py b/libs/datapipe-app/datapipe_app/app/meta_sql.py similarity index 100% rename from libs/datapipe-app/datapipe_app/meta_sql.py rename to libs/datapipe-app/datapipe_app/app/meta_sql.py diff --git a/libs/datapipe-app/datapipe_app/metrics.py b/libs/datapipe-app/datapipe_app/app/metrics.py similarity index 85% rename from libs/datapipe-app/datapipe_app/metrics.py rename to libs/datapipe-app/datapipe_app/app/metrics.py index 67a46152b..ef9c7423d 100644 --- a/libs/datapipe-app/datapipe_app/metrics.py +++ b/libs/datapipe-app/datapipe_app/app/metrics.py @@ -7,7 +7,7 @@ from prometheus_client.registry import Collector from starlette_exporter import PrometheusMiddleware, handle_metrics -from datapipe_app.settings import API_SETTINGS +from datapipe_app.app.settings import API_SETTINGS class PipelineStatusCollector(Collector): @@ -60,14 +60,17 @@ def setup_prometheus_metrics( buckets=[0.1, 0.5, 1, 2, 3, 4, 5, 15, 30], skip_paths=[ "/healthz", - "/metrics", + "/-/metrics", "/", "/favicon.ico", "", ], skip_methods=["OPTIONS"], ) - app.add_route("/metrics", handle_metrics) + # Serve Prometheus metrics under /-/metrics so the path does not shadow the + # SPA client route at /metrics (a hard refresh there must load the React app, + # not the raw Prometheus exposition text). + app.add_route("/-/metrics", handle_metrics) if API_SETTINGS.show_step_status: REGISTRY.register(PipelineStatusCollector(datapipe_app)) diff --git a/libs/datapipe-app/datapipe_app/app/models.py b/libs/datapipe-app/datapipe_app/app/models.py new file mode 100644 index 000000000..805128058 --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/models.py @@ -0,0 +1,102 @@ +from typing import Any, Dict, List, Literal, Optional, Union + +from pydantic import BaseModel, Field + + +class PipelineStepResponse(BaseModel): + name: str + + type_: Literal["transform"] = Field(alias="type", default="transform") + transform_type: str + + indexes: Optional[List[str]] = None + + inputs: List[str] + outputs: List[str] + + labels: List[List[str]] = Field(default_factory=list) + + has_transform_meta: bool = False + total_idx_count: Optional[int] = None + changed_idx_count: Optional[int] = None + + +class MetaPipelineStepResponse(BaseModel): + name: str + + type_: Literal["meta"] = Field(alias="type") + transform_type: str = "" + inputs: List[str] = Field(default_factory=list) + outputs: List[str] = Field(default_factory=list) + labels: List[List[str]] = Field(default_factory=list) + graph: "GraphResponse" + + +PipelineNodeResponse = Union[PipelineStepResponse, MetaPipelineStepResponse] + + +class TableResponse(BaseModel): + name: str + + indexes: List[str] + + size: Optional[int] = None + store_class: str + schema_: List["TableColumnResponse"] = Field(alias="schema", default_factory=list) + + +class TableColumnResponse(BaseModel): + name: str + type: str + + +class GraphResponse(BaseModel): + catalog: Dict[str, TableResponse] + pipeline: List[PipelineNodeResponse] + stages: List[str] = Field(default_factory=list) + + +TableResponse.model_rebuild() +GraphResponse.model_rebuild() +MetaPipelineStepResponse.model_rebuild() + + +class FocusFilter(BaseModel): + table_name: str + items_idx: List[Dict] + + +class GetDataRequest(BaseModel): + table: str + filters: Dict[str, Any] = {} + page: int = 0 + page_size: int = 5 + order_by: Optional[str] = None + order: Literal["asc", "desc"] = "asc" + focus: Optional[FocusFilter] = None + include_total: bool = False + + +class GetDataResponse(BaseModel): + page: int + page_size: int + total: Optional[int] = None + data: List[Dict] + + +class TableSizeResponse(BaseModel): + table: str + size: int + + +class RunStepRequest(BaseModel): + transform: str + operation: Literal["run-step"] + filters: Optional[List[Dict]] = None + + +class RunStepResponse(BaseModel): + status: Literal["starting", "running", "finished"] + processed: int + total: int + run_id: Optional[str] = None diff --git a/libs/datapipe-app/datapipe_app/app/ops_specs.py b/libs/datapipe-app/datapipe_app/app/ops_specs.py new file mode 100644 index 000000000..5a32445de --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/ops_specs.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Sequence, cast + +from datapipe.compute import DatapipeApp + +from datapipe_app.ops.spec_registry import OpsSpecRegistry +from datapipe_app.ops.specs import OpsSpecBase + +if TYPE_CHECKING: + from datapipe_app.observability.plugins.registry import ObservabilityRegistry + + +class OpsSpecsMixin: + ops_specs: OpsSpecRegistry | None + observability_registry: ObservabilityRegistry | None + + def _ensure_ops_registry(self) -> OpsSpecRegistry: + registry = self.ops_specs + if registry is None: + registry = OpsSpecRegistry() + self.ops_specs = registry + return registry + + def add_specs(self, specs: Sequence[OpsSpecBase]) -> None: + host = cast(DatapipeApp, self) + registry = self._ensure_ops_registry() + previous = dict(registry._specs) + try: + registry.add_many(specs) + registry.validate(host.catalog, host.ds, strict=True) + except Exception: + registry._specs = previous + raise + if self.observability_registry is not None: + self.observability_registry.attach_ops_specs(registry) + + def get_specs(self) -> list[OpsSpecBase]: + return self._ensure_ops_registry().list() diff --git a/libs/datapipe-app/datapipe_app/app/settings.py b/libs/datapipe-app/datapipe_app/app/settings.py new file mode 100644 index 000000000..9a6adfb28 --- /dev/null +++ b/libs/datapipe-app/datapipe_app/app/settings.py @@ -0,0 +1,5 @@ +from datapipe_app.observability.config.settings import OPS_SETTINGS, OpsSettings, get_ops_settings + +API_SETTINGS = OPS_SETTINGS + +__all__ = ["API_SETTINGS", "OPS_SETTINGS", "OpsSettings", "get_ops_settings"] diff --git a/libs/datapipe-app/datapipe_app/cli.py b/libs/datapipe-app/datapipe_app/cli.py deleted file mode 100644 index b3f05d4a4..000000000 --- a/libs/datapipe-app/datapipe_app/cli.py +++ /dev/null @@ -1,20 +0,0 @@ -import click -from datapipe.compute import DatapipeApp - -from datapipe_app import DatapipeAPI - - -def register_commands(cli: click.Group): - @cli.command() - @click.option("--host", type=click.STRING, default="0.0.0.0") - @click.option("--port", type=click.INT, default=8000) - @click.pass_context - def api(ctx: click.Context, host: str, port: int) -> None: - app: DatapipeApp = ctx.obj["pipeline"] - - import uvicorn - - if not isinstance(app, DatapipeAPI): - app = DatapipeAPI(app=app) - - uvicorn.run(app, host=host, port=port) diff --git a/libs/datapipe-app/datapipe_app/datapipe_api.py b/libs/datapipe-app/datapipe_app/datapipe_api.py deleted file mode 100644 index f12af68ba..000000000 --- a/libs/datapipe-app/datapipe_app/datapipe_api.py +++ /dev/null @@ -1,82 +0,0 @@ -import logging -import os.path -import sys -from typing import Optional - -from datapipe.compute import Catalog, DatapipeApp, Pipeline -from datapipe.datatable import DataStore -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware -from fastapi.staticfiles import StaticFiles - -import datapipe_app.api_v1alpha1 as api_v1alpha1 -import datapipe_app.api_v1alpha2 as api_v1alpha2 -from datapipe_app.metrics import setup_prometheus_metrics - - -class DatapipeAPI(FastAPI, DatapipeApp): - def __init__( - self, - ds: Optional[DataStore] = None, - catalog: Optional[Catalog] = None, - pipeline: Optional[Pipeline] = None, - app: Optional[DatapipeApp] = None, - ): - if app is not None: - self.ds = app.ds - self.catalog = app.catalog - self.pipeline = app.pipeline - self.steps = app.steps - else: - assert ds is not None - assert catalog is not None - assert pipeline is not None - DatapipeApp.__init__(self, ds, catalog, pipeline) - - FastAPI.__init__(self) - - self.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - self.api = FastAPI() - - setup_prometheus_metrics( - app=self, - app_name="datapipe", - datapipe_app=self, - ) - - self.api.mount( - "/v1alpha1", - api_v1alpha1.make_app(self.ds, self.catalog, self.pipeline, self.steps), - name="v1alpha1", - ) - - self.api.mount( - "/v1alpha2", - api_v1alpha2.make_app(self.ds, self.catalog, self.pipeline, self.steps), - name="v1alpha2", - ) - - self.mount("/api", self.api, name="api") - self.mount( - "/", - StaticFiles( - directory=os.path.join(os.path.dirname(__file__), "frontend/"), - html=True, - ), - name="static", - ) - - -def setup_logging(level=logging.INFO): - root_logger = logging.getLogger("datapipe") - root_logger.setLevel(level) - - handler = logging.StreamHandler(stream=sys.stdout) - root_logger.addHandler(handler) diff --git a/libs/datapipe-app/datapipe_app/frontend/asset-manifest.json b/libs/datapipe-app/datapipe_app/frontend/asset-manifest.json deleted file mode 100644 index 7a73d3351..000000000 --- a/libs/datapipe-app/datapipe_app/frontend/asset-manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "files": { - "main.css": "/static/css/main.ef52a49f.css", - "main.js": "/static/js/main.f5600965.js", - "static/media/fn-icon.svg": "/static/media/fn-icon.947c4ec9c8f529970e90.svg", - "static/media/db-icon.svg": "/static/media/db-icon.9befcb0d4eeb44fd922f.svg", - "index.html": "/index.html", - "main.ef52a49f.css.map": "/static/css/main.ef52a49f.css.map", - "main.f5600965.js.map": "/static/js/main.f5600965.js.map" - }, - "entrypoints": [ - "static/css/main.ef52a49f.css", - "static/js/main.f5600965.js" - ] -} \ No newline at end of file diff --git a/libs/datapipe-app/datapipe_app/frontend/favicon.ico b/libs/datapipe-app/datapipe_app/frontend/favicon.ico deleted file mode 100644 index de5029dc7..000000000 Binary files a/libs/datapipe-app/datapipe_app/frontend/favicon.ico and /dev/null differ diff --git a/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css b/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css deleted file mode 100644 index f2d4c0469..000000000 --- a/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css +++ /dev/null @@ -1,11 +0,0 @@ -body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}#root,body,html{box-sizing:border-box;font-family:sans-serif;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.react-flow__attribution{display:none} -/*! - * - * antd v4.22.1 - * - * Copyright 2015-present, Alipay, Inc. - * All rights reserved. - * - */[class*=ant-] input::-ms-clear,[class*=ant-] input::-ms-reveal,[class*=ant-]::-ms-clear,[class^=ant-] input::-ms-clear,[class^=ant-] input::-ms-reveal,[class^=ant-]::-ms-clear{display:none}body,html{height:100%;width:100%}input::-ms-clear,input::-ms-reveal{display:none}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}@-ms-viewport{width:device-width}body{font-feature-settings:"tnum","tnum";background-color:#fff;color:#000000d9;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:14px;font-variant:tabular-nums;line-height:1.5715;margin:0}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{color:#000000d9;font-weight:500;margin-bottom:.5em;margin-top:0}p{margin-bottom:1em;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1em}input[type=number],input[type=password],input[type=text],textarea{-webkit-appearance:none}dl,ol,ul{margin-bottom:1em;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{-webkit-text-decoration-skip:objects;background-color:initial;color:#1890ff;cursor:pointer;outline:none;text-decoration:none;transition:color .3s}a:hover{color:#40a9ff}a:active{color:#096dd9}a:active,a:focus,a:hover{outline:0;text-decoration:none}a[disabled]{color:#00000040;cursor:not-allowed}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}pre{margin-bottom:1em;margin-top:0;overflow:auto}figure{margin:0 0 1em}img{border-style:none;vertical-align:middle}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{caption-side:bottom;color:#00000073;padding-bottom:.3em;padding-top:.75em;text-align:left}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5em;line-height:inherit;margin-bottom:.5em;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{background-color:#feffe6;padding:.2em}::-moz-selection{background:#1890ff;color:#fff}::selection{background:#1890ff;color:#fff}.clearfix:after,.clearfix:before{content:"";display:table}.clearfix:after{clear:both}.anticon{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:inherit;display:inline-block;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em}.anticon>*{line-height:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon>.anticon{line-height:0;vertical-align:0}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin:before{animation:loadingCircle 1s linear infinite;display:inline-block}.ant-fade-appear,.ant-fade-enter,.ant-fade-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-fade-appear.ant-fade-appear-active,.ant-fade-enter.ant-fade-enter-active{animation-name:antFadeIn;animation-play-state:running}.ant-fade-leave.ant-fade-leave-active{animation-name:antFadeOut;animation-play-state:running;pointer-events:none}.ant-fade-appear,.ant-fade-enter{animation-timing-function:linear;opacity:0}.ant-fade-leave{animation-timing-function:linear}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.ant-move-up-appear,.ant-move-up-enter,.ant-move-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-up-appear.ant-move-up-appear-active,.ant-move-up-enter.ant-move-up-enter-active{animation-name:antMoveUpIn;animation-play-state:running}.ant-move-up-leave.ant-move-up-leave-active{animation-name:antMoveUpOut;animation-play-state:running;pointer-events:none}.ant-move-up-appear,.ant-move-up-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0}.ant-move-up-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-down-appear,.ant-move-down-enter,.ant-move-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-down-appear.ant-move-down-appear-active,.ant-move-down-enter.ant-move-down-enter-active{animation-name:antMoveDownIn;animation-play-state:running}.ant-move-down-leave.ant-move-down-leave-active{animation-name:antMoveDownOut;animation-play-state:running;pointer-events:none}.ant-move-down-appear,.ant-move-down-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0}.ant-move-down-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-left-appear,.ant-move-left-enter,.ant-move-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-left-appear.ant-move-left-appear-active,.ant-move-left-enter.ant-move-left-enter-active{animation-name:antMoveLeftIn;animation-play-state:running}.ant-move-left-leave.ant-move-left-leave-active{animation-name:antMoveLeftOut;animation-play-state:running;pointer-events:none}.ant-move-left-appear,.ant-move-left-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0}.ant-move-left-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-right-appear,.ant-move-right-enter,.ant-move-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-right-appear.ant-move-right-appear-active,.ant-move-right-enter.ant-move-right-enter-active{animation-name:antMoveRightIn;animation-play-state:running}.ant-move-right-leave.ant-move-right-leave-active{animation-name:antMoveRightOut;animation-play-state:running;pointer-events:none}.ant-move-right-appear,.ant-move-right-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0}.ant-move-right-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@keyframes antMoveDownIn{0%{opacity:0;transform:translateY(100%);transform-origin:0 0}to{opacity:1;transform:translateY(0);transform-origin:0 0}}@keyframes antMoveDownOut{0%{opacity:1;transform:translateY(0);transform-origin:0 0}to{opacity:0;transform:translateY(100%);transform-origin:0 0}}@keyframes antMoveLeftIn{0%{opacity:0;transform:translateX(-100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes antMoveLeftOut{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(-100%);transform-origin:0 0}}@keyframes antMoveRightIn{0%{opacity:0;transform:translateX(100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes antMoveRightOut{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(100%);transform-origin:0 0}}@keyframes antMoveUpIn{0%{opacity:0;transform:translateY(-100%);transform-origin:0 0}to{opacity:1;transform:translateY(0);transform-origin:0 0}}@keyframes antMoveUpOut{0%{opacity:1;transform:translateY(0);transform-origin:0 0}to{opacity:0;transform:translateY(-100%);transform-origin:0 0}}@keyframes loadingCircle{to{transform:rotate(1turn)}}[ant-click-animating-without-extra-node=true],[ant-click-animating=true]{position:relative}html{--antd-wave-shadow-color:#1890ff;--scroll-bar:0}.ant-click-animating-node,[ant-click-animating-without-extra-node=true]:after{animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode:forwards;border-radius:inherit;bottom:0;box-shadow:0 0 0 0 #1890ff;box-shadow:0 0 0 0 var(--antd-wave-shadow-color);content:"";display:block;left:0;opacity:.2;pointer-events:none;position:absolute;right:0;top:0}@keyframes waveEffect{to{box-shadow:0 0 0 #1890ff;box-shadow:0 0 0 6px #1890ff;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@keyframes fadeEffect{to{opacity:0}}.ant-slide-up-appear,.ant-slide-up-enter,.ant-slide-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-up-appear.ant-slide-up-appear-active,.ant-slide-up-enter.ant-slide-up-enter-active{animation-name:antSlideUpIn;animation-play-state:running}.ant-slide-up-leave.ant-slide-up-leave-active{animation-name:antSlideUpOut;animation-play-state:running;pointer-events:none}.ant-slide-up-appear,.ant-slide-up-enter{animation-timing-function:cubic-bezier(.23,1,.32,1);opacity:0}.ant-slide-up-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-down-appear,.ant-slide-down-enter,.ant-slide-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-down-appear.ant-slide-down-appear-active,.ant-slide-down-enter.ant-slide-down-enter-active{animation-name:antSlideDownIn;animation-play-state:running}.ant-slide-down-leave.ant-slide-down-leave-active{animation-name:antSlideDownOut;animation-play-state:running;pointer-events:none}.ant-slide-down-appear,.ant-slide-down-enter{animation-timing-function:cubic-bezier(.23,1,.32,1);opacity:0}.ant-slide-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-left-appear,.ant-slide-left-enter,.ant-slide-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-left-appear.ant-slide-left-appear-active,.ant-slide-left-enter.ant-slide-left-enter-active{animation-name:antSlideLeftIn;animation-play-state:running}.ant-slide-left-leave.ant-slide-left-leave-active{animation-name:antSlideLeftOut;animation-play-state:running;pointer-events:none}.ant-slide-left-appear,.ant-slide-left-enter{animation-timing-function:cubic-bezier(.23,1,.32,1);opacity:0}.ant-slide-left-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-right-appear,.ant-slide-right-enter,.ant-slide-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-right-appear.ant-slide-right-appear-active,.ant-slide-right-enter.ant-slide-right-enter-active{animation-name:antSlideRightIn;animation-play-state:running}.ant-slide-right-leave.ant-slide-right-leave-active{animation-name:antSlideRightOut;animation-play-state:running;pointer-events:none}.ant-slide-right-appear,.ant-slide-right-enter{animation-timing-function:cubic-bezier(.23,1,.32,1);opacity:0}.ant-slide-right-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes antSlideUpIn{0%{opacity:0;transform:scaleY(.8);transform-origin:0 0}to{opacity:1;transform:scaleY(1);transform-origin:0 0}}@keyframes antSlideUpOut{0%{opacity:1;transform:scaleY(1);transform-origin:0 0}to{opacity:0;transform:scaleY(.8);transform-origin:0 0}}@keyframes antSlideDownIn{0%{opacity:0;transform:scaleY(.8);transform-origin:100% 100%}to{opacity:1;transform:scaleY(1);transform-origin:100% 100%}}@keyframes antSlideDownOut{0%{opacity:1;transform:scaleY(1);transform-origin:100% 100%}to{opacity:0;transform:scaleY(.8);transform-origin:100% 100%}}@keyframes antSlideLeftIn{0%{opacity:0;transform:scaleX(.8);transform-origin:0 0}to{opacity:1;transform:scaleX(1);transform-origin:0 0}}@keyframes antSlideLeftOut{0%{opacity:1;transform:scaleX(1);transform-origin:0 0}to{opacity:0;transform:scaleX(.8);transform-origin:0 0}}@keyframes antSlideRightIn{0%{opacity:0;transform:scaleX(.8);transform-origin:100% 0}to{opacity:1;transform:scaleX(1);transform-origin:100% 0}}@keyframes antSlideRightOut{0%{opacity:1;transform:scaleX(1);transform-origin:100% 0}to{opacity:0;transform:scaleX(.8);transform-origin:100% 0}}.ant-zoom-appear,.ant-zoom-enter,.ant-zoom-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-appear.ant-zoom-appear-active,.ant-zoom-enter.ant-zoom-enter-active{animation-name:antZoomIn;animation-play-state:running}.ant-zoom-leave.ant-zoom-leave-active{animation-name:antZoomOut;animation-play-state:running;pointer-events:none}.ant-zoom-appear,.ant-zoom-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-appear-prepare,.ant-zoom-enter-prepare{transform:none}.ant-zoom-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-appear,.ant-zoom-big-enter,.ant-zoom-big-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-appear.ant-zoom-big-appear-active,.ant-zoom-big-enter.ant-zoom-big-enter-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-leave.ant-zoom-big-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-appear,.ant-zoom-big-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-big-appear-prepare,.ant-zoom-big-enter-prepare{transform:none}.ant-zoom-big-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-fast-appear,.ant-zoom-big-fast-enter,.ant-zoom-big-fast-leave{animation-duration:.1s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active,.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-fast-appear,.ant-zoom-big-fast-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-big-fast-appear-prepare,.ant-zoom-big-fast-enter-prepare{transform:none}.ant-zoom-big-fast-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-up-appear,.ant-zoom-up-enter,.ant-zoom-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-up-appear.ant-zoom-up-appear-active,.ant-zoom-up-enter.ant-zoom-up-enter-active{animation-name:antZoomUpIn;animation-play-state:running}.ant-zoom-up-leave.ant-zoom-up-leave-active{animation-name:antZoomUpOut;animation-play-state:running;pointer-events:none}.ant-zoom-up-appear,.ant-zoom-up-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-up-appear-prepare,.ant-zoom-up-enter-prepare{transform:none}.ant-zoom-up-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-down-appear,.ant-zoom-down-enter,.ant-zoom-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-down-appear.ant-zoom-down-appear-active,.ant-zoom-down-enter.ant-zoom-down-enter-active{animation-name:antZoomDownIn;animation-play-state:running}.ant-zoom-down-leave.ant-zoom-down-leave-active{animation-name:antZoomDownOut;animation-play-state:running;pointer-events:none}.ant-zoom-down-appear,.ant-zoom-down-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-down-appear-prepare,.ant-zoom-down-enter-prepare{transform:none}.ant-zoom-down-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-left-appear,.ant-zoom-left-enter,.ant-zoom-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-left-appear.ant-zoom-left-appear-active,.ant-zoom-left-enter.ant-zoom-left-enter-active{animation-name:antZoomLeftIn;animation-play-state:running}.ant-zoom-left-leave.ant-zoom-left-leave-active{animation-name:antZoomLeftOut;animation-play-state:running;pointer-events:none}.ant-zoom-left-appear,.ant-zoom-left-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-left-appear-prepare,.ant-zoom-left-enter-prepare{transform:none}.ant-zoom-left-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-right-appear,.ant-zoom-right-enter,.ant-zoom-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-right-appear.ant-zoom-right-appear-active,.ant-zoom-right-enter.ant-zoom-right-enter-active{animation-name:antZoomRightIn;animation-play-state:running}.ant-zoom-right-leave.ant-zoom-right-leave-active{animation-name:antZoomRightOut;animation-play-state:running;pointer-events:none}.ant-zoom-right-appear,.ant-zoom-right-enter{animation-timing-function:cubic-bezier(.08,.82,.17,1);opacity:0;transform:scale(0)}.ant-zoom-right-appear-prepare,.ant-zoom-right-enter-prepare{transform:none}.ant-zoom-right-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@keyframes antZoomIn{0%{opacity:0;transform:scale(.2)}to{opacity:1;transform:scale(1)}}@keyframes antZoomOut{0%{transform:scale(1)}to{opacity:0;transform:scale(.2)}}@keyframes antZoomBigIn{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes antZoomBigOut{0%{transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes antZoomUpIn{0%{opacity:0;transform:scale(.8);transform-origin:50% 0}to{transform:scale(1);transform-origin:50% 0}}@keyframes antZoomUpOut{0%{transform:scale(1);transform-origin:50% 0}to{opacity:0;transform:scale(.8);transform-origin:50% 0}}@keyframes antZoomLeftIn{0%{opacity:0;transform:scale(.8);transform-origin:0 50%}to{transform:scale(1);transform-origin:0 50%}}@keyframes antZoomLeftOut{0%{transform:scale(1);transform-origin:0 50%}to{opacity:0;transform:scale(.8);transform-origin:0 50%}}@keyframes antZoomRightIn{0%{opacity:0;transform:scale(.8);transform-origin:100% 50%}to{transform:scale(1);transform-origin:100% 50%}}@keyframes antZoomRightOut{0%{transform:scale(1);transform-origin:100% 50%}to{opacity:0;transform:scale(.8);transform-origin:100% 50%}}@keyframes antZoomDownIn{0%{opacity:0;transform:scale(.8);transform-origin:50% 100%}to{transform:scale(1);transform-origin:50% 100%}}@keyframes antZoomDownOut{0%{transform:scale(1);transform-origin:50% 100%}to{opacity:0;transform:scale(.8);transform-origin:50% 100%}}.ant-motion-collapse-legacy{overflow:hidden}.ant-motion-collapse,.ant-motion-collapse-legacy-active{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-motion-collapse{overflow:hidden}.ant-affix{position:fixed;z-index:10}.ant-alert{font-feature-settings:"tnum","tnum";word-wrap:break-word;align-items:center;border-radius:2px;box-sizing:border-box;color:#000000d9;display:flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:8px 15px;position:relative}.ant-alert-content{flex:1 1;min-width:0}.ant-alert-icon{margin-right:8px}.ant-alert-description{display:none;font-size:14px;line-height:22px}.ant-alert-success{background-color:#f6ffed;border:1px solid #b7eb8f}.ant-alert-success .ant-alert-icon{color:#52c41a}.ant-alert-info{background-color:#e6f7ff;border:1px solid #91d5ff}.ant-alert-info .ant-alert-icon{color:#1890ff}.ant-alert-warning{background-color:#fffbe6;border:1px solid #ffe58f}.ant-alert-warning .ant-alert-icon{color:#faad14}.ant-alert-error{background-color:#fff2f0;border:1px solid #ffccc7}.ant-alert-error .ant-alert-icon{color:#ff4d4f}.ant-alert-error .ant-alert-description>pre{margin:0;padding:0}.ant-alert-action{margin-left:8px}.ant-alert-close-icon{background-color:initial;border:none;cursor:pointer;font-size:12px;line-height:12px;margin-left:8px;outline:none;overflow:hidden;padding:0}.ant-alert-close-icon .anticon-close{color:#00000073;transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:#000000bf}.ant-alert-close-text{color:#00000073;transition:color .3s}.ant-alert-close-text:hover{color:#000000bf}.ant-alert-with-description{align-items:flex-start;padding:15px 15px 15px 24px}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{font-size:24px;margin-right:15px}.ant-alert-with-description .ant-alert-message{color:#000000d9;display:block;font-size:16px;margin-bottom:4px}.ant-alert-message{color:#000000d9}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-motion-leave{opacity:1;overflow:hidden;transition:max-height .3s cubic-bezier(.78,.14,.15,.86),opacity .3s cubic-bezier(.78,.14,.15,.86),padding-top .3s cubic-bezier(.78,.14,.15,.86),padding-bottom .3s cubic-bezier(.78,.14,.15,.86),margin-bottom .3s cubic-bezier(.78,.14,.15,.86)}.ant-alert.ant-alert-motion-leave-active{margin-bottom:0!important;max-height:0;opacity:0;padding-bottom:0;padding-top:0}.ant-alert-banner{border:0;border-radius:0;margin-bottom:0}.ant-alert.ant-alert-rtl{direction:rtl}.ant-alert-rtl .ant-alert-icon{margin-left:8px;margin-right:auto}.ant-alert-rtl .ant-alert-action,.ant-alert-rtl .ant-alert-close-icon{margin-left:auto;margin-right:8px}.ant-alert-rtl.ant-alert-with-description{padding-left:15px;padding-right:24px}.ant-alert-rtl.ant-alert-with-description .ant-alert-icon{margin-left:15px;margin-right:auto}.ant-anchor{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0 0 0 2px;position:relative}.ant-anchor-wrapper{background-color:initial;margin-left:-4px;overflow:auto;padding-left:4px}.ant-anchor-ink{height:100%;left:0;position:absolute;top:0}.ant-anchor-ink:before{background-color:#f0f0f0;content:" ";display:block;height:100%;margin:0 auto;position:relative;width:2px}.ant-anchor-ink-ball{background-color:#fff;border:2px solid #1890ff;border-radius:8px;display:none;height:8px;left:50%;position:absolute;transform:translateX(-50%);transition:top .3s ease-in-out;width:8px}.ant-anchor-ink-ball.visible{display:inline-block}.ant-anchor-fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:4px 0 4px 16px}.ant-anchor-link-title{color:#000000d9;display:block;margin-bottom:3px;overflow:hidden;position:relative;text-overflow:ellipsis;transition:all .3s;white-space:nowrap}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#1890ff}.ant-anchor-link .ant-anchor-link{padding-bottom:2px;padding-top:2px}.ant-anchor-rtl{direction:rtl}.ant-anchor-rtl.ant-anchor-wrapper{margin-left:0;margin-right:-4px;padding-left:0;padding-right:4px}.ant-anchor-rtl .ant-anchor-ink{left:auto;right:0}.ant-anchor-rtl .ant-anchor-ink-ball{left:0;right:50%;transform:translateX(50%)}.ant-anchor-rtl .ant-anchor-link{padding:4px 16px 4px 0}.ant-select-auto-complete{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-select-auto-complete .ant-select-clear{right:13px}.ant-select-single .ant-select-selector{display:flex}.ant-select-single .ant-select-selector .ant-select-selection-search{bottom:0;left:11px;position:absolute;right:11px;top:0}.ant-select-single .ant-select-selector .ant-select-selection-search-input{width:100%}.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-single .ant-select-selector .ant-select-selection-placeholder{line-height:30px;padding:0;transition:all .3s}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-placeholder{pointer-events:none;transition:none}.ant-select-single .ant-select-selector .ant-select-selection-item:after,.ant-select-single .ant-select-selector .ant-select-selection-placeholder:after,.ant-select-single .ant-select-selector:after{content:"\a0";display:inline-block;visibility:hidden;width:0}.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:25px}.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:18px}.ant-select-single.ant-select-open .ant-select-selection-item{color:#bfbfbf}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{height:32px;padding:0 11px;width:100%}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{height:30px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector:after{line-height:30px}.ant-select-single.ant-select-customize-input .ant-select-selector:after{display:none}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search{position:static;width:100%}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder{left:0;padding:0 11px;position:absolute;right:0}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder:after{display:none}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{height:40px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector:after{line-height:38px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:38px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{height:24px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector:after{line-height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search{left:7px;right:7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{padding:0 7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:28px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:21px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{padding:0 11px}.ant-select-selection-overflow{display:flex;flex:auto;flex-wrap:wrap;max-width:100%;position:relative}.ant-select-selection-overflow-item{align-self:center;flex:none;max-width:100%}.ant-select-multiple .ant-select-selector{align-items:center;display:flex;flex-wrap:wrap;padding:1px 4px}.ant-select-show-search.ant-select-multiple .ant-select-selector{cursor:text}.ant-select-disabled.ant-select-multiple .ant-select-selector{background:#f5f5f5;cursor:not-allowed}.ant-select-multiple .ant-select-selector:after{content:"\a0";display:inline-block;line-height:24px;margin:2px 0;width:0}.ant-select-multiple.ant-select-allow-clear .ant-select-selector,.ant-select-multiple.ant-select-show-arrow .ant-select-selector{padding-right:24px}.ant-select-multiple .ant-select-selection-item{background:#f5f5f5;border:1px solid #f0f0f0;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;flex:none;height:24px;line-height:22px;margin-bottom:2px;margin-top:2px;margin-inline-end:4px;max-width:100%;padding-inline-end:4px;padding-inline-start:8px;position:relative;transition:font-size .3s,line-height .3s,height .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-disabled.ant-select-multiple .ant-select-selection-item{border-color:#d9d9d9;color:#bfbfbf;cursor:not-allowed}.ant-select-multiple .ant-select-selection-item-content{display:inline-block;margin-right:4px;overflow:hidden;text-overflow:ellipsis;white-space:pre}.ant-select-multiple .ant-select-selection-item-remove{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:inherit;color:#00000073;cursor:pointer;display:inline-block;font-size:10px;font-style:normal;font-weight:700;line-height:0;line-height:inherit;text-align:center;text-transform:none;vertical-align:-.125em}.ant-select-multiple .ant-select-selection-item-remove>*{line-height:1}.ant-select-multiple .ant-select-selection-item-remove svg{display:inline-block}.ant-select-multiple .ant-select-selection-item-remove:before{display:none}.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon{display:block}.ant-select-multiple .ant-select-selection-item-remove>.anticon{vertical-align:middle}.ant-select-multiple .ant-select-selection-item-remove:hover{color:#000000bf}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{margin-inline-start:7px;max-width:100%;position:relative}.ant-select-multiple .ant-select-selection-search-input,.ant-select-multiple .ant-select-selection-search-mirror{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;height:24px;line-height:24px;transition:all .3s}.ant-select-multiple .ant-select-selection-search-input{min-width:4.1px;width:100%}.ant-select-multiple .ant-select-selection-search-mirror{left:0;position:absolute;top:0;visibility:hidden;white-space:pre;z-index:999}.ant-select-multiple .ant-select-selection-placeholder{left:11px;position:absolute;right:11px;top:50%;transform:translateY(-50%);transition:all .3s}.ant-select-multiple.ant-select-lg .ant-select-selector:after{line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{line-height:30px}.ant-select-multiple.ant-select-lg .ant-select-selection-search{height:32px;line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror{height:32px;line-height:30px}.ant-select-multiple.ant-select-sm .ant-select-selector:after{line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-item{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{height:16px;line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{left:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{margin-inline-start:3px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:32px}.ant-select-disabled .ant-select-selection-item-remove{display:none}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input) .ant-select-selector{background-color:#fff;border-color:#ff4d4f!important}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-focused .ant-select-selector,.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-open .ant-select-selector{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input) .ant-select-selector{background-color:#fff;border-color:#faad14!important}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-focused .ant-select-selector,.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-open .ant-select-selector{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-select-status-error.ant-select-has-feedback .ant-select-clear,.ant-select-status-success.ant-select-has-feedback .ant-select-clear,.ant-select-status-validating.ant-select-has-feedback .ant-select-clear,.ant-select-status-warning.ant-select-has-feedback .ant-select-clear{right:32px}.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value{padding-right:42px}.ant-select{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative}.ant-select:not(.ant-select-customize-input) .ant-select-selector{background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;position:relative;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:pointer}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector{cursor:text}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:auto}.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{background:#f5f5f5;color:#00000040;cursor:not-allowed}.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{background:#f5f5f5}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:not-allowed}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#0000;border:none;margin:0;outline:none;padding:0}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button{-webkit-appearance:none;display:none}.ant-select:not(.ant-select-disabled):hover .ant-select-selector{border-color:#40a9ff;border-right-width:1px}.ant-select-selection-item{flex:1 1;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (-ms-high-contrast:none){.ant-select-selection-item,.ant-select-selection-item ::-ms-backdrop{flex:auto}}.ant-select-selection-placeholder{color:#bfbfbf;flex:1 1;overflow:hidden;pointer-events:none;text-overflow:ellipsis;white-space:nowrap}@media (-ms-high-contrast:none){.ant-select-selection-placeholder,.ant-select-selection-placeholder ::-ms-backdrop{flex:auto}}.ant-select-arrow{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;align-items:center;color:inherit;color:#00000040;display:inline-block;display:flex;font-size:12px;font-style:normal;height:12px;line-height:0;line-height:1;margin-top:-6px;pointer-events:none;position:absolute;right:11px;text-align:center;text-transform:none;top:50%;vertical-align:-.125em}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .anticon{transition:transform .3s;vertical-align:top}.ant-select-arrow .anticon>svg{vertical-align:top}.ant-select-arrow .anticon:not(.ant-select-suffix){pointer-events:auto}.ant-select-disabled .ant-select-arrow{cursor:not-allowed}.ant-select-arrow>:not(:last-child){margin-inline-end:8px}.ant-select-clear{text-rendering:auto;background:#fff;color:#00000040;cursor:pointer;display:inline-block;font-size:12px;font-style:normal;height:12px;line-height:1;margin-top:-6px;opacity:0;position:absolute;right:11px;text-align:center;text-transform:none;top:50%;transition:color .3s ease,opacity .15s ease;width:12px;z-index:1}.ant-select-clear:before{display:block}.ant-select-clear:hover{color:#00000073}.ant-select:hover .ant-select-clear{opacity:1}.ant-select-dropdown{font-feature-settings:"tnum","tnum",;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;font-variant:normal;left:-9999px;line-height:1.5715;list-style:none;margin:0;outline:none;overflow:hidden;padding:4px 0;position:absolute;top:-9999px;z-index:1050}.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpIn}.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownIn}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpOut}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-empty{color:#00000040}.ant-select-item-empty{color:#000000d9;color:#00000040}.ant-select-item,.ant-select-item-empty{display:block;font-size:14px;font-weight:400;line-height:22px;min-height:32px;padding:5px 12px;position:relative}.ant-select-item{color:#000000d9;cursor:pointer;transition:background .3s ease}.ant-select-item-group{color:#00000073;cursor:default;font-size:12px}.ant-select-item-option{display:flex}.ant-select-item-option-content{flex:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-select-item-option-state{flex:none}.ant-select-item-option-active:not(.ant-select-item-option-disabled){background-color:#f5f5f5}.ant-select-item-option-selected:not(.ant-select-item-option-disabled){background-color:#e6f7ff;color:#000000d9;font-weight:600}.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state{color:#1890ff}.ant-select-item-option-disabled{color:#00000040;cursor:not-allowed}.ant-select-item-option-disabled.ant-select-item-option-selected{background-color:#f5f5f5}.ant-select-item-option-grouped{padding-left:24px}.ant-select-lg{font-size:16px}.ant-select-borderless .ant-select-selector{background-color:initial!important;border-color:#0000!important;box-shadow:none!important}.ant-select.ant-select-in-form-item{width:100%}.ant-select-rtl{direction:rtl}.ant-select-rtl .ant-select-arrow,.ant-select-rtl .ant-select-clear{left:11px;right:auto}.ant-select-dropdown-rtl{direction:rtl}.ant-select-dropdown-rtl .ant-select-item-option-grouped{padding-left:12px;padding-right:24px}.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector,.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector{padding-left:24px;padding-right:4px}.ant-select-rtl.ant-select-multiple .ant-select-selection-item{text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content{margin-left:4px;margin-right:0;text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror{left:auto;right:0}.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder{left:auto;right:11px}.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{right:7px}.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder{left:9px;right:0;text-align:right}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search{left:25px;right:11px}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-left:18px;padding-right:0}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:6px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-left:21px;padding-right:0}.ant-empty{font-size:14px;line-height:1.5715;margin:0 8px;text-align:center}.ant-empty-image{height:100px;margin-bottom:8px}.ant-empty-image img{height:100%}.ant-empty-image svg{height:100%;margin:auto}.ant-empty-footer{margin-top:16px}.ant-empty-normal{color:#00000040;margin:32px 0}.ant-empty-normal .ant-empty-image{height:40px}.ant-empty-small{color:#00000040;margin:8px 0}.ant-empty-small .ant-empty-image{height:35px}.ant-empty-img-default-ellipse{fill:#f5f5f5;fill-opacity:.8}.ant-empty-img-default-path-1{fill:#aeb8c2}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-empty-img-default-path-3{fill:#f5f5f7}.ant-empty-img-default-path-4,.ant-empty-img-default-path-5{fill:#dce0e6}.ant-empty-img-default-g{fill:#fff}.ant-empty-img-simple-ellipse{fill:#f5f5f5}.ant-empty-img-simple-g{stroke:#d9d9d9}.ant-empty-img-simple-path{fill:#fafafa}.ant-empty-rtl{direction:rtl}.ant-avatar{font-feature-settings:"tnum","tnum";background:#ccc;border-radius:50%;box-sizing:border-box;color:#000000d9;color:#fff;display:inline-block;font-size:14px;font-variant:tabular-nums;height:32px;line-height:1.5715;line-height:32px;list-style:none;margin:0;overflow:hidden;padding:0;position:relative;text-align:center;vertical-align:middle;white-space:nowrap;width:32px}.ant-avatar-image{background:#0000}.ant-avatar .ant-image-img{display:block}.ant-avatar-string{left:50%;position:absolute;transform-origin:0 center}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar.ant-avatar-icon>.anticon{margin:0}.ant-avatar-lg{border-radius:50%;height:40px;line-height:40px;width:40px}.ant-avatar-lg-string{left:50%;position:absolute;transform-origin:0 center}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-lg.ant-avatar-icon>.anticon{margin:0}.ant-avatar-sm{border-radius:50%;height:24px;line-height:24px;width:24px}.ant-avatar-sm-string{left:50%;position:absolute;transform-origin:0 center}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-sm.ant-avatar-icon>.anticon{margin:0}.ant-avatar-square{border-radius:2px}.ant-avatar>img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.ant-avatar-group{display:inline-flex}.ant-avatar-group .ant-avatar{border:1px solid #fff}.ant-avatar-group .ant-avatar:not(:first-child){margin-left:-8px}.ant-avatar-group-popover .ant-avatar+.ant-avatar{margin-left:3px}.ant-avatar-group-rtl .ant-avatar:not(:first-child){margin-left:0;margin-right:-8px}.ant-avatar-group-popover.ant-popover-rtl .ant-avatar+.ant-avatar{margin-left:0;margin-right:3px}.ant-popover{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:auto;font-size:14px;font-variant:tabular-nums;font-weight:400;left:0;line-height:1.5715;list-style:none;margin:0;padding:0;position:absolute;text-align:left;top:0;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:normal;z-index:1030}.ant-popover-content{position:relative}.ant-popover:after{background:#ffffff03;content:"";position:absolute}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:15.3137085px}.ant-popover-placement-right,.ant-popover-placement-rightBottom,.ant-popover-placement-rightTop{padding-left:15.3137085px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:15.3137085px}.ant-popover-placement-left,.ant-popover-placement-leftBottom,.ant-popover-placement-leftTop{padding-right:15.3137085px}.ant-popover-inner{background-clip:padding-box;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;box-shadow:0 0 8px #00000026\9}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ant-popover-inner{box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d}}.ant-popover-title{border-bottom:1px solid #f0f0f0;color:#000000d9;font-weight:500;margin:0;min-height:32px;min-width:177px;padding:5px 16px 4px}.ant-popover-inner-content{color:#000000d9;padding:12px 16px}.ant-popover-message{color:#000000d9;font-size:14px;padding:4px 0 12px;position:relative}.ant-popover-message>.anticon{color:#faad14;font-size:14px;position:absolute;top:8.0005px}.ant-popover-message-title{padding-left:22px}.ant-popover-buttons{margin-bottom:4px;text-align:right}.ant-popover-buttons button{margin-left:8px}.ant-popover-arrow{background:#0000;display:block;height:22px;overflow:hidden;pointer-events:none;position:absolute;width:22px}.ant-popover-arrow-content{--antd-arrow-background-color:#fff;border-radius:0 0 2px;bottom:0;content:"";display:block;height:11.3137085px;left:0;margin:auto;pointer-events:auto;pointer-events:none;position:absolute;right:0;top:0;width:11.3137085px}.ant-popover-arrow-content:before{background:var(--antd-arrow-background-color);background-position:-10px -10px;background-repeat:no-repeat;clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");content:"";height:33.9411255px;left:-11.3137085px;position:absolute;top:-11.3137085px;width:33.9411255px}.ant-popover-placement-top .ant-popover-arrow,.ant-popover-placement-topLeft .ant-popover-arrow,.ant-popover-placement-topRight .ant-popover-arrow{bottom:0;transform:translateY(100%)}.ant-popover-placement-top .ant-popover-arrow-content,.ant-popover-placement-topLeft .ant-popover-arrow-content,.ant-popover-placement-topRight .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-popover-placement-top .ant-popover-arrow{left:50%;transform:translateY(100%) translateX(-50%)}.ant-popover-placement-topLeft .ant-popover-arrow{left:16px}.ant-popover-placement-topRight .ant-popover-arrow{right:16px}.ant-popover-placement-right .ant-popover-arrow,.ant-popover-placement-rightBottom .ant-popover-arrow,.ant-popover-placement-rightTop .ant-popover-arrow{left:0;transform:translateX(-100%)}.ant-popover-placement-right .ant-popover-arrow-content,.ant-popover-placement-rightBottom .ant-popover-arrow-content,.ant-popover-placement-rightTop .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateX(11px) rotate(135deg)}.ant-popover-placement-right .ant-popover-arrow{top:50%;transform:translateX(-100%) translateY(-50%)}.ant-popover-placement-rightTop .ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom .ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom .ant-popover-arrow,.ant-popover-placement-bottomLeft .ant-popover-arrow,.ant-popover-placement-bottomRight .ant-popover-arrow{top:0;transform:translateY(-100%)}.ant-popover-placement-bottom .ant-popover-arrow-content,.ant-popover-placement-bottomLeft .ant-popover-arrow-content,.ant-popover-placement-bottomRight .ant-popover-arrow-content{box-shadow:2px 2px 5px #0000000f;transform:translateY(11px) rotate(-135deg)}.ant-popover-placement-bottom .ant-popover-arrow{left:50%;transform:translateY(-100%) translateX(-50%)}.ant-popover-placement-bottomLeft .ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight .ant-popover-arrow{right:16px}.ant-popover-placement-left .ant-popover-arrow,.ant-popover-placement-leftBottom .ant-popover-arrow,.ant-popover-placement-leftTop .ant-popover-arrow{right:0;transform:translateX(100%)}.ant-popover-placement-left .ant-popover-arrow-content,.ant-popover-placement-leftBottom .ant-popover-arrow-content,.ant-popover-placement-leftTop .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateX(-11px) rotate(-45deg)}.ant-popover-placement-left .ant-popover-arrow{top:50%;transform:translateX(100%) translateY(-50%)}.ant-popover-placement-leftTop .ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom .ant-popover-arrow{bottom:12px}.ant-popover-magenta .ant-popover-arrow-content,.ant-popover-magenta .ant-popover-inner,.ant-popover-pink .ant-popover-arrow-content,.ant-popover-pink .ant-popover-inner{background-color:#eb2f96}.ant-popover-red .ant-popover-arrow-content,.ant-popover-red .ant-popover-inner{background-color:#f5222d}.ant-popover-volcano .ant-popover-arrow-content,.ant-popover-volcano .ant-popover-inner{background-color:#fa541c}.ant-popover-orange .ant-popover-arrow-content,.ant-popover-orange .ant-popover-inner{background-color:#fa8c16}.ant-popover-yellow .ant-popover-arrow-content,.ant-popover-yellow .ant-popover-inner{background-color:#fadb14}.ant-popover-gold .ant-popover-arrow-content,.ant-popover-gold .ant-popover-inner{background-color:#faad14}.ant-popover-cyan .ant-popover-arrow-content,.ant-popover-cyan .ant-popover-inner{background-color:#13c2c2}.ant-popover-lime .ant-popover-arrow-content,.ant-popover-lime .ant-popover-inner{background-color:#a0d911}.ant-popover-green .ant-popover-arrow-content,.ant-popover-green .ant-popover-inner{background-color:#52c41a}.ant-popover-blue .ant-popover-arrow-content,.ant-popover-blue .ant-popover-inner{background-color:#1890ff}.ant-popover-geekblue .ant-popover-arrow-content,.ant-popover-geekblue .ant-popover-inner{background-color:#2f54eb}.ant-popover-purple .ant-popover-arrow-content,.ant-popover-purple .ant-popover-inner{background-color:#722ed1}.ant-popover-rtl{direction:rtl;text-align:right}.ant-popover-rtl .ant-popover-message-title{padding-left:16px;padding-right:22px}.ant-popover-rtl .ant-popover-buttons{text-align:left}.ant-popover-rtl .ant-popover-buttons button{margin-left:0;margin-right:8px}.ant-back-top{font-feature-settings:"tnum","tnum";bottom:50px;box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;height:40px;line-height:1.5715;list-style:none;margin:0;padding:0;position:fixed;right:100px;width:40px;z-index:10}.ant-back-top:empty{display:none}.ant-back-top-rtl{direction:rtl;left:100px;right:auto}.ant-back-top-content{background-color:#00000073;border-radius:20px;color:#fff;height:40px;overflow:hidden;text-align:center;transition:all .3s;width:40px}.ant-back-top-content:hover{background-color:#000000d9;transition:all .3s}.ant-back-top-icon{font-size:24px;line-height:40px}@media screen and (max-width:768px){.ant-back-top{right:60px}.ant-back-top-rtl{left:60px;right:auto}}@media screen and (max-width:480px){.ant-back-top{right:20px}.ant-back-top-rtl{left:20px;right:auto}}.ant-badge{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:1;list-style:none;margin:0;padding:0;position:relative}.ant-badge-count{background:#ff4d4f;border-radius:10px;box-shadow:0 0 0 1px #fff;color:#fff;font-size:12px;font-weight:400;height:20px;line-height:20px;min-width:20px;padding:0 6px;text-align:center;white-space:nowrap;z-index:auto}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-count-sm{border-radius:7px;font-size:12px;height:14px;line-height:14px;min-width:14px;padding:0}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{background:#ff4d4f;border-radius:100%;box-shadow:0 0 0 1px #fff;height:6px;min-width:6px;width:6px;z-index:auto}.ant-badge-dot.ant-scroll-number{transition:background 1.5s}.ant-badge .ant-scroll-number-custom-component,.ant-badge-count,.ant-badge-dot{position:absolute;right:0;top:0;transform:translate(50%,-50%);transform-origin:100% 0}.ant-badge .ant-scroll-number-custom-component.anticon-spin,.ant-badge-count.anticon-spin,.ant-badge-dot.anticon-spin{animation:antBadgeLoadingCircle 1s linear infinite}.ant-badge-status{line-height:inherit;vertical-align:initial}.ant-badge-status-dot{border-radius:50%;display:inline-block;height:6px;position:relative;top:-1px;vertical-align:middle;width:6px}.ant-badge-status-success{background-color:#52c41a}.ant-badge-status-processing{background-color:#1890ff;position:relative}.ant-badge-status-processing:after{animation:antStatusProcessing 1.2s ease-in-out infinite;border:1px solid #1890ff;border-radius:50%;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#ff4d4f}.ant-badge-status-warning{background-color:#faad14}.ant-badge-status-magenta,.ant-badge-status-pink{background:#eb2f96}.ant-badge-status-red{background:#f5222d}.ant-badge-status-volcano{background:#fa541c}.ant-badge-status-orange{background:#fa8c16}.ant-badge-status-yellow{background:#fadb14}.ant-badge-status-gold{background:#faad14}.ant-badge-status-cyan{background:#13c2c2}.ant-badge-status-lime{background:#a0d911}.ant-badge-status-green{background:#52c41a}.ant-badge-status-blue{background:#1890ff}.ant-badge-status-geekblue{background:#2f54eb}.ant-badge-status-purple{background:#722ed1}.ant-badge-status-text{color:#000000d9;font-size:14px;margin-left:8px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation-fill-mode:both}.ant-badge-zoom-leave{animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-badge-zoom-appear,.ant-badge-not-a-wrapper .ant-badge-zoom-enter{animation:antNoWrapperZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46)}.ant-badge-not-a-wrapper .ant-badge-zoom-leave{animation:antNoWrapperZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6)}.ant-badge-not-a-wrapper:not(.ant-badge-status){vertical-align:middle}.ant-badge-not-a-wrapper .ant-badge-count,.ant-badge-not-a-wrapper .ant-scroll-number-custom-component{transform:none}.ant-badge-not-a-wrapper .ant-scroll-number,.ant-badge-not-a-wrapper .ant-scroll-number-custom-component{display:block;position:relative;top:auto;transform-origin:50% 50%}@keyframes antStatusProcessing{0%{opacity:.5;transform:scale(.8)}to{opacity:0;transform:scale(2.4)}}.ant-scroll-number{direction:ltr;overflow:hidden}.ant-scroll-number-only{display:inline-block;position:relative;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-scroll-number-only,.ant-scroll-number-only>p.ant-scroll-number-only-unit{-webkit-backface-visibility:hidden;height:20px;-webkit-transform-style:preserve-3d}.ant-scroll-number-only>p.ant-scroll-number-only-unit{margin:0}.ant-scroll-number-symbol{vertical-align:top}@keyframes antZoomBadgeIn{0%{opacity:0;transform:scale(0) translate(50%,-50%)}to{transform:scale(1) translate(50%,-50%)}}@keyframes antZoomBadgeOut{0%{transform:scale(1) translate(50%,-50%)}to{opacity:0;transform:scale(0) translate(50%,-50%)}}@keyframes antNoWrapperZoomBadgeIn{0%{opacity:0;transform:scale(0)}to{transform:scale(1)}}@keyframes antNoWrapperZoomBadgeOut{0%{transform:scale(1)}to{opacity:0;transform:scale(0)}}@keyframes antBadgeLoadingCircle{0%{transform-origin:50%}to{transform:translate(50%,-50%) rotate(1turn);transform-origin:50%}}.ant-ribbon-wrapper{position:relative}.ant-ribbon{font-feature-settings:"tnum","tnum";background-color:#1890ff;border-radius:2px;box-sizing:border-box;color:#000000d9;color:#fff;font-size:14px;font-variant:tabular-nums;height:22px;line-height:1.5715;line-height:22px;list-style:none;margin:0;padding:0 8px;position:absolute;top:8px;white-space:nowrap}.ant-ribbon-text{color:#fff}.ant-ribbon-corner{border:4px solid;color:currentcolor;height:8px;position:absolute;top:100%;transform:scaleY(.75);transform-origin:top;width:8px}.ant-ribbon-corner:after{border:inherit;color:#00000040;content:"";height:inherit;left:-4px;position:absolute;top:-4px;width:inherit}.ant-ribbon-color-magenta,.ant-ribbon-color-pink{background:#eb2f96;color:#eb2f96}.ant-ribbon-color-red{background:#f5222d;color:#f5222d}.ant-ribbon-color-volcano{background:#fa541c;color:#fa541c}.ant-ribbon-color-orange{background:#fa8c16;color:#fa8c16}.ant-ribbon-color-yellow{background:#fadb14;color:#fadb14}.ant-ribbon-color-gold{background:#faad14;color:#faad14}.ant-ribbon-color-cyan{background:#13c2c2;color:#13c2c2}.ant-ribbon-color-lime{background:#a0d911;color:#a0d911}.ant-ribbon-color-green{background:#52c41a;color:#52c41a}.ant-ribbon-color-blue{background:#1890ff;color:#1890ff}.ant-ribbon-color-geekblue{background:#2f54eb;color:#2f54eb}.ant-ribbon-color-purple{background:#722ed1;color:#722ed1}.ant-ribbon.ant-ribbon-placement-end{border-bottom-right-radius:0;right:-8px}.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner{border-color:currentcolor #0000 #0000 currentcolor;right:0}.ant-ribbon.ant-ribbon-placement-start{border-bottom-left-radius:0;left:-8px}.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner{border-color:currentcolor currentcolor #0000 #0000;left:0}.ant-badge-rtl{direction:rtl}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{direction:ltr;left:0;right:auto;transform:translate(-50%,-50%);transform-origin:0 0}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{left:0;right:auto;transform:translate(-50%,-50%);transform-origin:0 0}.ant-badge-rtl .ant-badge-status-text{margin-left:0;margin-right:8px}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter{animation-name:antZoomBadgeInRtl}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave{animation-name:antZoomBadgeOutRtl}.ant-ribbon-rtl{direction:rtl}.ant-ribbon-rtl.ant-ribbon-placement-end{border-bottom-left-radius:0;border-bottom-right-radius:2px;left:-8px;right:auto}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner{border-color:currentcolor currentcolor #0000 #0000;left:0;right:auto}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner:after{border-color:currentcolor currentcolor #0000 #0000}.ant-ribbon-rtl.ant-ribbon-placement-start{border-bottom-left-radius:2px;border-bottom-right-radius:0;left:auto;right:-8px}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner{border-color:currentcolor #0000 #0000 currentcolor;left:auto;right:0}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner:after{border-color:currentcolor #0000 #0000 currentcolor}@keyframes antZoomBadgeInRtl{0%{opacity:0;transform:scale(0) translate(-50%,-50%)}to{transform:scale(1) translate(-50%,-50%)}}@keyframes antZoomBadgeOutRtl{0%{transform:scale(1) translate(-50%,-50%)}to{opacity:0;transform:scale(0) translate(-50%,-50%)}}.ant-breadcrumb{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;color:#00000073;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb ol{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover,.ant-breadcrumb li:last-child,.ant-breadcrumb li:last-child a{color:#000000d9}li:last-child>.ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{color:#00000073;margin:0 8px}.ant-breadcrumb-link>.anticon+a,.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{content:"";display:table}.ant-breadcrumb-rtl:after{clear:both;content:"";display:table}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-left:0;margin-right:4px}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger{color:#ff4d4f}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover{background-color:#ff4d4f;color:#fff}.ant-dropdown{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:block;font-size:14px;font-variant:tabular-nums;left:-9999px;line-height:1.5715;list-style:none;margin:0;padding:0;position:absolute;top:-9999px;z-index:1050}.ant-dropdown:before{bottom:-4px;content:" ";left:-7px;opacity:.0001;position:absolute;right:0;top:-4px;z-index:-9999}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{font-size:10px}.ant-dropdown-wrap .anticon-down:before{transition:transform .2s}.ant-dropdown-wrap-open .anticon-down:before{transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden,.ant-dropdown-menu-submenu-hidden{display:none}.ant-dropdown-show-arrow.ant-dropdown-placement-top,.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-topRight{padding-bottom:15.3137085px}.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight{padding-top:15.3137085px}.ant-dropdown-arrow{border-radius:0 0 2px;display:block;height:11.3137085px;pointer-events:none;position:absolute;width:11.3137085px;z-index:1}.ant-dropdown-arrow:before{background:#fff;background-position:-10px -10px;background-repeat:no-repeat;clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");content:"";height:33.9411255px;left:-11.3137085px;position:absolute;top:-11.3137085px;width:33.9411255px}.ant-dropdown-placement-top>.ant-dropdown-arrow,.ant-dropdown-placement-topLeft>.ant-dropdown-arrow,.ant-dropdown-placement-topRight>.ant-dropdown-arrow{bottom:10px;box-shadow:3px 3px 7px -3px #0000001a;transform:rotate(45deg)}.ant-dropdown-placement-top>.ant-dropdown-arrow{left:50%;transform:translateX(-50%) rotate(45deg)}.ant-dropdown-placement-topLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-topRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-placement-bottom>.ant-dropdown-arrow,.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow,.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{box-shadow:2px 2px 5px -2px #0000001a;top:9.41421356px;transform:rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottom>.ant-dropdown-arrow{left:50%;transform:translateX(-50%) rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-menu{background-clip:padding-box;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;list-style-type:none;margin:0;outline:none;padding:4px 0;position:relative;text-align:left}.ant-dropdown-menu-item-group-title{color:#00000073;padding:5px 12px;transition:all .3s}.ant-dropdown-menu-submenu-popup{background:#0000;box-shadow:none;position:absolute;transform-origin:0 0;z-index:1050}.ant-dropdown-menu-submenu-popup li,.ant-dropdown-menu-submenu-popup ul{list-style:none}.ant-dropdown-menu-submenu-popup ul{margin-left:.3em;margin-right:.3em}.ant-dropdown-menu-item{align-items:center;display:flex;position:relative}.ant-dropdown-menu-item-icon{font-size:12px;margin-right:8px;min-width:12px}.ant-dropdown-menu-title-content{flex:auto}.ant-dropdown-menu-title-content>a{color:inherit;transition:all .3s}.ant-dropdown-menu-title-content>a:hover{color:inherit}.ant-dropdown-menu-title-content>a:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{clear:both;color:#000000d9;cursor:pointer;font-size:14px;font-weight:400;line-height:22px;margin:0;padding:5px 12px;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-submenu-title-selected{background-color:#e6f7ff;color:#1890ff}.ant-dropdown-menu-item.ant-dropdown-menu-item-active,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-submenu-title:hover{background-color:#f5f5f5}.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title-disabled{color:#00000040;cursor:not-allowed}.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title-disabled:hover{background-color:#fff;color:#00000040;cursor:not-allowed}.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-submenu-title-disabled a{pointer-events:none}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{background-color:#f0f0f0;height:1px;line-height:0;margin:4px 0;overflow:hidden}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{color:#00000073;font-size:10px;font-style:normal;margin-right:0!important}.ant-dropdown-menu-item-group-list{list-style:none;margin:0 8px;padding:0}.ant-dropdown-menu-submenu-title{padding-right:24px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{left:100%;margin-left:4px;min-width:100%;position:absolute;top:0;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{background-color:#fff;color:#00000040;cursor:not-allowed}.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title{color:#1890ff}.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-dropdown-button>.anticon.anticon-down,.ant-dropdown-link>.anticon.anticon-down,.ant-dropdown-trigger>.anticon.anticon-down{font-size:10px;vertical-align:initial}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn-loading,.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn{cursor:default;pointer-events:none}.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn:before{display:block}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only){padding-left:8px;padding-right:8px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after{color:#ffffffa6}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover{background:#0000;color:#fff}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{background:#1890ff;color:#fff}.ant-dropdown-rtl{direction:rtl}.ant-dropdown-rtl.ant-dropdown:before{left:0;right:-7px}.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title,.ant-dropdown-menu.ant-dropdown-menu-rtl,.ant-dropdown-rtl .ant-dropdown-menu-item-group-title{direction:rtl;text-align:right}.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl{transform-origin:100% 0}.ant-dropdown-rtl .ant-dropdown-menu-item,.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li,.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{text-align:right}.ant-dropdown-rtl .ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-item>span>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>span>.anticon:first-child{margin-left:8px;margin-right:0}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{left:8px;right:auto}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-left:0!important;transform:scaleX(-1)}.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{padding-left:24px;padding-right:12px}.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{left:0;margin-left:0;margin-right:4px;right:100%}.ant-btn{background-image:none;background:#fff;border:1px solid #d9d9d9;border-radius:2px;box-shadow:0 2px 0 rgba(0,0,0,.015);color:#000000d9;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;height:32px;line-height:1.5715;padding:4px 15px;position:relative;text-align:center;touch-action:manipulation;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{box-shadow:none;outline:0}.ant-btn[disabled]{cursor:not-allowed}.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{border-radius:2px;font-size:16px;height:40px;padding:6.4px 15px}.ant-btn-sm{border-radius:2px;font-size:14px;height:24px;padding:0 7px}.ant-btn>a:only-child{color:currentcolor}.ant-btn>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn:focus,.ant-btn:hover{background:#fff;border-color:#40a9ff;color:#40a9ff}.ant-btn:focus>a:only-child,.ant-btn:hover>a:only-child{color:currentcolor}.ant-btn:focus>a:only-child:after,.ant-btn:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn:active{background:#fff;border-color:#096dd9;color:#096dd9}.ant-btn:active>a:only-child{color:currentcolor}.ant-btn:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn[disabled],.ant-btn[disabled]:active,.ant-btn[disabled]:focus,.ant-btn[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn[disabled]:active>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]>a:only-child{color:currentcolor}.ant-btn[disabled]:active>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn:active,.ant-btn:focus,.ant-btn:hover{background:#fff;text-decoration:none}.ant-btn>span{display:inline-block}.ant-btn-primary{background:#1890ff;border-color:#1890ff;box-shadow:0 2px 0 rgba(0,0,0,.045);color:#fff;text-shadow:0 -1px 0 #0000001f}.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-primary>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-primary:focus,.ant-btn-primary:hover{background:#40a9ff;border-color:#40a9ff;color:#fff}.ant-btn-primary:focus>a:only-child,.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-primary:focus>a:only-child:after,.ant-btn-primary:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-primary:active{background:#096dd9;border-color:#096dd9;color:#fff}.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-primary:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-primary[disabled],.ant-btn-primary[disabled]:active,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-left-color:#40a9ff;border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{background:#0000;border-color:#d9d9d9;color:#000000d9}.ant-btn-ghost>a:only-child{color:currentcolor}.ant-btn-ghost>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-ghost:focus,.ant-btn-ghost:hover{background:#0000;border-color:#40a9ff;color:#40a9ff}.ant-btn-ghost:focus>a:only-child,.ant-btn-ghost:hover>a:only-child{color:currentcolor}.ant-btn-ghost:focus>a:only-child:after,.ant-btn-ghost:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-ghost:active{background:#0000;border-color:#096dd9;color:#096dd9}.ant-btn-ghost:active>a:only-child{color:currentcolor}.ant-btn-ghost:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-ghost[disabled],.ant-btn-ghost[disabled]:active,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-ghost[disabled]:active>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]>a:only-child{color:currentcolor}.ant-btn-ghost[disabled]:active>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dashed{background:#fff;border-color:#d9d9d9;border-style:dashed;color:#000000d9}.ant-btn-dashed>a:only-child{color:currentcolor}.ant-btn-dashed>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dashed:focus,.ant-btn-dashed:hover{background:#fff;border-color:#40a9ff;color:#40a9ff}.ant-btn-dashed:focus>a:only-child,.ant-btn-dashed:hover>a:only-child{color:currentcolor}.ant-btn-dashed:focus>a:only-child:after,.ant-btn-dashed:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dashed:active{background:#fff;border-color:#096dd9;color:#096dd9}.ant-btn-dashed:active>a:only-child{color:currentcolor}.ant-btn-dashed:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dashed[disabled],.ant-btn-dashed[disabled]:active,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-dashed[disabled]:active>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]>a:only-child{color:currentcolor}.ant-btn-dashed[disabled]:active>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-danger{background:#ff4d4f;border-color:#ff4d4f;box-shadow:0 2px 0 rgba(0,0,0,.045);color:#fff;text-shadow:0 -1px 0 #0000001f}.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-danger>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-danger:focus,.ant-btn-danger:hover{background:#ff7875;border-color:#ff7875;color:#fff}.ant-btn-danger:focus>a:only-child,.ant-btn-danger:hover>a:only-child{color:currentcolor}.ant-btn-danger:focus>a:only-child:after,.ant-btn-danger:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-danger:active{background:#d9363e;border-color:#d9363e;color:#fff}.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-danger:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-danger[disabled],.ant-btn-danger[disabled]:active,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]>a:only-child{color:currentcolor}.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-link{background:#0000;border-color:#0000;box-shadow:none;color:#1890ff}.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-link>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-link:focus,.ant-btn-link:hover{background:#0000;border-color:#40a9ff;color:#40a9ff}.ant-btn-link:focus>a:only-child,.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-link:focus>a:only-child:after,.ant-btn-link:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-link:active{background:#0000;border-color:#096dd9;color:#096dd9}.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-link:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-link[disabled],.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9}.ant-btn-link:hover{background:#0000}.ant-btn-link:active,.ant-btn-link:focus,.ant-btn-link:hover{border-color:#0000}.ant-btn-link[disabled],.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{background:#0000;border-color:#0000;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-link[disabled]:active>a:only-child,.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-link[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-text{background:#0000;border-color:#0000;box-shadow:none;color:#000000d9}.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-text>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-text:focus,.ant-btn-text:hover{background:#0000;border-color:#40a9ff;color:#40a9ff}.ant-btn-text:focus>a:only-child,.ant-btn-text:hover>a:only-child{color:currentcolor}.ant-btn-text:focus>a:only-child:after,.ant-btn-text:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-text:active{background:#0000;border-color:#096dd9;color:#096dd9}.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-text:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-text[disabled],.ant-btn-text[disabled]:active,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9}.ant-btn-text:focus,.ant-btn-text:hover{background:rgba(0,0,0,.018);border-color:#0000;color:#000000d9}.ant-btn-text:active{background:rgba(0,0,0,.028);border-color:#0000;color:#000000d9}.ant-btn-text[disabled],.ant-btn-text[disabled]:active,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:hover{background:#0000;border-color:#0000;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-text[disabled]:active>a:only-child,.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-text[disabled]>a:only-child{color:currentcolor}.ant-btn-text[disabled]:active>a:only-child:after,.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-text[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous{background:#fff;border-color:#ff4d4f;color:#ff4d4f}.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-dangerous>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous:focus,.ant-btn-dangerous:hover{background:#fff;border-color:#ff7875;color:#ff7875}.ant-btn-dangerous:focus>a:only-child,.ant-btn-dangerous:hover>a:only-child{color:currentcolor}.ant-btn-dangerous:focus>a:only-child:after,.ant-btn-dangerous:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous:active{background:#fff;border-color:#d9363e;color:#d9363e}.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-dangerous:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous[disabled],.ant-btn-dangerous[disabled]:active,.ant-btn-dangerous[disabled]:focus,.ant-btn-dangerous[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-dangerous[disabled]:active>a:only-child,.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-dangerous[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous[disabled]:active>a:only-child:after,.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-dangerous[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-primary{background:#ff4d4f;border-color:#ff4d4f;box-shadow:0 2px 0 rgba(0,0,0,.045);color:#fff;text-shadow:0 -1px 0 #0000001f}.ant-btn-dangerous.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-primary:focus,.ant-btn-dangerous.ant-btn-primary:hover{background:#ff7875;border-color:#ff7875;color:#fff}.ant-btn-dangerous.ant-btn-primary:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-primary:active{background:#d9363e;border-color:#d9363e;color:#fff}.ant-btn-dangerous.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-primary[disabled],.ant-btn-dangerous.ant-btn-primary[disabled]:active,.ant-btn-dangerous.ant-btn-primary[disabled]:focus,.ant-btn-dangerous.ant-btn-primary[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-link{background:#0000;border-color:#0000;box-shadow:none;color:#ff4d4f}.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-dangerous.ant-btn-link:hover{border-color:#40a9ff;color:#40a9ff}.ant-btn-dangerous.ant-btn-link:active{border-color:#096dd9;color:#096dd9}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9}.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-dangerous.ant-btn-link:hover{background:#0000;border-color:#0000;color:#ff7875}.ant-btn-dangerous.ant-btn-link:focus>a:only-child,.ant-btn-dangerous.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-link:active{background:#0000;border-color:#0000;color:#d9363e}.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:hover{background:#0000;border-color:#0000;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-text{background:#0000;border-color:#0000;box-shadow:none;color:#ff4d4f}.ant-btn-dangerous.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-text:focus,.ant-btn-dangerous.ant-btn-text:hover{background:#0000;border-color:#40a9ff;color:#40a9ff}.ant-btn-dangerous.ant-btn-text:active{background:#0000;border-color:#096dd9;color:#096dd9}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:active,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9}.ant-btn-dangerous.ant-btn-text:focus,.ant-btn-dangerous.ant-btn-text:hover{background:rgba(0,0,0,.018);border-color:#0000;color:#ff7875}.ant-btn-dangerous.ant-btn-text:focus>a:only-child,.ant-btn-dangerous.ant-btn-text:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-text:active{background:rgba(0,0,0,.028);border-color:#0000;color:#d9363e}.ant-btn-dangerous.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:active,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:hover{background:#0000;border-color:#0000;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-icon-only{border-radius:2px;font-size:16px;height:32px;padding:2.4px 0;vertical-align:-3px;width:32px}.ant-btn-icon-only>*{font-size:16px}.ant-btn-icon-only.ant-btn-lg{border-radius:2px;font-size:18px;height:40px;padding:4.9px 0;width:40px}.ant-btn-icon-only.ant-btn-lg>*{font-size:18px}.ant-btn-icon-only.ant-btn-sm{border-radius:2px;font-size:14px;height:24px;padding:0;width:24px}.ant-btn-icon-only.ant-btn-sm>*{font-size:14px}.ant-btn-icon-only>.anticon{display:flex;justify-content:center}.ant-btn-icon-only .anticon-loading{padding:0!important}a.ant-btn-icon-only{vertical-align:-1px}a.ant-btn-icon-only>.anticon{display:inline}.ant-btn-round{border-radius:32px;font-size:14px;height:32px;padding:4px 16px}.ant-btn-round.ant-btn-lg{border-radius:40px;font-size:16px;height:40px;padding:6.4px 20px}.ant-btn-round.ant-btn-sm{border-radius:24px;font-size:14px;height:24px;padding:0 12px}.ant-btn-round.ant-btn-icon-only{width:auto}.ant-btn-circle{border-radius:50%;min-width:32px;padding-left:0;padding-right:0;text-align:center}.ant-btn-circle.ant-btn-lg{border-radius:50%;min-width:40px}.ant-btn-circle.ant-btn-sm{border-radius:50%;min-width:24px}.ant-btn:before{background:#fff;border-radius:inherit;bottom:-1px;content:"";display:none;left:-1px;opacity:.35;pointer-events:none;position:absolute;right:-1px;top:-1px;transition:opacity .2s;z-index:1}.ant-btn .anticon{transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn .anticon.anticon-minus>svg,.ant-btn .anticon.anticon-plus>svg{shape-rendering:optimizespeed}.ant-btn.ant-btn-loading{cursor:default;position:relative}.ant-btn.ant-btn-loading:before{display:block}.ant-btn>.ant-btn-loading-icon{transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-btn>.ant-btn-loading-icon .anticon{animation:none;padding-right:8px}.ant-btn>.ant-btn-loading-icon .anticon svg{animation:loadingCircle 1s linear infinite}.ant-btn-group{display:inline-flex}.ant-btn-group,.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative}.ant-btn-group>.ant-btn:active,.ant-btn-group>.ant-btn:focus,.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn:active,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>span>.ant-btn:hover{z-index:2}.ant-btn-group>.ant-btn[disabled],.ant-btn-group>span>.ant-btn[disabled]{z-index:0}.ant-btn-group .ant-btn-icon-only{font-size:14px}.ant-btn+.ant-btn-group,.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group span+.ant-btn,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group,.ant-btn-group>span+span{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:#0000}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child,.ant-btn-group>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-bottom-right-radius:2px;border-top-right-radius:2px}.ant-btn-group-sm>.ant-btn:only-child,.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-bottom-right-radius:2px;border-top-right-radius:2px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ant-btn-group-rtl.ant-btn+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group-rtl.ant-btn-group .ant-btn+span,.ant-btn-group-rtl.ant-btn-group span+.ant-btn,.ant-btn-group-rtl.ant-btn-group+.ant-btn,.ant-btn-group-rtl.ant-btn-group+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group>span+span,.ant-btn-rtl.ant-btn+.ant-btn-group,.ant-btn-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-rtl.ant-btn-group .ant-btn+span,.ant-btn-rtl.ant-btn-group span+.ant-btn,.ant-btn-rtl.ant-btn-group+.ant-btn,.ant-btn-rtl.ant-btn-group+.ant-btn-group,.ant-btn-rtl.ant-btn-group>span+span{margin-left:auto;margin-right:-1px}.ant-btn-group.ant-btn-group-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn:active>span,.ant-btn:focus>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn.ant-btn-background-ghost{border-color:#fff;color:#fff}.ant-btn.ant-btn-background-ghost,.ant-btn.ant-btn-background-ghost:active,.ant-btn.ant-btn-background-ghost:focus,.ant-btn.ant-btn-background-ghost:hover{background:#0000}.ant-btn.ant-btn-background-ghost:focus,.ant-btn.ant-btn-background-ghost:hover{border-color:#40a9ff;color:#40a9ff}.ant-btn.ant-btn-background-ghost:active{border-color:#096dd9;color:#096dd9}.ant-btn.ant-btn-background-ghost[disabled]{background:#0000;border-color:#d9d9d9;color:#00000040}.ant-btn-background-ghost.ant-btn-primary{border-color:#1890ff;color:#1890ff;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-primary:focus,.ant-btn-background-ghost.ant-btn-primary:hover{border-color:#40a9ff;color:#40a9ff}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-primary:active{border-color:#096dd9;color:#096dd9}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled]:active,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-danger{border-color:#ff4d4f;color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-danger:focus,.ant-btn-background-ghost.ant-btn-danger:hover{border-color:#ff7875;color:#ff7875}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-danger:active{border-color:#d9363e;color:#d9363e}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled]:active,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous{border-color:#ff4d4f;color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous:focus,.ant-btn-background-ghost.ant-btn-dangerous:hover{border-color:#ff7875;color:#ff7875}.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous:active{border-color:#d9363e;color:#d9363e}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous[disabled],.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link{border-color:#0000;color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover{border-color:#0000;color:#ff7875}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active{border-color:#0000;color:#d9363e}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover{background:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>:not(.anticon){letter-spacing:.34em;margin-right:-.34em}.ant-btn.ant-btn-block{width:100%}.ant-btn:empty{content:"\a0";display:inline-block;visibility:hidden;width:0}a.ant-btn{line-height:30px;padding-top:.01px!important}a.ant-btn-disabled{cursor:not-allowed}a.ant-btn-disabled>*{pointer-events:none}a.ant-btn-disabled,a.ant-btn-disabled:active,a.ant-btn-disabled:focus,a.ant-btn-disabled:hover{background:#0000;border-color:#0000;box-shadow:none;color:#00000040;text-shadow:none}a.ant-btn-disabled:active>a:only-child,a.ant-btn-disabled:focus>a:only-child,a.ant-btn-disabled:hover>a:only-child,a.ant-btn-disabled>a:only-child{color:currentcolor}a.ant-btn-disabled:active>a:only-child:after,a.ant-btn-disabled:focus>a:only-child:after,a.ant-btn-disabled:hover>a:only-child:after,a.ant-btn-disabled>a:only-child:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-btn-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#d9d9d9;border-right-color:#40a9ff}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#40a9ff;border-right-color:#d9d9d9}.ant-btn-rtl.ant-btn>.ant-btn-loading-icon .anticon{padding-left:8px;padding-right:0}.ant-btn-rtl.ant-btn>.anticon+span,.ant-btn-rtl.ant-btn>span+.anticon{margin-left:0;margin-right:8px}.ant-menu-item-danger.ant-menu-item,.ant-menu-item-danger.ant-menu-item-active,.ant-menu-item-danger.ant-menu-item:hover{color:#ff4d4f}.ant-menu-item-danger.ant-menu-item:active{background:#fff1f0}.ant-menu-item-danger.ant-menu-item-selected,.ant-menu-item-danger.ant-menu-item-selected>a,.ant-menu-item-danger.ant-menu-item-selected>a:hover{color:#ff4d4f}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{background-color:#fff1f0}.ant-menu-inline .ant-menu-item-danger.ant-menu-item:after{border-right-color:#ff4d4f}.ant-menu-dark .ant-menu-item-danger.ant-menu-item,.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,.ant-menu-dark .ant-menu-item-danger.ant-menu-item>a{color:#ff4d4f}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{background-color:#ff4d4f;color:#fff}.ant-menu{font-feature-settings:"tnum","tnum";background:#fff;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:0;list-style:none;margin:0;outline:none;padding:0;text-align:left;transition:background .3s,width .3s cubic-bezier(.2,0,0,1) 0s}.ant-menu:after,.ant-menu:before{content:"";display:table}.ant-menu:after{clear:both}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu ol,.ant-menu ul{list-style:none;margin:0;padding:0}.ant-menu-overflow{display:flex}.ant-menu-overflow-item{flex:none}.ant-menu-hidden,.ant-menu-submenu-hidden{display:none}.ant-menu-item-group-title{color:#00000073;font-size:14px;height:1.5715;line-height:1.5715;padding:8px 16px;transition:all .3s}.ant-menu-horizontal .ant-menu-submenu{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu,.ant-menu-submenu-inline{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-selected{color:#1890ff}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e6f7ff}.ant-menu-submenu .ant-menu-sub{cursor:auto;transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-title-content{transition:color .3s}.ant-menu-item a{color:#000000d9}.ant-menu-item a:hover{color:#1890ff}.ant-menu-item a:before{background-color:initial;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.ant-menu-item>.ant-badge a{color:#000000d9}.ant-menu-item>.ant-badge a:hover{color:#1890ff}.ant-menu-item-divider{border:solid #f0f0f0;border-width:1px 0 0;line-height:0;overflow:hidden}.ant-menu-item-divider-dashed{border-style:dashed}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:initial}.ant-menu-item-selected,.ant-menu-item-selected a,.ant-menu-item-selected a:hover{color:#1890ff}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e6f7ff}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #f0f0f0}.ant-menu-vertical-right{border-left:1px solid #f0f0f0}.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub,.ant-menu-vertical.ant-menu-sub{border-right:0;max-height:calc(100vh - 100px);min-width:160px;overflow:hidden;padding:0}.ant-menu-vertical-left.ant-menu-sub:not([class*=-active]),.ant-menu-vertical-right.ant-menu-sub:not([class*=-active]),.ant-menu-vertical.ant-menu-sub:not([class*=-active]){overflow-x:hidden;overflow-y:auto}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item,.ant-menu-vertical.ant-menu-sub .ant-menu-item{border-right:0;left:0;margin-left:0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub{min-width:114px}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu-title{transition:border-color .3s,background .3s}.ant-menu-item,.ant-menu-submenu-title{cursor:pointer;display:block;margin:0;padding:0 20px;position:relative;transition:border-color .3s,background .3s,padding .3s cubic-bezier(.645,.045,.355,1);white-space:nowrap}.ant-menu-item .ant-menu-item-icon,.ant-menu-item .anticon,.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-submenu-title .anticon{font-size:14px;min-width:14px;transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1),color .3s}.ant-menu-item .ant-menu-item-icon+span,.ant-menu-item .anticon+span,.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu-submenu-title .anticon+span{margin-left:10px;opacity:1;transition:opacity .3s cubic-bezier(.645,.045,.355,1),margin .3s,color .3s}.ant-menu-item .ant-menu-item-icon.svg,.ant-menu-submenu-title .ant-menu-item-icon.svg{vertical-align:-.125em}.ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-right:0}.ant-menu-item:focus-visible,.ant-menu-submenu-title:focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu>.ant-menu-item-divider{margin:1px 0;padding:0}.ant-menu-submenu-popup{background:#0000;border-radius:2px;box-shadow:none;position:absolute;transform-origin:0 0;z-index:1050}.ant-menu-submenu-popup:before{bottom:0;content:" ";height:100%;left:0;opacity:.0001;position:absolute;right:0;top:-7px;width:100%;z-index:-1}.ant-menu-submenu-placement-rightTop:before{left:-7px;top:0}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:2px}.ant-menu-submenu>.ant-menu-submenu-title:after{transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-popup>.ant-menu{background-color:#fff}.ant-menu-submenu-arrow,.ant-menu-submenu-expand-icon{color:#000000d9;position:absolute;right:16px;top:50%;transform:translateY(-50%);transition:transform .3s cubic-bezier(.645,.045,.355,1);width:10px}.ant-menu-submenu-arrow:after,.ant-menu-submenu-arrow:before{background-color:currentcolor;border-radius:2px;content:"";height:1.5px;position:absolute;transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);width:6px}.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateY(-2.5px)}.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateY(2.5px)}.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-expand-icon{color:#1890ff}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:before,.ant-menu-submenu-inline .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateX(2.5px)}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateX(-2.5px)}.ant-menu-submenu-horizontal .ant-menu-submenu-arrow{display:none}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow{transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateX(-2.5px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateX(2.5px)}.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected{color:#1890ff}.ant-menu-horizontal{border:0;border-bottom:1px solid #f0f0f0;box-shadow:none;line-height:46px}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu{margin-bottom:0;margin-top:-1px;padding:0 20px}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover{color:#1890ff}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover:after{border-bottom:2px solid #1890ff}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{display:inline-block;position:relative;top:1px;vertical-align:bottom}.ant-menu-horizontal>.ant-menu-item:after,.ant-menu-horizontal>.ant-menu-submenu:after{border-bottom:2px solid #0000;bottom:0;content:"";left:20px;position:absolute;right:20px;transition:border-color .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-horizontal>.ant-menu-submenu>.ant-menu-submenu-title{padding:0}.ant-menu-horizontal>.ant-menu-item a{color:#000000d9}.ant-menu-horizontal>.ant-menu-item a:hover{color:#1890ff}.ant-menu-horizontal>.ant-menu-item a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected a{color:#1890ff}.ant-menu-horizontal:after{clear:both;content:"\20";display:block;height:0}.ant-menu-inline .ant-menu-item,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item{position:relative}.ant-menu-inline .ant-menu-item:after,.ant-menu-vertical .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after{border-right:3px solid #1890ff;bottom:0;content:"";opacity:0;position:absolute;right:0;top:0;transform:scaleY(.0001);transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical-right .ant-menu-submenu-title{height:40px;line-height:40px;margin-bottom:4px;margin-top:4px;overflow:hidden;padding:0 16px;text-overflow:ellipsis}.ant-menu-inline .ant-menu-submenu,.ant-menu-vertical .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu{padding-bottom:.02px}.ant-menu-inline .ant-menu-item:not(:last-child),.ant-menu-vertical .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-inline>.ant-menu-item,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px}.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-item-selected:after,.ant-menu-inline .ant-menu-selected:after{opacity:1;transform:scaleY(1);transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline.ant-menu-root .ant-menu-item,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title{align-items:center;display:flex;transition:border-color .3s,background .3s,padding .1s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline.ant-menu-root .ant-menu-item>.ant-menu-title-content,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>.ant-menu-title-content{flex:auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.ant-menu-inline.ant-menu-root .ant-menu-item>*,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>*{flex:none}.ant-menu.ant-menu-inline-collapsed{width:80px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;padding:0 calc(50% - 8px);text-overflow:clip}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:0}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{font-size:16px;line-height:40px;margin:0}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{display:inline-block;opacity:0}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed .anticon{display:inline-block}.ant-menu.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu.ant-menu-inline-collapsed-tooltip a{color:#ffffffd9}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title{overflow:hidden;padding-left:4px;padding-right:4px;text-overflow:ellipsis;white-space:nowrap}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-inline,.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right{box-shadow:none}.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item>.ant-menu-inline-collapsed-noicon,.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title>.ant-menu-inline-collapsed-noicon{font-size:16px;text-align:center}.ant-menu-sub.ant-menu-inline{background:#fafafa;border-radius:0;box-shadow:none;padding:0}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px;list-style-position:inside;list-style-type:disc}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{background:none;color:#00000040!important;cursor:not-allowed}.ant-menu-item-disabled:after,.ant-menu-submenu-disabled:after{border-color:#0000!important}.ant-menu-item-disabled a,.ant-menu-submenu-disabled a{color:#00000040!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#00000040!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#00000040!important}.ant-layout-header .ant-menu{line-height:inherit}.ant-menu-inline-collapsed-tooltip a,.ant-menu-inline-collapsed-tooltip a:hover{color:#fff}.ant-menu-light .ant-menu-item-active,.ant-menu-light .ant-menu-item:hover,.ant-menu-light .ant-menu-submenu-active,.ant-menu-light .ant-menu-submenu-title:hover,.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{color:#1890ff}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu-dark .ant-menu-item:focus-visible,.ant-menu-dark .ant-menu-submenu-title:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu-dark .ant-menu-sub,.ant-menu.ant-menu-dark,.ant-menu.ant-menu-dark .ant-menu-sub{background:#001529;color:#ffffffa6}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;transition:all .3s}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:#0000}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{border-color:#001529;border-bottom:0;margin-top:0;padding:0 20px;top:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover{background-color:#1890ff}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a,.ant-menu-dark .ant-menu-item>span>a{color:#ffffffa6}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item{border-right:0;left:0;margin-left:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{background-color:initial;color:#fff}.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-item-active>span>a,.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-item:hover>span>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-active>span>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-open>span>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-selected>span>a,.ant-menu-dark .ant-menu-submenu-title:hover>a,.ant-menu-dark .ant-menu-submenu-title:hover>span>a{color:#fff}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item:hover{background-color:initial}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-selected{border-right:0;color:#fff}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon+span,.ant-menu-dark .ant-menu-item-selected .anticon,.ant-menu-dark .ant-menu-item-selected .anticon+span,.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>a:hover,.ant-menu-dark .ant-menu-item-selected>span>a,.ant-menu-dark .ant-menu-item-selected>span>a:hover{color:#fff}.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected,.ant-menu.ant-menu-dark .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-item-disabled>span>a,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-submenu-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled>span>a{color:#ffffff59!important;opacity:.8}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#ffffff59!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#ffffff59!important}.ant-menu.ant-menu-rtl{direction:rtl;text-align:right}.ant-menu-rtl .ant-menu-item-group-title{text-align:right}.ant-menu-rtl.ant-menu-inline,.ant-menu-rtl.ant-menu-vertical{border-left:1px solid #f0f0f0;border-right:none}.ant-menu-rtl.ant-menu-dark.ant-menu-inline,.ant-menu-rtl.ant-menu-dark.ant-menu-vertical{border-left:none}.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{transform-origin:top right}.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,.ant-menu-rtl .ant-menu-item .anticon,.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title .anticon{margin-left:10px;margin-right:auto}.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-left:0}.ant-menu-submenu-rtl.ant-menu-submenu-popup{transform-origin:100% 0}.ant-menu-rtl .ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow{left:16px;right:auto}.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateY(-2px)}.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateY(2px)}.ant-menu-rtl.ant-menu-inline .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item:after{left:0;right:auto}.ant-menu-rtl.ant-menu-inline .ant-menu-item,.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical .ant-menu-item,.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title{text-align:right}.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{padding-left:34px;padding-right:0}.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title{padding-left:34px;padding-right:16px}.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title{padding:0 calc(50% - 8px)}.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title{padding:0 28px 0 16px}.ant-menu-sub.ant-menu-inline{border:0}.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:0;padding-right:32px}.ant-tooltip{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;max-width:250px;padding:0;position:absolute;visibility:visible;width:-moz-max-content;width:max-content;width:intrinsic;z-index:1070}.ant-tooltip-content{position:relative}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:14.3137085px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightBottom,.ant-tooltip-placement-rightTop{padding-left:14.3137085px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:14.3137085px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftBottom,.ant-tooltip-placement-leftTop{padding-right:14.3137085px}.ant-tooltip-inner{word-wrap:break-word;background-color:#000000bf;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;color:#fff;min-height:32px;min-width:30px;padding:6px 8px;text-align:left;text-decoration:none}.ant-tooltip-arrow{background:#0000;display:block;height:22px;overflow:hidden;pointer-events:none;position:absolute;width:22px;z-index:2}.ant-tooltip-arrow-content{--antd-arrow-background-color:linear-gradient(to right bottom,#000000a6,#000000bf);border-radius:0 0 2px;bottom:0;content:"";display:block;height:11.3137085px;left:0;margin:auto;pointer-events:auto;pointer-events:none;position:absolute;right:0;top:0;width:11.3137085px}.ant-tooltip-arrow-content:before{background:var(--antd-arrow-background-color);background-position:-10px -10px;background-repeat:no-repeat;clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");content:"";height:33.9411255px;left:-11.3137085px;position:absolute;top:-11.3137085px;width:33.9411255px}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:0;transform:translateY(100%)}.ant-tooltip-placement-top .ant-tooltip-arrow-content,.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-topRight .ant-tooltip-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;transform:translateY(100%) translateX(-50%)}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:13px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow{left:0;transform:translateX(-100%)}.ant-tooltip-placement-right .ant-tooltip-arrow-content,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content,.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content{box-shadow:-3px 3px 7px #00000012;transform:translateX(11px) rotate(135deg)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;transform:translateX(-100%) translateY(-50%)}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow{right:0;transform:translateX(100%)}.ant-tooltip-placement-left .ant-tooltip-arrow-content,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content,.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content{box-shadow:3px -3px 7px #00000012;transform:translateX(-11px) rotate(315deg)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;transform:translateX(100%) translateY(-50%)}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:0;transform:translateY(-100%)}.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content{box-shadow:-3px -3px 7px #00000012;transform:translateY(11px) rotate(225deg)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;transform:translateY(-100%) translateX(-50%)}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:13px}.ant-tooltip-pink .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-pink .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-magenta .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-magenta .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-red .ant-tooltip-inner{background-color:#f5222d}.ant-tooltip-red .ant-tooltip-arrow-content:before{background:#f5222d}.ant-tooltip-volcano .ant-tooltip-inner{background-color:#fa541c}.ant-tooltip-volcano .ant-tooltip-arrow-content:before{background:#fa541c}.ant-tooltip-orange .ant-tooltip-inner{background-color:#fa8c16}.ant-tooltip-orange .ant-tooltip-arrow-content:before{background:#fa8c16}.ant-tooltip-yellow .ant-tooltip-inner{background-color:#fadb14}.ant-tooltip-yellow .ant-tooltip-arrow-content:before{background:#fadb14}.ant-tooltip-gold .ant-tooltip-inner{background-color:#faad14}.ant-tooltip-gold .ant-tooltip-arrow-content:before{background:#faad14}.ant-tooltip-cyan .ant-tooltip-inner{background-color:#13c2c2}.ant-tooltip-cyan .ant-tooltip-arrow-content:before{background:#13c2c2}.ant-tooltip-lime .ant-tooltip-inner{background-color:#a0d911}.ant-tooltip-lime .ant-tooltip-arrow-content:before{background:#a0d911}.ant-tooltip-green .ant-tooltip-inner{background-color:#52c41a}.ant-tooltip-green .ant-tooltip-arrow-content:before{background:#52c41a}.ant-tooltip-blue .ant-tooltip-inner{background-color:#1890ff}.ant-tooltip-blue .ant-tooltip-arrow-content:before{background:#1890ff}.ant-tooltip-geekblue .ant-tooltip-inner{background-color:#2f54eb}.ant-tooltip-geekblue .ant-tooltip-arrow-content:before{background:#2f54eb}.ant-tooltip-purple .ant-tooltip-inner{background-color:#722ed1}.ant-tooltip-purple .ant-tooltip-arrow-content:before{background:#722ed1}.ant-tooltip-rtl{direction:rtl}.ant-tooltip-rtl .ant-tooltip-inner{text-align:right}.ant-picker-calendar{font-feature-settings:"tnum","tnum";background:#fff;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-picker-calendar-header{display:flex;justify-content:flex-end;padding:12px 0}.ant-picker-calendar-header .ant-picker-calendar-year-select{min-width:80px}.ant-picker-calendar-header .ant-picker-calendar-month-select{margin-left:8px;min-width:70px}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-left:8px}.ant-picker-calendar .ant-picker-panel{background:#fff;border:0;border-radius:0;border-top:1px solid #f0f0f0}.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel,.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel{width:auto}.ant-picker-calendar .ant-picker-panel .ant-picker-body{padding:8px 0}.ant-picker-calendar .ant-picker-panel .ant-picker-content{width:100%}.ant-picker-calendar-mini{border-radius:2px}.ant-picker-calendar-mini .ant-picker-calendar-header{padding-left:8px;padding-right:8px}.ant-picker-calendar-mini .ant-picker-panel{border-radius:0 0 2px 2px}.ant-picker-calendar-mini .ant-picker-content{height:256px}.ant-picker-calendar-mini .ant-picker-content th{height:auto;line-height:18px;padding:0}.ant-picker-calendar-mini .ant-picker-cell:before{pointer-events:none}.ant-picker-calendar-full .ant-picker-panel{background:#fff;border:0;display:block;text-align:right;width:100%}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td,.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{padding:0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{height:auto;line-height:18px;padding:0 12px 5px 0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date{background:#f5f5f5}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today{background:#e6f7ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date{border:0;border-radius:0;border-top:2px solid #f0f0f0;display:block;height:auto;margin:0 4px;padding:4px 8px 0;transition:background .3s;width:auto}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value{line-height:24px;transition:color .3s}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{color:#000000d9;height:86px;line-height:1.5715;overflow-y:auto;position:static;text-align:left;width:auto}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today{border-color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#000000d9}@media only screen and (max-width:480px){.ant-picker-calendar-header{display:block}.ant-picker-calendar-header .ant-picker-calendar-year-select{width:50%}.ant-picker-calendar-header .ant-picker-calendar-month-select{width:calc(50% - 8px)}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-left:0;margin-top:8px;width:100%}.ant-picker-calendar-header .ant-picker-calendar-mode-switch>label{text-align:center;width:50%}}.ant-picker-calendar-rtl{direction:rtl}.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch,.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select{margin-left:0;margin-right:8px}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel{text-align:left}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{padding:0 0 5px 12px}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{text-align:right}.ant-picker-status-error.ant-picker,.ant-picker-status-error.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#ff4d4f}.ant-picker-status-error.ant-picker-focused,.ant-picker-status-error.ant-picker:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-picker-status-error.ant-picker .ant-picker-active-bar{background:#ff7875}.ant-picker-status-warning.ant-picker,.ant-picker-status-warning.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#faad14}.ant-picker-status-warning.ant-picker-focused,.ant-picker-status-warning.ant-picker:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-picker-status-warning.ant-picker .ant-picker-active-bar{background:#ffc53d}.ant-picker{font-feature-settings:"tnum","tnum";align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;color:#000000d9;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:4px 11px;position:relative;transition:border .3s,box-shadow .3s}.ant-picker-focused,.ant-picker:hover{border-color:#40a9ff;border-right-width:1px}.ant-picker-focused{box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-picker.ant-picker-disabled{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-picker.ant-picker-disabled .ant-picker-suffix{color:#00000040}.ant-picker.ant-picker-borderless{background-color:initial!important;border-color:#0000!important;box-shadow:none!important}.ant-picker-input{align-items:center;display:inline-flex;position:relative;width:100%}.ant-picker-input>input{background-color:#fff;background-image:none;background:#0000;border:0;border-radius:2px;color:#000000d9;display:inline-block;flex:auto;font-size:14px;height:auto;line-height:1.5715;min-width:0;min-width:1px;padding:0;position:relative;transition:all .3s;width:100%}.ant-picker-input>input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-picker-input>input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-picker-input>input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-picker-input>input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:-ms-input-placeholder{text-overflow:ellipsis}.ant-picker-input>input:placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:hover{border-color:#40a9ff;border-right-width:1px}.ant-picker-input>input-focused,.ant-picker-input>input:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-picker-input>input-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-picker-input>input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-picker-input>input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input-borderless,.ant-picker-input>input-borderless-disabled,.ant-picker-input>input-borderless-focused,.ant-picker-input>input-borderless:focus,.ant-picker-input>input-borderless:hover,.ant-picker-input>input-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-picker-input>input{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-picker-input>input-lg{font-size:16px;padding:6.5px 11px}.ant-picker-input>input-sm{padding:0 7px}.ant-picker-input>input:focus{box-shadow:none}.ant-picker-input>input[disabled]{background:#0000}.ant-picker-input:hover .ant-picker-clear{opacity:1}.ant-picker-input-placeholder>input{color:#bfbfbf}.ant-picker-large{padding:6.5px 11px}.ant-picker-large .ant-picker-input>input{font-size:16px}.ant-picker-small{padding:0 7px}.ant-picker-suffix{align-self:center;color:#00000040;display:flex;flex:none;line-height:1;margin-left:4px;pointer-events:none}.ant-picker-suffix>*{vertical-align:top}.ant-picker-suffix>:not(:last-child){margin-right:8px}.ant-picker-clear{background:#fff;color:#00000040;cursor:pointer;line-height:1;opacity:0;position:absolute;right:0;top:50%;transform:translateY(-50%);transition:opacity .3s,color .3s}.ant-picker-clear>*{vertical-align:top}.ant-picker-clear:hover{color:#00000073}.ant-picker-separator{color:#00000040;cursor:default;display:inline-block;font-size:16px;height:16px;position:relative;vertical-align:top;width:1em}.ant-picker-focused .ant-picker-separator{color:#00000073}.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator{cursor:not-allowed}.ant-picker-range{display:inline-flex;position:relative}.ant-picker-range .ant-picker-clear{right:11px}.ant-picker-range:hover .ant-picker-clear{opacity:1}.ant-picker-range .ant-picker-active-bar{background:#1890ff;bottom:-1px;height:2px;margin-left:11px;opacity:0;pointer-events:none;transition:all .3s ease-out}.ant-picker-range.ant-picker-focused .ant-picker-active-bar{opacity:1}.ant-picker-range-separator{align-items:center;line-height:1;padding:0 8px}.ant-picker-range.ant-picker-small .ant-picker-clear{right:7px}.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-left:7px}.ant-picker-dropdown{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;left:-9999px;line-height:1.5715;list-style:none;margin:0;padding:0;position:absolute;top:-9999px;z-index:1050}.ant-picker-dropdown-hidden{display:none}.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow{display:block;top:2.58561808px;transform:rotate(-135deg) translateY(1px)}.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow{bottom:2.58561808px;display:block;transform:rotate(45deg)}.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-picker-dropdown-range{padding:7.54247233px 0}.ant-picker-dropdown-range-hidden{display:none}.ant-picker-dropdown .ant-picker-panel>.ant-picker-time-panel{padding-top:4px}.ant-picker-ranges{line-height:34px;list-style:none;margin-bottom:0;overflow:hidden;padding:4px 12px;text-align:left}.ant-picker-ranges>li{display:inline-block}.ant-picker-ranges .ant-picker-preset>.ant-tag-blue{background:#e6f7ff;border-color:#91d5ff;color:#1890ff;cursor:pointer}.ant-picker-ranges .ant-picker-ok{float:right;margin-left:8px}.ant-picker-range-wrapper{display:flex}.ant-picker-range-arrow{border-radius:0 0 2px;box-shadow:2px 2px 6px -2px #0000001a;display:none;height:11.3137085px;margin-left:16.5px;pointer-events:none;position:absolute;transition:left .3s ease-out;width:11.3137085px;z-index:1}.ant-picker-range-arrow:before{background:#fff;background-position:-10px -10px;background-repeat:no-repeat;clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");content:"";height:33.9411255px;left:-11.3137085px;position:absolute;top:-11.3137085px;width:33.9411255px}.ant-picker-panel-container{background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;overflow:hidden;transition:margin .3s;vertical-align:top}.ant-picker-panel-container .ant-picker-panels{direction:ltr;display:inline-flex;flex-wrap:nowrap}.ant-picker-panel-container .ant-picker-panel{background:#0000;border-radius:0;border-width:0 0 1px;vertical-align:top}.ant-picker-panel-container .ant-picker-panel .ant-picker-content,.ant-picker-panel-container .ant-picker-panel table{text-align:center}.ant-picker-panel-container .ant-picker-panel-focused{border-color:#f0f0f0}.ant-picker-panel{background:#fff;border:1px solid #f0f0f0;border-radius:2px;display:inline-flex;flex-direction:column;outline:none;text-align:center}.ant-picker-panel-focused{border-color:#1890ff}.ant-picker-date-panel,.ant-picker-decade-panel,.ant-picker-month-panel,.ant-picker-quarter-panel,.ant-picker-time-panel,.ant-picker-week-panel,.ant-picker-year-panel{display:flex;flex-direction:column;width:280px}.ant-picker-header{border-bottom:1px solid #f0f0f0;color:#000000d9;display:flex;padding:0 8px}.ant-picker-header>*{flex:none}.ant-picker-header button{background:#0000;border:0;color:#00000040;cursor:pointer;line-height:40px;padding:0;transition:color .3s}.ant-picker-header>button{font-size:14px;min-width:1.6em}.ant-picker-header>button:hover{color:#000000d9}.ant-picker-header-view{flex:auto;font-weight:500;line-height:40px}.ant-picker-header-view button{color:inherit;font-weight:inherit}.ant-picker-header-view button:not(:first-child){margin-left:8px}.ant-picker-header-view button:hover{color:#1890ff}.ant-picker-next-icon,.ant-picker-prev-icon,.ant-picker-super-next-icon,.ant-picker-super-prev-icon{display:inline-block;height:7px;position:relative;width:7px}.ant-picker-next-icon:before,.ant-picker-prev-icon:before,.ant-picker-super-next-icon:before,.ant-picker-super-prev-icon:before{border:0 solid;border-width:1.5px 0 0 1.5px;content:"";display:inline-block;height:7px;left:0;position:absolute;top:0;width:7px}.ant-picker-super-next-icon:after,.ant-picker-super-prev-icon:after{border:0 solid;border-width:1.5px 0 0 1.5px;content:"";display:inline-block;height:7px;left:4px;position:absolute;top:4px;width:7px}.ant-picker-prev-icon,.ant-picker-super-prev-icon{transform:rotate(-45deg)}.ant-picker-next-icon,.ant-picker-super-next-icon{transform:rotate(135deg)}.ant-picker-content{border-collapse:collapse;table-layout:fixed;width:100%}.ant-picker-content td,.ant-picker-content th{font-weight:400;min-width:24px;position:relative}.ant-picker-content th{color:#000000d9;height:30px;line-height:30px}.ant-picker-cell{color:#00000040;cursor:pointer;padding:3px 0}.ant-picker-cell-in-view{color:#000000d9}.ant-picker-cell:before{content:"";height:24px;left:0;position:absolute;right:0;top:50%;transform:translateY(-50%);transition:all .3s;z-index:1}.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner{background:#f5f5f5}.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner:before{border:1px solid #1890ff;border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.ant-picker-cell-in-view.ant-picker-cell-in-range{position:relative}.ant-picker-cell-in-view.ant-picker-cell-in-range:before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner{background:#1890ff;color:#fff}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:before{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range):after{border-bottom:1px dashed #7ec1ff;border-top:1px dashed #7ec1ff;content:"";height:24px;position:absolute;top:50%;transform:translateY(-50%);transition:all .3s;z-index:0}.ant-picker-cell-range-hover-end:after,.ant-picker-cell-range-hover-start:after,.ant-picker-cell-range-hover:after{left:2px;right:0}.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end:before,.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start:before{background:#cbe6ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after,.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{background:#cbe6ff;bottom:0;content:"";position:absolute;top:0;transition:all .3s;z-index:-1}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{left:0;right:-6px}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{left:-6px;right:0}.ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:50%}.ant-picker-cell-range-hover.ant-picker-cell-range-end:after{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after,.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child:after{border-bottom-left-radius:2px;border-left:1px dashed #7ec1ff;border-top-left-radius:2px;left:6px}.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child:after{border-bottom-right-radius:2px;border-right:1px dashed #7ec1ff;border-top-right-radius:2px;right:6px}.ant-picker-cell-disabled{color:#00000040;pointer-events:none}.ant-picker-cell-disabled .ant-picker-cell-inner{background:#0000}.ant-picker-cell-disabled:before{background:#0000000a}.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#00000040}.ant-picker-decade-panel .ant-picker-content,.ant-picker-month-panel .ant-picker-content,.ant-picker-quarter-panel .ant-picker-content,.ant-picker-year-panel .ant-picker-content{height:264px}.ant-picker-decade-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner{padding:0 8px}.ant-picker-quarter-panel .ant-picker-content{height:56px}.ant-picker-footer{border-bottom:1px solid #0000;line-height:38px;min-width:100%;text-align:center;width:-moz-min-content;width:min-content}.ant-picker-panel .ant-picker-footer{border-top:1px solid #f0f0f0}.ant-picker-footer-extra{line-height:38px;padding:0 12px;text-align:left}.ant-picker-footer-extra:not(:last-child){border-bottom:1px solid #f0f0f0}.ant-picker-now{text-align:left}.ant-picker-today-btn{color:#1890ff}.ant-picker-today-btn:hover{color:#40a9ff}.ant-picker-today-btn:active{color:#096dd9}.ant-picker-today-btn.ant-picker-today-btn-disabled{color:#00000040;cursor:not-allowed}.ant-picker-decade-panel .ant-picker-cell-inner{padding:0 4px}.ant-picker-decade-panel .ant-picker-cell:before{display:none}.ant-picker-month-panel .ant-picker-body,.ant-picker-quarter-panel .ant-picker-body,.ant-picker-year-panel .ant-picker-body{padding:0 8px}.ant-picker-month-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner{width:60px}.ant-picker-month-panel .ant-picker-cell-range-hover-start:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-year-panel .ant-picker-cell-range-hover-start:after{border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px;left:14px}.ant-picker-month-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-year-panel .ant-picker-cell-range-hover-end:after{border-radius:0 2px 2px 0;border-right:1px dashed #7ec1ff;right:14px}.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end:after{border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px;left:14px}.ant-picker-week-panel .ant-picker-body{padding:8px 12px}.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner{background:#0000!important}.ant-picker-week-panel-row td{transition:background .3s}.ant-picker-week-panel-row:hover td{background:#f5f5f5}.ant-picker-week-panel-row-selected td,.ant-picker-week-panel-row-selected:hover td{background:#1890ff}.ant-picker-week-panel-row-selected td.ant-picker-cell-week,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week{color:#ffffff80}.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner:before,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#fff}.ant-picker-week-panel-row-selected td .ant-picker-cell-inner,.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner{color:#fff}.ant-picker-date-panel .ant-picker-body{padding:8px 12px}.ant-picker-date-panel .ant-picker-content{width:252px}.ant-picker-date-panel .ant-picker-content th{width:36px}.ant-picker-datetime-panel{display:flex}.ant-picker-datetime-panel .ant-picker-time-panel{border-left:1px solid #f0f0f0}.ant-picker-datetime-panel .ant-picker-date-panel,.ant-picker-datetime-panel .ant-picker-time-panel{transition:opacity .3s}.ant-picker-datetime-panel-active .ant-picker-date-panel,.ant-picker-datetime-panel-active .ant-picker-time-panel{opacity:.3}.ant-picker-datetime-panel-active .ant-picker-date-panel-active,.ant-picker-datetime-panel-active .ant-picker-time-panel-active{opacity:1}.ant-picker-time-panel{min-width:auto;width:auto}.ant-picker-time-panel .ant-picker-content{display:flex;flex:auto;height:224px}.ant-picker-time-panel-column{flex:1 0 auto;list-style:none;margin:0;overflow-y:hidden;padding:0;text-align:left;transition:background .3s;width:56px}.ant-picker-time-panel-column:after{content:"";display:block;height:196px}.ant-picker-datetime-panel .ant-picker-time-panel-column:after{height:198px}.ant-picker-time-panel-column:not(:first-child){border-left:1px solid #f0f0f0}.ant-picker-time-panel-column-active{background:#e6f7ff33}.ant-picker-time-panel-column:hover{overflow-y:auto}.ant-picker-time-panel-column>li{margin:0;padding:0}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner{border-radius:0;color:#000000d9;cursor:pointer;display:block;height:28px;line-height:28px;margin:0;padding:0 0 0 14px;transition:background .3s;width:100%}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover{background:#f5f5f5}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner{background:#e6f7ff}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner{background:#0000;color:#00000040;cursor:not-allowed}:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell{padding:21px 0}.ant-picker-rtl{direction:rtl}.ant-picker-rtl .ant-picker-suffix{margin-left:0;margin-right:4px}.ant-picker-rtl .ant-picker-clear{left:0;right:auto}.ant-picker-rtl .ant-picker-separator{transform:rotate(180deg)}.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child){margin-left:0;margin-right:8px}.ant-picker-rtl.ant-picker-range .ant-picker-clear{left:11px;right:auto}.ant-picker-rtl.ant-picker-range .ant-picker-active-bar{margin-left:0;margin-right:11px}.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-right:7px}.ant-picker-dropdown-rtl .ant-picker-ranges{text-align:right}.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok{float:left;margin-left:0;margin-right:8px}.ant-picker-panel-rtl{direction:rtl}.ant-picker-panel-rtl .ant-picker-prev-icon,.ant-picker-panel-rtl .ant-picker-super-prev-icon{transform:rotate(135deg)}.ant-picker-panel-rtl .ant-picker-next-icon,.ant-picker-panel-rtl .ant-picker-super-next-icon{transform:rotate(-45deg)}.ant-picker-cell .ant-picker-cell-inner{border-radius:2px;display:inline-block;height:24px;line-height:24px;min-width:24px;position:relative;transition:background .3s,border .3s;z-index:2}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:before{left:0;right:50%}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:before{left:50%;right:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end:before{left:50%;right:50%}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{left:-6px;right:0}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{left:0;right:-6px}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start:after{left:50%;right:0}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end:after{left:0;right:50%}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child:after{border-left:none;border-radius:0 2px 2px 0;border-right:1px dashed #7ec1ff;left:0;right:6px}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child:after{border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px;border-right:none;left:6px;right:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child:after{border-left:1px dashed #7ec1ff;border-radius:2px;border-right:1px dashed #7ec1ff;left:6px;right:6px}.ant-picker-dropdown-rtl .ant-picker-footer-extra{direction:rtl;text-align:right}.ant-picker-panel-rtl .ant-picker-time-panel{direction:ltr}.ant-tag{font-feature-settings:"tnum","tnum";background:#fafafa;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;display:inline-block;font-size:14px;font-size:12px;font-variant:tabular-nums;height:auto;line-height:1.5715;line-height:20px;list-style:none;margin:0 8px 0 0;opacity:1;padding:0 7px;transition:all .3s;white-space:nowrap}.ant-tag,.ant-tag a,.ant-tag a:hover{color:#000000d9}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag-close-icon{color:#00000073;cursor:pointer;font-size:10px;margin-left:3px;transition:all .3s}.ant-tag-close-icon:hover{color:#000000d9}.ant-tag-has-color{border-color:#0000}.ant-tag-has-color,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover,.ant-tag-has-color a,.ant-tag-has-color a:hover{color:#fff}.ant-tag-checkable{background-color:initial;border-color:#0000;cursor:pointer}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#1890ff}.ant-tag-checkable-checked,.ant-tag-checkable:active{color:#fff}.ant-tag-checkable-checked{background-color:#1890ff}.ant-tag-checkable:active{background-color:#096dd9}.ant-tag-hidden{display:none}.ant-tag-pink{background:#fff0f6;border-color:#ffadd2;color:#c41d7f}.ant-tag-pink-inverse{background:#eb2f96;border-color:#eb2f96;color:#fff}.ant-tag-magenta{background:#fff0f6;border-color:#ffadd2;color:#c41d7f}.ant-tag-magenta-inverse{background:#eb2f96;border-color:#eb2f96;color:#fff}.ant-tag-red{background:#fff1f0;border-color:#ffa39e;color:#cf1322}.ant-tag-red-inverse{background:#f5222d;border-color:#f5222d;color:#fff}.ant-tag-volcano{background:#fff2e8;border-color:#ffbb96;color:#d4380d}.ant-tag-volcano-inverse{background:#fa541c;border-color:#fa541c;color:#fff}.ant-tag-orange{background:#fff7e6;border-color:#ffd591;color:#d46b08}.ant-tag-orange-inverse{background:#fa8c16;border-color:#fa8c16;color:#fff}.ant-tag-yellow{background:#feffe6;border-color:#fffb8f;color:#d4b106}.ant-tag-yellow-inverse{background:#fadb14;border-color:#fadb14;color:#fff}.ant-tag-gold{background:#fffbe6;border-color:#ffe58f;color:#d48806}.ant-tag-gold-inverse{background:#faad14;border-color:#faad14;color:#fff}.ant-tag-cyan{background:#e6fffb;border-color:#87e8de;color:#08979c}.ant-tag-cyan-inverse{background:#13c2c2;border-color:#13c2c2;color:#fff}.ant-tag-lime{background:#fcffe6;border-color:#eaff8f;color:#7cb305}.ant-tag-lime-inverse{background:#a0d911;border-color:#a0d911;color:#fff}.ant-tag-green{background:#f6ffed;border-color:#b7eb8f;color:#389e0d}.ant-tag-green-inverse{background:#52c41a;border-color:#52c41a;color:#fff}.ant-tag-blue{background:#e6f7ff;border-color:#91d5ff;color:#096dd9}.ant-tag-blue-inverse{background:#1890ff;border-color:#1890ff;color:#fff}.ant-tag-geekblue{background:#f0f5ff;border-color:#adc6ff;color:#1d39c4}.ant-tag-geekblue-inverse{background:#2f54eb;border-color:#2f54eb;color:#fff}.ant-tag-purple{background:#f9f0ff;border-color:#d3adf7;color:#531dab}.ant-tag-purple-inverse{background:#722ed1;border-color:#722ed1;color:#fff}.ant-tag-success{background:#f6ffed;border-color:#b7eb8f;color:#52c41a}.ant-tag-processing{background:#e6f7ff;border-color:#91d5ff;color:#1890ff}.ant-tag-error{background:#fff2f0;border-color:#ffccc7;color:#ff4d4f}.ant-tag-warning{background:#fffbe6;border-color:#ffe58f;color:#faad14}.ant-tag>.anticon+span,.ant-tag>span+.anticon{margin-left:7px}.ant-tag.ant-tag-rtl{direction:rtl;margin-left:8px;margin-right:0;text-align:right}.ant-tag-rtl .ant-tag-close-icon{margin-left:0;margin-right:3px}.ant-tag-rtl.ant-tag>.anticon+span,.ant-tag-rtl.ant-tag>span+.anticon{margin-left:0;margin-right:7px}.ant-radio-group{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-size:0;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-radio-group .ant-badge-count{z-index:1}.ant-radio-group>.ant-badge:not(:first-child)>.ant-radio-button-wrapper{border-left:none}.ant-radio-wrapper{font-feature-settings:"tnum","tnum";align-items:baseline;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0 8px 0 0;padding:0;position:relative}.ant-radio-wrapper-disabled{cursor:not-allowed}.ant-radio-wrapper:after{content:"\a0";display:inline-block;overflow:hidden;width:0}.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type=radio]{height:14px;width:14px}.ant-radio{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;outline:none;padding:0;position:relative;top:.2em}.ant-radio-input:focus+.ant-radio-inner,.ant-radio-wrapper:hover .ant-radio,.ant-radio:hover .ant-radio-inner{border-color:#1890ff}.ant-radio-input:focus+.ant-radio-inner{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-checked:after{animation:antRadioEffect .36s ease-in-out;animation-fill-mode:both;border:1px solid #1890ff;border-radius:50%;content:"";height:100%;left:0;position:absolute;top:0;visibility:hidden;width:100%}.ant-radio-wrapper:hover .ant-radio:after,.ant-radio:hover:after{visibility:visible}.ant-radio-inner{background-color:#fff;border:1px solid #d9d9d9;border-radius:50%;display:block;height:16px;left:0;position:relative;top:0;transition:all .3s;width:16px}.ant-radio-inner:after{background-color:#1890ff;border-left:0;border-radius:16px;border-top:0;content:" ";display:block;height:16px;left:50%;margin-left:-8px;margin-top:-8px;opacity:0;position:absolute;top:50%;transform:scale(0);transition:all .3s cubic-bezier(.78,.14,.15,.86);width:16px}.ant-radio-input{bottom:0;cursor:pointer;left:0;opacity:0;position:absolute;right:0;top:0;z-index:1}.ant-radio.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9}.ant-radio-checked .ant-radio-inner{border-color:#1890ff}.ant-radio-checked .ant-radio-inner:after{opacity:1;transform:scale(.5);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled{cursor:not-allowed}.ant-radio-disabled .ant-radio-inner{background-color:#f5f5f5;cursor:not-allowed}.ant-radio-disabled .ant-radio-inner:after{background-color:#0003}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:#00000040;cursor:not-allowed}span.ant-radio+*{padding-left:8px;padding-right:8px}.ant-radio-button-wrapper{background:#fff;border-color:#d9d9d9;border-style:solid;border-width:1.02px 1px 1px 0;color:#000000d9;cursor:pointer;display:inline-block;font-size:14px;height:32px;line-height:30px;margin:0;padding:0 15px;position:relative;transition:color .3s,background .3s,border-color .3s,box-shadow .3s}.ant-radio-button-wrapper a{color:#000000d9}.ant-radio-button-wrapper>.ant-radio-button{height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}.ant-radio-group-large .ant-radio-button-wrapper{font-size:16px;height:40px;line-height:38px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;line-height:22px;padding:0 7px}.ant-radio-button-wrapper:not(:first-child):before{background-color:#d9d9d9;box-sizing:initial;content:"";display:block;height:100%;left:-1px;padding:1px 0;position:absolute;top:-1px;transition:background-color .3s;width:1px}.ant-radio-button-wrapper:first-child{border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-radio-button-wrapper:last-child{border-radius:0 2px 2px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:2px}.ant-radio-button-wrapper:hover{color:#1890ff;position:relative}.ant-radio-button-wrapper:focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{height:0;opacity:0;pointer-events:none;width:0}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){background:#fff;border-color:#1890ff;color:#1890ff;z-index:1}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):before{background-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child{border-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{border-color:#40a9ff;color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover:before{background-color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{border-color:#096dd9;color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active:before{background-color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){background:#1890ff;border-color:#1890ff;color:#fff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{background:#40a9ff;border-color:#40a9ff;color:#fff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{background:#096dd9;border-color:#096dd9;color:#fff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper-disabled{cursor:not-allowed}.ant-radio-button-wrapper-disabled,.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{background-color:#f5f5f5;border-color:#d9d9d9;color:#00000040}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none;color:#00000040}@keyframes antRadioEffect{0%{opacity:.5;transform:scale(1)}to{opacity:0;transform:scale(1.6)}}.ant-radio-group.ant-radio-group-rtl{direction:rtl}.ant-radio-wrapper.ant-radio-wrapper-rtl{direction:rtl;margin-left:8px;margin-right:0}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl{border-left-width:1px;border-right-width:0}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child):before{left:0;right:-1px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child{border-radius:0 2px 2px 0;border-right:1px solid #d9d9d9}.ant-radio-button-wrapper-checked:not([class*=" ant-radio-button-wrapper-disabled"]).ant-radio-button-wrapper:first-child{border-right-color:#40a9ff}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child{border-radius:2px 0 0 2px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child{border-right-color:#d9d9d9}.ant-card{font-feature-settings:"tnum","tnum";background:#fff;border-radius:2px;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative}.ant-card-rtl{direction:rtl}.ant-card-hoverable{cursor:pointer;transition:box-shadow .3s,border-color .3s}.ant-card-hoverable:hover{border-color:#0000;box-shadow:0 1px 2px -2px #00000029,0 3px 6px 0 #0000001f,0 5px 12px 4px #00000017}.ant-card-bordered{border:1px solid #f0f0f0}.ant-card-head{background:#0000;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0;color:#000000d9;font-size:16px;font-weight:500;margin-bottom:-1px;min-height:48px;padding:0 24px}.ant-card-head:after,.ant-card-head:before{content:"";display:table}.ant-card-head:after{clear:both}.ant-card-head-wrapper{align-items:center;display:flex}.ant-card-head-title{display:inline-block;flex:1 1;overflow:hidden;padding:16px 0;text-overflow:ellipsis;white-space:nowrap}.ant-card-head-title>.ant-typography,.ant-card-head-title>.ant-typography-edit-content{left:0;margin-bottom:0;margin-top:0}.ant-card-head .ant-tabs-top{clear:both;color:#000000d9;font-size:14px;font-weight:400;margin-bottom:-17px}.ant-card-head .ant-tabs-top-bar{border-bottom:1px solid #f0f0f0}.ant-card-extra{color:#000000d9;font-size:14px;font-weight:400;margin-left:auto;padding:16px 0}.ant-card-rtl .ant-card-extra{margin-left:0;margin-right:auto}.ant-card-body{padding:24px}.ant-card-body:after,.ant-card-body:before{content:"";display:table}.ant-card-body:after{clear:both}.ant-card-contain-grid .ant-card-body{display:flex;flex-wrap:wrap}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{border:0;border-radius:0;box-shadow:1px 0 0 0 #f0f0f0,0 1px 0 0 #f0f0f0,1px 1px 0 0 #f0f0f0,inset 1px 0 0 0 #f0f0f0,inset 0 1px 0 0 #f0f0f0;padding:24px;transition:all .3s;width:33.33%}.ant-card-grid-hoverable:hover{box-shadow:0 1px 2px -2px #00000029,0 3px 6px 0 #0000001f,0 5px 12px 4px #00000017;position:relative;z-index:1}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{min-height:32px;padding-bottom:0}.ant-card-contain-tabs>.ant-card-head .ant-card-extra{padding-bottom:0}.ant-card-bordered .ant-card-cover{margin-left:-1px;margin-right:-1px;margin-top:-1px}.ant-card-cover>*{display:block;width:100%}.ant-card-cover img{border-radius:2px 2px 0 0}.ant-card-actions{background:#fff;border-top:1px solid #f0f0f0;display:flex;list-style:none;margin:0;padding:0}.ant-card-actions:after,.ant-card-actions:before{content:"";display:table}.ant-card-actions:after{clear:both}.ant-card-actions>li{color:#00000073;margin:12px 0;text-align:center}.ant-card-actions>li>span{cursor:pointer;display:block;font-size:14px;line-height:1.5715;min-width:32px;position:relative}.ant-card-actions>li>span:hover{color:#1890ff;transition:color .3s}.ant-card-actions>li>span a:not(.ant-btn),.ant-card-actions>li>span>.anticon{color:#00000073;display:inline-block;line-height:22px;transition:color .3s;width:100%}.ant-card-actions>li>span a:not(.ant-btn):hover,.ant-card-actions>li>span>.anticon:hover{color:#1890ff}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li:not(:last-child){border-right:1px solid #f0f0f0}.ant-card-rtl .ant-card-actions>li:not(:last-child){border-left:1px solid #f0f0f0;border-right:none}.ant-card-type-inner .ant-card-head{background:#fafafa;padding:0 24px}.ant-card-type-inner .ant-card-head-title{font-size:14px;padding:12px 0}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{display:flex;margin:-4px 0}.ant-card-meta:after,.ant-card-meta:before{content:"";display:table}.ant-card-meta:after{clear:both}.ant-card-meta-avatar{padding-right:16px}.ant-card-rtl .ant-card-meta-avatar{padding-left:16px;padding-right:0}.ant-card-meta-detail{overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{color:#000000d9;font-size:16px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-card-meta-description{color:#00000073}.ant-card-loading{overflow:hidden}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-small>.ant-card-head{font-size:14px;min-height:36px;padding:0 12px}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-head-title{padding:8px 0}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-extra{font-size:14px;padding:8px 0}.ant-card-small>.ant-card-body{padding:12px}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;padding-right:16px;vertical-align:top}.ant-skeleton-header .ant-skeleton-avatar{background:#bebebe33;display:inline-block;height:32px;line-height:32px;vertical-align:top;width:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{height:40px;line-height:40px;width:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{height:24px;line-height:24px;width:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;vertical-align:top;width:100%}.ant-skeleton-content .ant-skeleton-title{background:#bebebe33;border-radius:2px;height:16px;width:100%}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph{padding:0}.ant-skeleton-content .ant-skeleton-paragraph>li{background:#bebebe33;border-radius:2px;height:16px;list-style:none;width:100%}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title{border-radius:100px}.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton-active .ant-skeleton-button,.ant-skeleton-active .ant-skeleton-image,.ant-skeleton-active .ant-skeleton-input,.ant-skeleton-active .ant-skeleton-paragraph>li,.ant-skeleton-active .ant-skeleton-title{background:#0000;overflow:hidden;position:relative;z-index:0}.ant-skeleton-active .ant-skeleton-avatar:after,.ant-skeleton-active .ant-skeleton-button:after,.ant-skeleton-active .ant-skeleton-image:after,.ant-skeleton-active .ant-skeleton-input:after,.ant-skeleton-active .ant-skeleton-paragraph>li:after,.ant-skeleton-active .ant-skeleton-title:after{animation:ant-skeleton-loading 1.4s ease infinite;background:linear-gradient(90deg,#bebebe33 25%,#8181813d 37%,#bebebe33 63%);bottom:0;content:"";left:-150%;position:absolute;right:-150%;top:0}.ant-skeleton.ant-skeleton-block,.ant-skeleton.ant-skeleton-block .ant-skeleton-button,.ant-skeleton.ant-skeleton-block .ant-skeleton-input{width:100%}.ant-skeleton-element{display:inline-block;width:auto}.ant-skeleton-element .ant-skeleton-button{background:#bebebe33;border-radius:2px;display:inline-block;height:32px;line-height:32px;min-width:64px;vertical-align:top;width:64px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square{min-width:32px;width:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle{border-radius:50%;min-width:32px;width:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round{border-radius:32px}.ant-skeleton-element .ant-skeleton-button-lg{height:40px;line-height:40px;min-width:80px;width:80px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square{min-width:40px;width:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle{border-radius:50%;min-width:40px;width:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round{border-radius:40px}.ant-skeleton-element .ant-skeleton-button-sm{height:24px;line-height:24px;min-width:48px;width:48px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square{min-width:24px;width:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle{border-radius:50%;min-width:24px;width:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round{border-radius:24px}.ant-skeleton-element .ant-skeleton-avatar{background:#bebebe33;display:inline-block;height:32px;line-height:32px;vertical-align:top;width:32px}.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-lg{height:40px;line-height:40px;width:40px}.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-sm{height:24px;line-height:24px;width:24px}.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-input{background:#bebebe33;display:inline-block;height:32px;line-height:32px;min-width:160px;vertical-align:top;width:160px}.ant-skeleton-element .ant-skeleton-input-lg{height:40px;line-height:40px;min-width:200px;width:200px}.ant-skeleton-element .ant-skeleton-input-sm{height:24px;line-height:24px;min-width:120px;width:120px}.ant-skeleton-element .ant-skeleton-image{align-items:center;background:#bebebe33;display:flex;height:96px;justify-content:center;line-height:96px;vertical-align:top;width:96px}.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-image-path{fill:#bfbfbf}.ant-skeleton-element .ant-skeleton-image-svg{height:48px;line-height:48px;max-height:192px;max-width:192px;width:48px}.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle{border-radius:50%}@keyframes ant-skeleton-loading{0%{transform:translateX(-37.5%)}to{transform:translateX(37.5%)}}.ant-skeleton-rtl{direction:rtl}.ant-skeleton-rtl .ant-skeleton-header{padding-left:16px;padding-right:0}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title{animation-name:ant-skeleton-loading-rtl}@keyframes ant-skeleton-loading-rtl{0%{background-position:0 50%}to{background-position:100% 50%}}.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{font-size:14px;padding:8px 0}.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{font-size:16px;padding:16px 0}.ant-tabs-card.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:6px 16px}.ant-tabs-card.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:7px 16px 6px}.ant-tabs-rtl{direction:rtl}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type{margin-left:0}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon{margin-left:12px;margin-right:0}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove{margin-left:-4px;margin-right:8px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-nav{order:1}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-content-holder,.ant-tabs-rtl.ant-tabs-right>.ant-tabs-nav{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-content-holder{order:1}.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:0;margin-right:2px}.ant-tabs-dropdown-rtl{direction:rtl}.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item{text-align:right}.ant-tabs-bottom,.ant-tabs-top{flex-direction:column}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav,.ant-tabs-top>.ant-tabs-nav,.ant-tabs-top>div>.ant-tabs-nav{margin:0 0 16px}.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before,.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before{border-bottom:1px solid #f0f0f0;content:"";left:0;position:absolute;right:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar{height:2px}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:width .3s,left .3s,right .3s}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{bottom:0;top:0;width:30px}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{box-shadow:inset 10px 0 8px -8px #00000014;left:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{box-shadow:inset -10px 0 8px -8px #00000014;right:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after{opacity:1}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav:before{bottom:0}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{margin-bottom:0;margin-top:16px;order:1}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav:before{top:0}.ant-tabs-bottom>.ant-tabs-content-holder,.ant-tabs-bottom>div>.ant-tabs-content-holder{order:0}.ant-tabs-left>.ant-tabs-nav,.ant-tabs-left>div>.ant-tabs-nav,.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{flex-direction:column;min-width:50px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{padding:8px 24px;text-align:center}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin:16px 0 0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap{flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{height:30px;left:0;right:0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{box-shadow:inset 0 10px 8px -8px #00000014;top:0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{bottom:0;box-shadow:inset 0 -10px 8px -8px #00000014}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{width:2px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:height .3s,top .3s}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-operations{flex:1 0 auto;flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar{right:0}.ant-tabs-left>.ant-tabs-content-holder,.ant-tabs-left>div>.ant-tabs-content-holder{border-left:1px solid #f0f0f0;margin-left:-1px}.ant-tabs-left>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-left>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-left:24px}.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{order:1}.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{left:0}.ant-tabs-right>.ant-tabs-content-holder,.ant-tabs-right>div>.ant-tabs-content-holder{border-right:1px solid #f0f0f0;margin-right:-1px;order:0}.ant-tabs-right>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-right>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-right:24px}.ant-tabs-dropdown{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:block;font-size:14px;font-variant:tabular-nums;left:-9999px;line-height:1.5715;list-style:none;margin:0;padding:0;position:absolute;top:-9999px;z-index:1050}.ant-tabs-dropdown-hidden{display:none}.ant-tabs-dropdown-menu{background-clip:padding-box;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;list-style-type:none;margin:0;max-height:200px;outline:none;overflow-x:hidden;overflow-y:auto;padding:4px 0;text-align:left}.ant-tabs-dropdown-menu-item{align-items:center;color:#000000d9;cursor:pointer;display:flex;font-size:14px;font-weight:400;line-height:22px;margin:0;min-width:120px;overflow:hidden;padding:5px 12px;text-overflow:ellipsis;transition:all .3s;white-space:nowrap}.ant-tabs-dropdown-menu-item>span{flex:1 1;white-space:nowrap}.ant-tabs-dropdown-menu-item-remove{background:#0000;border:0;color:#00000073;cursor:pointer;flex:none;font-size:12px;margin-left:12px}.ant-tabs-dropdown-menu-item-remove:hover{color:#40a9ff}.ant-tabs-dropdown-menu-item:hover{background:#f5f5f5}.ant-tabs-dropdown-menu-item-disabled,.ant-tabs-dropdown-menu-item-disabled:hover{background:#0000;color:#00000040;cursor:not-allowed}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{background:#fafafa;border:1px solid #f0f0f0;margin:0;padding:8px 16px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{background:#fff;color:#1890ff}.ant-tabs-card>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-ink-bar{visibility:hidden}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:2px}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 2px 0 0}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab-active{border-bottom-color:#fff}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 0 2px 2px}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab-active{border-top-color:#fff}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-top:2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 0 0 2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab-active{border-right-color:#fff}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 2px 2px 0}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab-active{border-left-color:#fff}.ant-tabs{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-tabs>.ant-tabs-nav,.ant-tabs>div>.ant-tabs-nav{align-items:center;display:flex;flex:none;position:relative}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap{align-self:stretch;display:inline-block;display:flex;flex:auto;overflow:hidden;position:relative;transform:translate(0);white-space:nowrap}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{content:"";opacity:0;pointer-events:none;position:absolute;transition:opacity .3s;z-index:1}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-list{display:flex;position:relative;transition:transform .3s}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations{align-self:stretch;display:flex}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations-hidden,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations-hidden{pointer-events:none;position:absolute;visibility:hidden}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more{background:#0000;border:0;padding:8px 16px;position:relative}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more:after{bottom:0;content:"";height:5px;left:0;position:absolute;right:0;transform:translateY(100%)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add{background:#fafafa;border:1px solid #f0f0f0;border-radius:2px 2px 0 0;cursor:pointer;margin-left:2px;min-width:40px;outline:none;padding:0 8px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:hover,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:hover{color:#40a9ff}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:focus,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:focus{color:#096dd9}.ant-tabs-extra-content{flex:none}.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*=ant-tabs-nav-wrap-ping]),.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*=ant-tabs-nav-wrap-ping]){justify-content:center}.ant-tabs-ink-bar{background:#1890ff;pointer-events:none;position:absolute}.ant-tabs-tab{align-items:center;background:#0000;border:0;cursor:pointer;display:inline-flex;font-size:14px;outline:none;padding:12px 0;position:relative}.ant-tabs-tab-btn:active,.ant-tabs-tab-btn:focus,.ant-tabs-tab-remove:active,.ant-tabs-tab-remove:focus{color:#096dd9}.ant-tabs-tab-btn,.ant-tabs-tab-remove{outline:none;transition:all .3s}.ant-tabs-tab-remove{background:#0000;border:none;color:#00000073;cursor:pointer;flex:none;font-size:12px;margin-left:8px;margin-right:-4px}.ant-tabs-tab-remove:hover{color:#000000d9}.ant-tabs-tab:hover{color:#40a9ff}.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{color:#1890ff;text-shadow:0 0 .25px currentcolor}.ant-tabs-tab.ant-tabs-tab-disabled{color:#00000040;cursor:not-allowed}.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus{color:#00000040}.ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-tab .anticon{margin-right:12px}.ant-tabs-tab+.ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-content{display:flex;width:100%}.ant-tabs-content-holder{flex:auto;min-height:0;min-width:0}.ant-tabs-content-animated{transition:margin .3s}.ant-tabs-tabpane{flex:none;outline:none;width:100%}.ant-carousel{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-carousel .slick-slider{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;box-sizing:border-box;display:block;position:relative;touch-action:pan-y}.ant-carousel .slick-list{display:block;margin:0;overflow:hidden;padding:0;position:relative}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-list .slick-slide{pointer-events:none}.ant-carousel .slick-list .slick-slide input.ant-checkbox-input,.ant-carousel .slick-list .slick-slide input.ant-radio-input{visibility:hidden}.ant-carousel .slick-list .slick-slide.slick-active{pointer-events:auto}.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input,.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input{visibility:visible}.ant-carousel .slick-list .slick-slide>div>div{vertical-align:bottom}.ant-carousel .slick-slider .slick-list,.ant-carousel .slick-slider .slick-track{touch-action:pan-y;transform:translateZ(0)}.ant-carousel .slick-track{display:block;left:0;position:relative;top:0}.ant-carousel .slick-track:after,.ant-carousel .slick-track:before{content:"";display:table}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{display:none;float:left;height:100%;min-height:1px}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-next,.ant-carousel .slick-prev{background:#0000;border:0;color:#0000;cursor:pointer;display:block;font-size:0;height:20px;line-height:0;margin-top:-10px;outline:none;padding:0;position:absolute;top:50%;width:20px}.ant-carousel .slick-next:focus,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev:focus,.ant-carousel .slick-prev:hover{background:#0000;color:#0000;outline:none}.ant-carousel .slick-next:focus:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-prev:hover:before{opacity:1}.ant-carousel .slick-next.slick-disabled:before,.ant-carousel .slick-prev.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"←"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"→"}.ant-carousel .slick-dots{bottom:0;display:flex!important;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.ant-carousel .slick-dots-bottom{bottom:12px}.ant-carousel .slick-dots-top{bottom:auto;top:12px}.ant-carousel .slick-dots li{box-sizing:initial;display:inline-block;flex:0 1 auto;height:3px;margin:0 3px;padding:0;position:relative;text-align:center;text-indent:-999px;transition:all .5s;vertical-align:top;width:16px}.ant-carousel .slick-dots li button{background:#fff;border:0;border-radius:1px;color:#0000;cursor:pointer;display:block;font-size:0;height:3px;opacity:.3;outline:none;padding:0;transition:all .5s;width:100%}.ant-carousel .slick-dots li button:focus,.ant-carousel .slick-dots li button:hover{opacity:.75}.ant-carousel .slick-dots li.slick-active{width:24px}.ant-carousel .slick-dots li.slick-active button{background:#fff;opacity:1}.ant-carousel .slick-dots li.slick-active:focus,.ant-carousel .slick-dots li.slick-active:hover{opacity:1}.ant-carousel-vertical .slick-dots{bottom:auto;flex-direction:column;height:auto;margin:0;top:50%;transform:translateY(-50%);width:3px}.ant-carousel-vertical .slick-dots-left{left:12px;right:auto}.ant-carousel-vertical .slick-dots-right{left:auto;right:12px}.ant-carousel-vertical .slick-dots li{height:16px;margin:4px 2px;vertical-align:initial;width:3px}.ant-carousel-vertical .slick-dots li button{height:16px;width:3px}.ant-carousel-vertical .slick-dots li.slick-active,.ant-carousel-vertical .slick-dots li.slick-active button{height:24px;width:3px}.ant-carousel-rtl{direction:rtl}.ant-carousel-rtl .ant-carousel .slick-track{left:auto;right:0}.ant-carousel-rtl .ant-carousel .slick-prev{left:auto;right:-25px}.ant-carousel-rtl .ant-carousel .slick-prev:before{content:"→"}.ant-carousel-rtl .ant-carousel .slick-next{left:-25px;right:auto}.ant-carousel-rtl .ant-carousel .slick-next:before{content:"←"}.ant-carousel-rtl.ant-carousel .slick-dots{flex-direction:row-reverse}.ant-carousel-rtl.ant-carousel-vertical .slick-dots{flex-direction:column}.ant-cascader-checkbox{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:1;list-style:none;margin:0;outline:none;padding:0;position:relative;top:.2em;white-space:nowrap}.ant-cascader-checkbox-input:focus+.ant-cascader-checkbox-inner,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner{border-color:#1890ff}.ant-cascader-checkbox-checked:after{animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;border:1px solid #1890ff;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;visibility:hidden;width:100%}.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox:after,.ant-cascader-checkbox:hover:after{visibility:visible}.ant-cascader-checkbox-inner{background-color:#fff;border:1px solid #d9d9d9;border-collapse:initial;border-radius:2px;direction:ltr;display:block;height:16px;left:0;position:relative;top:0;transition:all .3s;width:16px}.ant-cascader-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;height:9.14285714px;left:21.5%;opacity:0;position:absolute;top:50%;transform:rotate(45deg) scale(0) translate(-50%,-50%);transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;width:5.71428571px}.ant-cascader-checkbox-input{bottom:0;cursor:pointer;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%;z-index:1}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;opacity:1;position:absolute;transform:rotate(45deg) scale(1) translate(-50%,-50%);transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-cascader-checkbox-disabled{cursor:not-allowed}.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{animation-name:none;border-color:#00000040}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{animation-name:none;border-collapse:initial;border-color:#f5f5f5}.ant-cascader-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-cascader-checkbox-disabled:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled:after{visibility:hidden}.ant-cascader-checkbox-wrapper{font-feature-settings:"tnum","tnum";align-items:baseline;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:inherit;list-style:none;margin:0;padding:0}.ant-cascader-checkbox-wrapper:after{content:"\a0";display:inline-block;overflow:hidden;width:0}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled{cursor:not-allowed}.ant-cascader-checkbox-wrapper+.ant-cascader-checkbox-wrapper{margin-left:8px}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type=checkbox]{height:14px;width:14px}.ant-cascader-checkbox+span{padding-left:8px;padding-right:8px}.ant-cascader-checkbox-group{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-cascader-checkbox-group-item{margin-right:8px}.ant-cascader-checkbox-group-item:last-child{margin-right:0}.ant-cascader-checkbox-group-item+.ant-cascader-checkbox-group-item{margin-left:0}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner:after{background-color:#1890ff;border:0;content:" ";height:8px;left:50%;opacity:1;top:50%;transform:translate(-50%,-50%) scale(1);width:8px}.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-cascader{width:184px}.ant-cascader-checkbox{margin-right:8px;top:0}.ant-cascader-menus{align-items:flex-start;display:flex;flex-wrap:nowrap}.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu{height:auto;width:100%}.ant-cascader-menu{-ms-overflow-style:-ms-autohiding-scrollbar;border-right:1px solid #f0f0f0;flex-grow:1;height:180px;list-style:none;margin:-4px 0;min-width:111px;overflow:auto;padding:4px 0;vertical-align:top}.ant-cascader-menu-item{align-items:center;cursor:pointer;display:flex;flex-wrap:nowrap;line-height:22px;overflow:hidden;padding:5px 12px;text-overflow:ellipsis;transition:all .3s;white-space:nowrap}.ant-cascader-menu-item:hover{background:#f5f5f5}.ant-cascader-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-cascader-menu-item-disabled:hover{background:#0000}.ant-cascader-menu-empty .ant-cascader-menu-item{color:#00000040;cursor:default;pointer-events:none}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{background-color:#e6f7ff;font-weight:600}.ant-cascader-menu-item-content{flex:auto}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-loading-icon{color:#00000073;font-size:10px;margin-left:4px}.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon{color:#00000040}.ant-cascader-menu-item-keyword{color:#ff4d4f}.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,.ant-cascader-rtl .ant-cascader-menu-item-loading-icon{margin-left:0;margin-right:4px}.ant-cascader-rtl .ant-cascader-checkbox{margin-left:8px;margin-right:0;top:0}.ant-checkbox{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:1;list-style:none;margin:0;outline:none;padding:0;position:relative;top:.2em;white-space:nowrap}.ant-checkbox-input:focus+.ant-checkbox-inner,.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner{border-color:#1890ff}.ant-checkbox-checked:after{animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;border:1px solid #1890ff;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;visibility:hidden;width:100%}.ant-checkbox-wrapper:hover .ant-checkbox:after,.ant-checkbox:hover:after{visibility:visible}.ant-checkbox-inner{background-color:#fff;border:1px solid #d9d9d9;border-collapse:initial;border-radius:2px;direction:ltr;display:block;height:16px;left:0;position:relative;top:0;transition:all .3s;width:16px}.ant-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;height:9.14285714px;left:21.5%;opacity:0;position:absolute;top:50%;transform:rotate(45deg) scale(0) translate(-50%,-50%);transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;width:5.71428571px}.ant-checkbox-input{bottom:0;cursor:pointer;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%;z-index:1}.ant-checkbox-checked .ant-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;opacity:1;position:absolute;transform:rotate(45deg) scale(1) translate(-50%,-50%);transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-checkbox-checked .ant-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{animation-name:none;border-color:#00000040}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-checkbox-disabled .ant-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-checkbox-disabled .ant-checkbox-inner:after{animation-name:none;border-collapse:initial;border-color:#f5f5f5}.ant-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-checkbox-disabled:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox-disabled:after{visibility:hidden}.ant-checkbox-wrapper{font-feature-settings:"tnum","tnum";align-items:baseline;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:inherit;list-style:none;margin:0;padding:0}.ant-checkbox-wrapper:after{content:"\a0";display:inline-block;overflow:hidden;width:0}.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled{cursor:not-allowed}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type=checkbox]{height:14px;width:14px}.ant-checkbox+span{padding-left:8px;padding-right:8px}.ant-checkbox-group{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-checkbox-group-item{margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-checkbox-indeterminate .ant-checkbox-inner:after{background-color:#1890ff;border:0;content:" ";height:8px;left:50%;opacity:1;top:50%;transform:translate(-50%,-50%) scale(1);width:8px}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-checkbox-rtl{direction:rtl}.ant-checkbox-group-rtl .ant-checkbox-group-item{margin-left:8px;margin-right:0}.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child{margin-left:0!important}.ant-checkbox-group-rtl .ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:8px}.ant-row{flex-flow:row wrap}.ant-row,.ant-row:after,.ant-row:before{display:flex}.ant-row-no-wrap{flex-wrap:nowrap}.ant-row-start{justify-content:flex-start}.ant-row-center{justify-content:center}.ant-row-end{justify-content:flex-end}.ant-row-space-between{justify-content:space-between}.ant-row-space-around{justify-content:space-around}.ant-row-space-evenly{justify-content:space-evenly}.ant-row-top{align-items:flex-start}.ant-row-middle{align-items:center}.ant-row-bottom{align-items:flex-end}.ant-col{max-width:100%;min-height:1px;position:relative}.ant-col-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{order:24}.ant-col-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{order:23}.ant-col-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{order:22}.ant-col-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{order:21}.ant-col-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{order:20}.ant-col-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{order:19}.ant-col-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{order:18}.ant-col-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{order:17}.ant-col-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{order:16}.ant-col-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{order:15}.ant-col-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{order:14}.ant-col-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{order:13}.ant-col-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{order:12}.ant-col-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{order:11}.ant-col-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{order:10}.ant-col-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{order:9}.ant-col-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{order:8}.ant-col-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{order:7}.ant-col-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{order:6}.ant-col-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{order:5}.ant-col-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{order:4}.ant-col-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{order:3}.ant-col-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{order:2}.ant-col-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{order:0}.ant-col-offset-0.ant-col-rtl{margin-right:0}.ant-col-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}.ant-col-xs-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{order:24}.ant-col-xs-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{order:23}.ant-col-xs-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{order:22}.ant-col-xs-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{order:21}.ant-col-xs-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{order:20}.ant-col-xs-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{order:19}.ant-col-xs-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{order:18}.ant-col-xs-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{order:17}.ant-col-xs-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{order:16}.ant-col-xs-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{order:15}.ant-col-xs-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{order:14}.ant-col-xs-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{order:13}.ant-col-xs-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{order:12}.ant-col-xs-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{order:11}.ant-col-xs-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{order:10}.ant-col-xs-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{order:9}.ant-col-xs-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{order:8}.ant-col-xs-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{order:7}.ant-col-xs-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{order:6}.ant-col-xs-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{order:5}.ant-col-xs-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{order:4}.ant-col-xs-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{order:3}.ant-col-xs-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{order:2}.ant-col-xs-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xs-push-0.ant-col-rtl{right:auto}.ant-col-xs-pull-0.ant-col-rtl{left:auto}.ant-col-xs-offset-0.ant-col-rtl{margin-right:0}.ant-col-xs-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-xs-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-xs-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-xs-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-xs-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-xs-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-xs-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-xs-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-xs-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-xs-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-xs-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-xs-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-xs-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-xs-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-xs-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-xs-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-xs-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-xs-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-xs-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-xs-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-xs-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-xs-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-xs-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-xs-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-xs-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-xs-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-xs-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-xs-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-xs-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-xs-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-xs-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-xs-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-xs-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-xs-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-xs-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-xs-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-xs-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-xs-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-xs-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-xs-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-xs-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-xs-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-xs-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-xs-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-xs-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-xs-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-xs-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-xs-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-xs-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-xs-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-xs-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-xs-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-xs-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-xs-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-xs-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-xs-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-xs-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-xs-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-xs-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-xs-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-xs-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-xs-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-xs-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-xs-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-xs-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-xs-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-xs-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-xs-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-xs-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-xs-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-xs-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-xs-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}@media (min-width:576px){.ant-col-sm-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{order:24}.ant-col-sm-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{order:23}.ant-col-sm-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{order:22}.ant-col-sm-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{order:21}.ant-col-sm-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{order:20}.ant-col-sm-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{order:19}.ant-col-sm-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{order:18}.ant-col-sm-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{order:17}.ant-col-sm-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{order:16}.ant-col-sm-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{order:15}.ant-col-sm-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{order:14}.ant-col-sm-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{order:13}.ant-col-sm-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{order:12}.ant-col-sm-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{order:11}.ant-col-sm-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{order:10}.ant-col-sm-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{order:9}.ant-col-sm-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{order:8}.ant-col-sm-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{order:7}.ant-col-sm-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{order:6}.ant-col-sm-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{order:5}.ant-col-sm-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{order:4}.ant-col-sm-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{order:3}.ant-col-sm-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{order:2}.ant-col-sm-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-sm-push-0.ant-col-rtl{right:auto}.ant-col-sm-pull-0.ant-col-rtl{left:auto}.ant-col-sm-offset-0.ant-col-rtl{margin-right:0}.ant-col-sm-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-sm-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-sm-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-sm-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-sm-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-sm-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-sm-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-sm-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-sm-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-sm-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-sm-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-sm-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-sm-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-sm-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-sm-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-sm-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-sm-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-sm-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-sm-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-sm-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-sm-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-sm-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-sm-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-sm-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-sm-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-sm-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-sm-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-sm-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-sm-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-sm-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-sm-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-sm-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-sm-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-sm-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-sm-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-sm-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-sm-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-sm-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-sm-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-sm-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-sm-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-sm-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-sm-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-sm-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-sm-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-sm-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-sm-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-sm-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-sm-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-sm-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-sm-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-sm-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-sm-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-sm-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-sm-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-sm-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-sm-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-sm-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-sm-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-sm-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-sm-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-sm-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-sm-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-sm-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-sm-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-sm-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-sm-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-sm-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-sm-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-sm-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-sm-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-sm-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}}@media (min-width:768px){.ant-col-md-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{order:24}.ant-col-md-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{order:23}.ant-col-md-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{order:22}.ant-col-md-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{order:21}.ant-col-md-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{order:20}.ant-col-md-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{order:19}.ant-col-md-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{order:18}.ant-col-md-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{order:17}.ant-col-md-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{order:16}.ant-col-md-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{order:15}.ant-col-md-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{order:14}.ant-col-md-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{order:13}.ant-col-md-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{order:12}.ant-col-md-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{order:11}.ant-col-md-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{order:10}.ant-col-md-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{order:9}.ant-col-md-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{order:8}.ant-col-md-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{order:7}.ant-col-md-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{order:6}.ant-col-md-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{order:5}.ant-col-md-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{order:4}.ant-col-md-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{order:3}.ant-col-md-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{order:2}.ant-col-md-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-md-push-0.ant-col-rtl{right:auto}.ant-col-md-pull-0.ant-col-rtl{left:auto}.ant-col-md-offset-0.ant-col-rtl{margin-right:0}.ant-col-md-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-md-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-md-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-md-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-md-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-md-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-md-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-md-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-md-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-md-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-md-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-md-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-md-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-md-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-md-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-md-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-md-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-md-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-md-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-md-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-md-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-md-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-md-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-md-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-md-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-md-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-md-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-md-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-md-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-md-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-md-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-md-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-md-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-md-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-md-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-md-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-md-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-md-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-md-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-md-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-md-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-md-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-md-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-md-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-md-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-md-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-md-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-md-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-md-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-md-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-md-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-md-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-md-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-md-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-md-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-md-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-md-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-md-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-md-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-md-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-md-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-md-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-md-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-md-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-md-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-md-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-md-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-md-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-md-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-md-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-md-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-md-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}}@media (min-width:992px){.ant-col-lg-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{order:24}.ant-col-lg-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{order:23}.ant-col-lg-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{order:22}.ant-col-lg-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{order:21}.ant-col-lg-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{order:20}.ant-col-lg-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{order:19}.ant-col-lg-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{order:18}.ant-col-lg-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{order:17}.ant-col-lg-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{order:16}.ant-col-lg-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{order:15}.ant-col-lg-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{order:14}.ant-col-lg-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{order:13}.ant-col-lg-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{order:12}.ant-col-lg-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{order:11}.ant-col-lg-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{order:10}.ant-col-lg-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{order:9}.ant-col-lg-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{order:8}.ant-col-lg-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{order:7}.ant-col-lg-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{order:6}.ant-col-lg-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{order:5}.ant-col-lg-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{order:4}.ant-col-lg-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{order:3}.ant-col-lg-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{order:2}.ant-col-lg-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-lg-push-0.ant-col-rtl{right:auto}.ant-col-lg-pull-0.ant-col-rtl{left:auto}.ant-col-lg-offset-0.ant-col-rtl{margin-right:0}.ant-col-lg-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-lg-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-lg-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-lg-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-lg-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-lg-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-lg-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-lg-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-lg-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-lg-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-lg-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-lg-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-lg-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-lg-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-lg-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-lg-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-lg-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-lg-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-lg-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-lg-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-lg-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-lg-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-lg-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-lg-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-lg-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-lg-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-lg-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-lg-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-lg-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-lg-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-lg-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-lg-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-lg-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-lg-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-lg-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-lg-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-lg-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-lg-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-lg-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-lg-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-lg-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-lg-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-lg-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-lg-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-lg-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-lg-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-lg-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-lg-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-lg-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-lg-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-lg-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-lg-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-lg-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-lg-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-lg-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-lg-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-lg-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-lg-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-lg-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-lg-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-lg-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-lg-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-lg-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-lg-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-lg-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-lg-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-lg-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-lg-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-lg-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-lg-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-lg-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-lg-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}}@media (min-width:1200px){.ant-col-xl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{order:24}.ant-col-xl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{order:23}.ant-col-xl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{order:22}.ant-col-xl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{order:21}.ant-col-xl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{order:20}.ant-col-xl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{order:19}.ant-col-xl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{order:18}.ant-col-xl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{order:17}.ant-col-xl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{order:16}.ant-col-xl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{order:15}.ant-col-xl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{order:14}.ant-col-xl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{order:13}.ant-col-xl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{order:12}.ant-col-xl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{order:11}.ant-col-xl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{order:10}.ant-col-xl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{order:9}.ant-col-xl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{order:8}.ant-col-xl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{order:7}.ant-col-xl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{order:6}.ant-col-xl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{order:5}.ant-col-xl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{order:4}.ant-col-xl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{order:3}.ant-col-xl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{order:2}.ant-col-xl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xl-push-0.ant-col-rtl{right:auto}.ant-col-xl-pull-0.ant-col-rtl{left:auto}.ant-col-xl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xl-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-xl-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-xl-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-xl-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-xl-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-xl-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-xl-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-xl-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-xl-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-xl-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-xl-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-xl-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-xl-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-xl-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-xl-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-xl-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-xl-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-xl-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-xl-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-xl-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-xl-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-xl-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-xl-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-xl-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-xl-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-xl-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-xl-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-xl-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-xl-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-xl-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-xl-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-xl-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-xl-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-xl-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-xl-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-xl-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-xl-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-xl-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-xl-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-xl-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-xl-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-xl-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-xl-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-xl-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-xl-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-xl-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-xl-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-xl-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-xl-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-xl-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-xl-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-xl-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-xl-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-xl-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-xl-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-xl-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-xl-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-xl-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-xl-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-xl-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-xl-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-xl-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-xl-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-xl-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-xl-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-xl-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-xl-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-xl-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-xl-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-xl-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-xl-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-xl-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}}@media (min-width:1600px){.ant-col-xxl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{order:24}.ant-col-xxl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{order:23}.ant-col-xxl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{order:22}.ant-col-xxl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{order:21}.ant-col-xxl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{order:20}.ant-col-xxl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{order:19}.ant-col-xxl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{order:18}.ant-col-xxl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{order:17}.ant-col-xxl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{order:16}.ant-col-xxl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{order:15}.ant-col-xxl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{order:14}.ant-col-xxl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{order:13}.ant-col-xxl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{order:12}.ant-col-xxl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{order:11}.ant-col-xxl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{order:10}.ant-col-xxl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{order:9}.ant-col-xxl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{order:8}.ant-col-xxl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{order:7}.ant-col-xxl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{order:6}.ant-col-xxl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{order:5}.ant-col-xxl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{order:4}.ant-col-xxl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{order:3}.ant-col-xxl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{order:2}.ant-col-xxl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-push-0.ant-col-rtl{right:auto}.ant-col-xxl-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xxl-push-1.ant-col-rtl{left:auto;right:4.16666667%}.ant-col-xxl-pull-1.ant-col-rtl{left:4.16666667%;right:auto}.ant-col-xxl-offset-1.ant-col-rtl{margin-left:0;margin-right:4.16666667%}.ant-col-xxl-push-2.ant-col-rtl{left:auto;right:8.33333333%}.ant-col-xxl-pull-2.ant-col-rtl{left:8.33333333%;right:auto}.ant-col-xxl-offset-2.ant-col-rtl{margin-left:0;margin-right:8.33333333%}.ant-col-xxl-push-3.ant-col-rtl{left:auto;right:12.5%}.ant-col-xxl-pull-3.ant-col-rtl{left:12.5%;right:auto}.ant-col-xxl-offset-3.ant-col-rtl{margin-left:0;margin-right:12.5%}.ant-col-xxl-push-4.ant-col-rtl{left:auto;right:16.66666667%}.ant-col-xxl-pull-4.ant-col-rtl{left:16.66666667%;right:auto}.ant-col-xxl-offset-4.ant-col-rtl{margin-left:0;margin-right:16.66666667%}.ant-col-xxl-push-5.ant-col-rtl{left:auto;right:20.83333333%}.ant-col-xxl-pull-5.ant-col-rtl{left:20.83333333%;right:auto}.ant-col-xxl-offset-5.ant-col-rtl{margin-left:0;margin-right:20.83333333%}.ant-col-xxl-push-6.ant-col-rtl{left:auto;right:25%}.ant-col-xxl-pull-6.ant-col-rtl{left:25%;right:auto}.ant-col-xxl-offset-6.ant-col-rtl{margin-left:0;margin-right:25%}.ant-col-xxl-push-7.ant-col-rtl{left:auto;right:29.16666667%}.ant-col-xxl-pull-7.ant-col-rtl{left:29.16666667%;right:auto}.ant-col-xxl-offset-7.ant-col-rtl{margin-left:0;margin-right:29.16666667%}.ant-col-xxl-push-8.ant-col-rtl{left:auto;right:33.33333333%}.ant-col-xxl-pull-8.ant-col-rtl{left:33.33333333%;right:auto}.ant-col-xxl-offset-8.ant-col-rtl{margin-left:0;margin-right:33.33333333%}.ant-col-xxl-push-9.ant-col-rtl{left:auto;right:37.5%}.ant-col-xxl-pull-9.ant-col-rtl{left:37.5%;right:auto}.ant-col-xxl-offset-9.ant-col-rtl{margin-left:0;margin-right:37.5%}.ant-col-xxl-push-10.ant-col-rtl{left:auto;right:41.66666667%}.ant-col-xxl-pull-10.ant-col-rtl{left:41.66666667%;right:auto}.ant-col-xxl-offset-10.ant-col-rtl{margin-left:0;margin-right:41.66666667%}.ant-col-xxl-push-11.ant-col-rtl{left:auto;right:45.83333333%}.ant-col-xxl-pull-11.ant-col-rtl{left:45.83333333%;right:auto}.ant-col-xxl-offset-11.ant-col-rtl{margin-left:0;margin-right:45.83333333%}.ant-col-xxl-push-12.ant-col-rtl{left:auto;right:50%}.ant-col-xxl-pull-12.ant-col-rtl{left:50%;right:auto}.ant-col-xxl-offset-12.ant-col-rtl{margin-left:0;margin-right:50%}.ant-col-xxl-push-13.ant-col-rtl{left:auto;right:54.16666667%}.ant-col-xxl-pull-13.ant-col-rtl{left:54.16666667%;right:auto}.ant-col-xxl-offset-13.ant-col-rtl{margin-left:0;margin-right:54.16666667%}.ant-col-xxl-push-14.ant-col-rtl{left:auto;right:58.33333333%}.ant-col-xxl-pull-14.ant-col-rtl{left:58.33333333%;right:auto}.ant-col-xxl-offset-14.ant-col-rtl{margin-left:0;margin-right:58.33333333%}.ant-col-xxl-push-15.ant-col-rtl{left:auto;right:62.5%}.ant-col-xxl-pull-15.ant-col-rtl{left:62.5%;right:auto}.ant-col-xxl-offset-15.ant-col-rtl{margin-left:0;margin-right:62.5%}.ant-col-xxl-push-16.ant-col-rtl{left:auto;right:66.66666667%}.ant-col-xxl-pull-16.ant-col-rtl{left:66.66666667%;right:auto}.ant-col-xxl-offset-16.ant-col-rtl{margin-left:0;margin-right:66.66666667%}.ant-col-xxl-push-17.ant-col-rtl{left:auto;right:70.83333333%}.ant-col-xxl-pull-17.ant-col-rtl{left:70.83333333%;right:auto}.ant-col-xxl-offset-17.ant-col-rtl{margin-left:0;margin-right:70.83333333%}.ant-col-xxl-push-18.ant-col-rtl{left:auto;right:75%}.ant-col-xxl-pull-18.ant-col-rtl{left:75%;right:auto}.ant-col-xxl-offset-18.ant-col-rtl{margin-left:0;margin-right:75%}.ant-col-xxl-push-19.ant-col-rtl{left:auto;right:79.16666667%}.ant-col-xxl-pull-19.ant-col-rtl{left:79.16666667%;right:auto}.ant-col-xxl-offset-19.ant-col-rtl{margin-left:0;margin-right:79.16666667%}.ant-col-xxl-push-20.ant-col-rtl{left:auto;right:83.33333333%}.ant-col-xxl-pull-20.ant-col-rtl{left:83.33333333%;right:auto}.ant-col-xxl-offset-20.ant-col-rtl{margin-left:0;margin-right:83.33333333%}.ant-col-xxl-push-21.ant-col-rtl{left:auto;right:87.5%}.ant-col-xxl-pull-21.ant-col-rtl{left:87.5%;right:auto}.ant-col-xxl-offset-21.ant-col-rtl{margin-left:0;margin-right:87.5%}.ant-col-xxl-push-22.ant-col-rtl{left:auto;right:91.66666667%}.ant-col-xxl-pull-22.ant-col-rtl{left:91.66666667%;right:auto}.ant-col-xxl-offset-22.ant-col-rtl{margin-left:0;margin-right:91.66666667%}.ant-col-xxl-push-23.ant-col-rtl{left:auto;right:95.83333333%}.ant-col-xxl-pull-23.ant-col-rtl{left:95.83333333%;right:auto}.ant-col-xxl-offset-23.ant-col-rtl{margin-left:0;margin-right:95.83333333%}.ant-col-xxl-push-24.ant-col-rtl{left:auto;right:100%}.ant-col-xxl-pull-24.ant-col-rtl{left:100%;right:auto}.ant-col-xxl-offset-24.ant-col-rtl{margin-left:0;margin-right:100%}}.ant-row-rtl{direction:rtl}.ant-collapse{font-feature-settings:"tnum","tnum";background-color:#fafafa;border:1px solid #d9d9d9;border-bottom:0;border-radius:2px;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{border-radius:0 0 2px 2px}.ant-collapse>.ant-collapse-item>.ant-collapse-header{align-items:flex-start;color:#000000d9;cursor:pointer;display:flex;flex-wrap:nowrap;line-height:1.5715;padding:12px 16px;position:relative;transition:all .3s,visibility 0s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{display:inline-block;font-size:12px;margin-right:12px;vertical-align:-1px}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transition:transform .24s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-left:auto}.ant-collapse>.ant-collapse-item>.ant-collapse-header:focus{outline:none}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only{cursor:default}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only .ant-collapse-header-text{cursor:pointer}.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:12px}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{padding:12px 40px 12px 16px;position:relative}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{left:auto;margin:0;position:absolute;right:16px;top:50%;transform:translateY(-50%)}.ant-collapse-content{background-color:#fff;border-top:1px solid #d9d9d9;color:#000000d9}.ant-collapse-content>.ant-collapse-content-box{padding:16px}.ant-collapse-content-hidden{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 2px 2px}.ant-collapse-borderless{background-color:#fafafa;border:0}.ant-collapse-borderless>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item:last-child,.ant-collapse-borderless>.ant-collapse-item:last-child .ant-collapse-header{border-radius:0}.ant-collapse-borderless>.ant-collapse-item:last-child{border-bottom:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:initial;border-top:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:4px}.ant-collapse-ghost{background-color:initial;border:0}.ant-collapse-ghost>.ant-collapse-item{border-bottom:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content{background-color:initial;border-top:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-bottom:12px;padding-top:12px}.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header,.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header>.arrow{color:#00000040;cursor:not-allowed}.ant-collapse-rtl{direction:rtl}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{padding:12px 16px 12px 40px;position:relative}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{left:16px;margin:0;position:absolute;right:auto;top:50%;transform:translateY(-50%)}.ant-collapse-rtl .ant-collapse>.ant-collapse-item>.ant-collapse-header{padding:12px 40px 12px 16px}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{margin-left:12px;margin-right:0}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transform:rotate(180deg)}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-left:0;margin-right:auto}.ant-collapse-rtl.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:0;padding-right:12px}.ant-comment{background-color:inherit;position:relative}.ant-comment-inner{display:flex;padding:16px 0}.ant-comment-avatar{cursor:pointer;flex-shrink:0;margin-right:12px;position:relative}.ant-comment-avatar img{border-radius:50%;height:32px;width:32px}.ant-comment-content{word-wrap:break-word;flex:1 1 auto;font-size:14px;min-width:1px;position:relative}.ant-comment-content-author{display:flex;flex-wrap:wrap;font-size:14px;justify-content:flex-start;margin-bottom:4px}.ant-comment-content-author>a,.ant-comment-content-author>span{font-size:12px;line-height:18px;padding-right:8px}.ant-comment-content-author-name{color:#00000073;font-size:14px;transition:color .3s}.ant-comment-content-author-name>*,.ant-comment-content-author-name>:hover{color:#00000073}.ant-comment-content-author-time{color:#ccc;cursor:auto;white-space:nowrap}.ant-comment-content-detail p{margin-bottom:inherit;white-space:pre-wrap}.ant-comment-actions{margin-bottom:inherit;margin-top:12px;padding-left:0}.ant-comment-actions>li{color:#00000073;display:inline-block}.ant-comment-actions>li>span{color:#00000073;cursor:pointer;font-size:12px;margin-right:10px;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-comment-actions>li>span:hover{color:#595959}.ant-comment-nested{margin-left:44px}.ant-comment-rtl{direction:rtl}.ant-comment-rtl .ant-comment-avatar{margin-left:12px;margin-right:0}.ant-comment-rtl .ant-comment-content-author>a,.ant-comment-rtl .ant-comment-content-author>span{padding-left:8px;padding-right:0}.ant-comment-rtl .ant-comment-actions{padding-right:0}.ant-comment-rtl .ant-comment-actions>li>span{margin-left:10px;margin-right:0}.ant-comment-rtl .ant-comment-nested{margin-left:0;margin-right:44px}.ant-descriptions-header{align-items:center;display:flex;margin-bottom:20px}.ant-descriptions-title{color:#000000d9;flex:auto;font-size:16px;font-weight:700;line-height:1.5715;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-descriptions-extra{color:#000000d9;font-size:14px;margin-left:auto}.ant-descriptions-view{border-radius:2px;width:100%}.ant-descriptions-view table{table-layout:fixed;width:100%}.ant-descriptions-row>td,.ant-descriptions-row>th{padding-bottom:16px}.ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-item-label{color:#000000d9;font-size:14px;font-weight:400;line-height:1.5715;text-align:start}.ant-descriptions-item-label:after{content:":";margin:0 8px 0 2px;position:relative;top:-.5px}.ant-descriptions-item-label.ant-descriptions-item-no-colon:after{content:" "}.ant-descriptions-item-no-label:after{content:"";margin:0}.ant-descriptions-item-content{color:#000000d9;display:table-cell;flex:1 1;font-size:14px;line-height:1.5715;overflow-wrap:break-word;word-break:break-word}.ant-descriptions-item{padding-bottom:0;vertical-align:top}.ant-descriptions-item-container{display:flex}.ant-descriptions-item-container .ant-descriptions-item-content,.ant-descriptions-item-container .ant-descriptions-item-label{align-items:baseline;display:inline-flex}.ant-descriptions-middle .ant-descriptions-row>td,.ant-descriptions-middle .ant-descriptions-row>th{padding-bottom:12px}.ant-descriptions-small .ant-descriptions-row>td,.ant-descriptions-small .ant-descriptions-row>th{padding-bottom:8px}.ant-descriptions-bordered .ant-descriptions-view{border:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-view>table{border-collapse:collapse;table-layout:auto}.ant-descriptions-bordered .ant-descriptions-item-content,.ant-descriptions-bordered .ant-descriptions-item-label{border-right:1px solid #f0f0f0;padding:16px 24px}.ant-descriptions-bordered .ant-descriptions-item-content:last-child,.ant-descriptions-bordered .ant-descriptions-item-label:last-child{border-right:none}.ant-descriptions-bordered .ant-descriptions-item-label{background-color:#fafafa}.ant-descriptions-bordered .ant-descriptions-item-label:after{display:none}.ant-descriptions-bordered .ant-descriptions-row{border-bottom:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content,.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label{padding:12px 24px}.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content,.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label{padding:8px 16px}.ant-descriptions-rtl{direction:rtl}.ant-descriptions-rtl .ant-descriptions-item-label:after{margin:0 2px 0 8px}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label{border-left:1px solid #f0f0f0;border-right:none}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content:last-child,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label:last-child{border-left:none}.ant-divider{font-feature-settings:"tnum","tnum";border-top:1px solid #0000000f;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-divider-vertical{border-left:1px solid #0000000f;border-top:0;display:inline-block;height:.9em;margin:0 8px;position:relative;top:-.06em;vertical-align:middle}.ant-divider-horizontal{clear:both;display:flex;margin:24px 0;min-width:100%;width:100%}.ant-divider-horizontal.ant-divider-with-text{border-top:0;border-top-color:#0000000f;color:#000000d9;display:flex;font-size:16px;font-weight:500;margin:16px 0;text-align:center;white-space:nowrap}.ant-divider-horizontal.ant-divider-with-text:after,.ant-divider-horizontal.ant-divider-with-text:before{border-bottom:0;border-top:1px solid #0000;border-top-color:inherit;content:"";position:relative;top:50%;transform:translateY(50%);width:50%}.ant-divider-horizontal.ant-divider-with-text-left:before{top:50%;width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-horizontal.ant-divider-with-text-right:before{top:50%;width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{top:50%;width:5%}.ant-divider-inner-text{display:inline-block;padding:0 1em}.ant-divider-dashed{background:none;border:dashed #0000000f;border-width:1px 0 0}.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before{border-style:dashed none none}.ant-divider-vertical.ant-divider-dashed{border-width:0 0 0 1px}.ant-divider-plain.ant-divider-with-text{color:#000000d9;font-size:14px;font-weight:400}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:before{width:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:after{width:100%}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text{padding-left:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:before{width:100%}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:after{width:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text{padding-right:0}.ant-divider-rtl{direction:rtl}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:before{width:95%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:before{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:after{width:95%}.ant-drawer{inset:0;pointer-events:none;position:fixed;z-index:1000}.ant-drawer-inline{position:absolute}.ant-drawer-mask{background:#00000073;inset:0;pointer-events:auto;position:absolute;z-index:1000}.ant-drawer-content-wrapper{position:absolute;transition:transform .3s;z-index:1000}.ant-drawer-left .ant-drawer-content-wrapper{bottom:0;left:0;top:0}.ant-drawer-right .ant-drawer-content-wrapper{bottom:0;right:0;top:0}.ant-drawer-top .ant-drawer-content-wrapper{left:0;right:0;top:0}.ant-drawer-bottom .ant-drawer-content-wrapper{bottom:0;left:0;right:0}.ant-drawer-content{height:100%;overflow:auto;pointer-events:auto;width:100%}.ant-drawer-content-hidden{display:none}.ant-drawer-left .ant-drawer-content{box-shadow:6px 0 16px -8px #00000014,9px 0 28px 0 #0000000d,12px 0 48px 16px #00000008}.ant-drawer-right .ant-drawer-content{box-shadow:-6px 0 16px -8px #00000014,-9px 0 28px 0 #0000000d,-12px 0 48px 16px #00000008}.ant-drawer-top .ant-drawer-content{box-shadow:0 6px 16px -8px #00000014,0 9px 28px 0 #0000000d,0 12px 48px 16px #00000008}.ant-drawer-bottom .ant-drawer-content{box-shadow:0 -6px 16px -8px #00000014,0 -9px 28px 0 #0000000d,0 -12px 48px 16px #00000008}.ant-drawer-wrapper-body{background:#fff;display:flex;flex-direction:column;height:100%;width:100%}.ant-drawer-header{align-items:center;border-bottom:1px solid #f0f0f0;display:flex;flex:0 1;font-size:16px;line-height:22px;padding:16px 24px}.ant-drawer-header-title{align-items:center;display:flex;flex:1 1;min-height:0;min-width:0}.ant-drawer-extra{flex:0 1}.ant-drawer-close{text-rendering:auto;background:#0000;border:0;color:#00000073;cursor:pointer;display:inline-block;font-size:16px;font-style:normal;font-weight:700;line-height:1;margin-right:12px;outline:0;text-align:center;text-decoration:none;text-transform:none;transition:color .3s}.ant-drawer-close:focus,.ant-drawer-close:hover{color:#000000bf;text-decoration:none}.ant-drawer-title{color:#000000d9;flex:1 1;font-size:16px;font-weight:500;line-height:22px;margin:0}.ant-drawer-body{flex:1 1;min-height:0;min-width:0;overflow:auto;padding:24px}.ant-drawer-footer{border-top:1px solid #f0f0f0;flex-shrink:0;padding:10px 16px}.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-leave-active,.panel-motion-appear-active,.panel-motion-enter-active,.panel-motion-leave-active{transition:all .3s}.ant-drawer-mask-motion-appear,.ant-drawer-mask-motion-enter{opacity:0}.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-leave{opacity:1}.ant-drawer-mask-motion-leave-active{opacity:0}.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-leave-active{transition:all .3s}.ant-drawer-panel-motion-left-appear,.ant-drawer-panel-motion-left-enter{transform:translateX(-100%)}.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-leave{transform:translateX(0)}.ant-drawer-panel-motion-left-leave-active{transform:translateX(-100%)}.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-leave-active{transition:all .3s}.ant-drawer-panel-motion-right-appear,.ant-drawer-panel-motion-right-enter{transform:translateX(100%)}.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-leave{transform:translateX(0)}.ant-drawer-panel-motion-right-leave-active{transform:translateX(100%)}.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-leave-active{transition:all .3s}.ant-drawer-panel-motion-top-appear,.ant-drawer-panel-motion-top-enter{transform:translateY(-100%)}.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-leave{transform:translateY(0)}.ant-drawer-panel-motion-top-leave-active{transform:translateY(-100%)}.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-leave-active{transition:all .3s}.ant-drawer-panel-motion-bottom-appear,.ant-drawer-panel-motion-bottom-enter{transform:translateY(100%)}.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-leave{transform:translateY(0)}.ant-drawer-panel-motion-bottom-leave-active{transform:translateY(100%)}.ant-drawer-rtl{direction:rtl}.ant-drawer-rtl .ant-drawer-close{margin-left:12px;margin-right:0}.ant-form-item .ant-input-number+.ant-form-text{margin-left:8px}.ant-form-inline{display:flex;flex-wrap:wrap}.ant-form-inline .ant-form-item{flex:none;flex-wrap:nowrap;margin-bottom:0;margin-right:16px}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-control,.ant-form-inline .ant-form-item>.ant-form-item-label{display:inline-block;vertical-align:top}.ant-form-inline .ant-form-item>.ant-form-item-label{flex:none}.ant-form-inline .ant-form-item .ant-form-item-has-feedback,.ant-form-inline .ant-form-item .ant-form-text{display:inline-block}.ant-form-horizontal .ant-form-item-label{flex-grow:0}.ant-form-horizontal .ant-form-item-control{flex:1 1;min-width:0}.ant-form-horizontal .ant-form-item-label[class$="-24"]+.ant-form-item-control,.ant-form-horizontal .ant-form-item-label[class*="-24 "]+.ant-form-item-control{min-width:auto}.ant-form-vertical .ant-form-item{flex-direction:column}.ant-form-vertical .ant-form-item-label>label{height:auto}.ant-form-vertical .ant-form-item .ant-form-item-control{width:100%}.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label,.ant-form-vertical .ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-24.ant-form-item-label>label,.ant-col-xl-24.ant-form-item-label>label,.ant-form-vertical .ant-form-item-label>label{margin:0}.ant-col-24.ant-form-item-label>label:after,.ant-col-xl-24.ant-form-item-label>label:after,.ant-form-vertical .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-24.ant-form-item-label,.ant-form-rtl.ant-col-xl-24.ant-form-item-label,.ant-form-rtl.ant-form-vertical .ant-form-item-label{text-align:right}@media (max-width:575px){.ant-form-item .ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-form-item .ant-form-item-label>label{margin:0}.ant-form-item .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-item .ant-form-item-label{text-align:right}.ant-form .ant-form-item{flex-wrap:wrap}.ant-form .ant-form-item .ant-form-item-control,.ant-form .ant-form-item .ant-form-item-label{flex:0 0 100%;max-width:100%}.ant-col-xs-24.ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-xs-24.ant-form-item-label>label{margin:0}.ant-col-xs-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xs-24.ant-form-item-label{text-align:right}}@media (max-width:767px){.ant-col-sm-24.ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-sm-24.ant-form-item-label>label{margin:0}.ant-col-sm-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-sm-24.ant-form-item-label{text-align:right}}@media (max-width:991px){.ant-col-md-24.ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-md-24.ant-form-item-label>label{margin:0}.ant-col-md-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-md-24.ant-form-item-label{text-align:right}}@media (max-width:1199px){.ant-col-lg-24.ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-lg-24.ant-form-item-label>label{margin:0}.ant-col-lg-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-lg-24.ant-form-item-label{text-align:right}}@media (max-width:1599px){.ant-col-xl-24.ant-form-item-label{line-height:1.5715;padding:0 0 8px;text-align:left;white-space:normal}.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}}.ant-form-item-explain-error{color:#ff4d4f}.ant-form-item-explain-warning{color:#faad14}.ant-form-item-has-feedback .ant-switch{margin:2px 0 4px}.ant-form-item-has-warning .ant-form-item-split{color:#faad14}.ant-form-item-has-error .ant-form-item-split{color:#ff4d4f}.ant-form{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-form legend{border:0;border-bottom:1px solid #d9d9d9;color:#00000073;display:block;font-size:16px;line-height:inherit;margin-bottom:20px;padding:0;width:100%}.ant-form label{font-size:14px}.ant-form input[type=search]{box-sizing:border-box}.ant-form input[type=checkbox],.ant-form input[type=radio]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=checkbox]:focus,.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{color:#000000d9;display:block;font-size:14px;line-height:1.5715;padding-top:15px}.ant-form .ant-form-text{display:inline-block;padding-right:8px}.ant-form-small .ant-form-item-label>label{height:24px}.ant-form-small .ant-form-item-control-input{min-height:24px}.ant-form-large .ant-form-item-label>label{height:40px}.ant-form-large .ant-form-item-control-input{min-height:40px}.ant-form-item{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0 0 24px;padding:0;vertical-align:top}.ant-form-item-with-help{transition:none}.ant-form-item-hidden,.ant-form-item-hidden.ant-row{display:none}.ant-form-item-label{display:inline-block;flex-grow:0;overflow:hidden;text-align:right;vertical-align:middle;white-space:nowrap}.ant-form-item-label-left{text-align:left}.ant-form-item-label-wrap{line-height:1.3215em;overflow:initial;white-space:inherit}.ant-form-item-label>label{align-items:center;color:#000000d9;display:inline-flex;font-size:14px;height:32px;max-width:100%;position:relative}.ant-form-item-label>label>.anticon{font-size:14px;vertical-align:top}.ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{color:#ff4d4f;content:"*";display:inline-block;font-family:SimSun,sans-serif;font-size:14px;line-height:1;margin-right:4px}.ant-form-hide-required-mark .ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:none}.ant-form-item-label>label .ant-form-item-optional{color:#00000073;display:inline-block;margin-left:4px}.ant-form-hide-required-mark .ant-form-item-label>label .ant-form-item-optional{display:none}.ant-form-item-label>label .ant-form-item-tooltip{color:#00000073;cursor:help;margin-inline-start:4px;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb}.ant-form-item-label>label:after{content:":";margin:0 8px 0 2px;position:relative;top:-.5px}.ant-form-item-label>label.ant-form-item-no-colon:after{content:" "}.ant-form-item-control{display:flex;flex-direction:column;flex-grow:1}.ant-form-item-control:first-child:not([class^=ant-col-]):not([class*=" ant-col-"]){width:100%}.ant-form-item-control-input{align-items:center;display:flex;min-height:32px;position:relative}.ant-form-item-control-input-content{flex:auto;max-width:100%}.ant-form-item-explain,.ant-form-item-extra{clear:both;color:#00000073;font-size:14px;line-height:1.5715;transition:color .3s cubic-bezier(.215,.61,.355,1)}.ant-form-item-explain-connected{width:100%}.ant-form-item-extra{min-height:24px}.ant-form-item-with-help .ant-form-item-explain{height:auto;opacity:1}.ant-form-item-feedback-icon{animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);font-size:14px;pointer-events:none;text-align:center;visibility:visible}.ant-form-item-feedback-icon-success{color:#52c41a}.ant-form-item-feedback-icon-error{color:#ff4d4f}.ant-form-item-feedback-icon-warning{color:#faad14}.ant-form-item-feedback-icon-validating{color:#1890ff}.ant-show-help{transition:opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-show-help-appear,.ant-show-help-enter{opacity:0}.ant-show-help-appear-active,.ant-show-help-enter-active,.ant-show-help-leave{opacity:1}.ant-show-help-leave-active{opacity:0}.ant-show-help-item{overflow:hidden;transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-appear,.ant-show-help-item-enter{opacity:0;transform:translateY(-5px)}.ant-show-help-item-appear-active,.ant-show-help-item-enter-active{opacity:1;transform:translateY(0)}.ant-show-help-item-leave{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1),transform .2s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-leave-active{transform:translateY(-5px)}@keyframes diffZoomIn1{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}@keyframes diffZoomIn2{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}@keyframes diffZoomIn3{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.ant-form-rtl{direction:rtl}.ant-form-rtl .ant-form-item-label{text-align:left}.ant-form-rtl .ant-form-item-label>label.ant-form-item-required:before{margin-left:4px;margin-right:0}.ant-form-rtl .ant-form-item-label>label:after{margin:0 2px 0 8px}.ant-form-rtl .ant-form-item-label>label .ant-form-item-optional{margin-left:0;margin-right:4px}.ant-col-rtl .ant-form-item-control:first-child{width:100%}.ant-form-rtl .ant-form-item-has-feedback .ant-input{padding-left:24px;padding-right:11px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix{padding-left:18px;padding-right:11px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input,.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number{padding:0}.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix{left:28px;right:auto}.ant-form-rtl .ant-form-item-has-feedback .ant-input-number{padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-clear{left:32px;right:auto}.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-selection-selected-value{padding-left:42px;padding-right:0}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow{margin-left:19px;margin-right:0}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear{left:32px;right:auto}.ant-form-rtl .ant-form-item-has-feedback .ant-picker,.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large{padding-left:29.2px;padding-right:11px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small{padding-left:25.2px;padding-right:7px}.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon{left:0;right:auto}.ant-form-rtl.ant-form-inline .ant-form-item{margin-left:16px;margin-right:0}.ant-image{display:inline-block;position:relative}.ant-image-img{height:auto;vertical-align:middle;width:100%}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE0LjUgMi41aC0xM0EuNS41IDAgMCAwIDEgM3YxMGEuNS41IDAgMCAwIC41LjVoMTNhLjUuNSAwIDAgMCAuNS0uNVYzYS41LjUgMCAwIDAtLjUtLjV6TTUuMjgxIDQuNzVhMSAxIDAgMCAxIDAgMiAxIDEgMCAwIDEgMC0yem04LjAzIDYuODNhLjEyNy4xMjcgMCAwIDEtLjA4MS4wM0gyLjc2OWEuMTI1LjEyNSAwIDAgMS0uMDk2LS4yMDdsMi42NjEtMy4xNTZhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTYuMDE2TDcuMDggMTAuMDlsMi40Ny0yLjkzYS4xMjYuMTI2IDAgMCAxIC4xNzctLjAxNmwuMDE1LjAxNiAzLjU4OCA0LjI0NGEuMTI3LjEyNyAwIDAgMS0uMDIuMTc1eiIgZmlsbD0iIzhDOEM4QyIvPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:30%}.ant-image-mask{align-items:center;background:#00000080;bottom:0;color:#fff;cursor:pointer;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .3s}.ant-image-mask-info{overflow:hidden;padding:0 4px;text-overflow:ellipsis;white-space:nowrap}.ant-image-mask-info .anticon{margin-inline-end:4px}.ant-image-mask:hover{opacity:1}.ant-image-placeholder{bottom:0;left:0;position:absolute;right:0;top:0}.ant-image-preview{height:100%;pointer-events:none;text-align:center}.ant-image-preview.ant-zoom-appear,.ant-image-preview.ant-zoom-enter{animation-duration:.3s;opacity:0;transform:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-image-preview-mask{background-color:#00000073;bottom:0;height:100%;left:0;position:fixed;right:0;top:0;z-index:1000}.ant-image-preview-mask-hidden{display:none}.ant-image-preview-wrap{bottom:0;left:0;outline:0;overflow:auto;position:fixed;right:0;top:0}.ant-image-preview-body{bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0}.ant-image-preview-img{cursor:grab;max-height:100%;max-width:100%;pointer-events:auto;transform:scaleX(1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.ant-image-preview-img,.ant-image-preview-img-wrapper{transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s}.ant-image-preview-img-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}.ant-image-preview-img-wrapper:before{content:"";display:inline-block;height:50%;margin-right:-1px;width:1px}.ant-image-preview-moving .ant-image-preview-img{cursor:grabbing}.ant-image-preview-moving .ant-image-preview-img-wrapper{transition-duration:0s}.ant-image-preview-wrap{z-index:1080}.ant-image-preview-operations{font-feature-settings:"tnum","tnum";align-items:center;background:#0000001a;box-sizing:border-box;color:#000000d9;color:#ffffffd9;display:flex;flex-direction:row-reverse;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;pointer-events:auto;position:absolute;right:0;top:0;width:100%;z-index:1}.ant-image-preview-operations-operation{cursor:pointer;margin-left:12px;padding:12px}.ant-image-preview-operations-operation-disabled{color:#ffffff40;pointer-events:none}.ant-image-preview-operations-operation:last-of-type{margin-left:0}.ant-image-preview-operations-progress{left:50%;position:absolute;transform:translateX(-50%)}.ant-image-preview-operations-icon{font-size:18px}.ant-image-preview-switch-left,.ant-image-preview-switch-right{align-items:center;background:#0000001a;border-radius:50%;color:#ffffffd9;cursor:pointer;display:flex;height:44px;justify-content:center;margin-top:-22px;pointer-events:auto;position:absolute;right:10px;top:50%;width:44px;z-index:1}.ant-image-preview-switch-left-disabled,.ant-image-preview-switch-right-disabled{color:#ffffff40;cursor:not-allowed}.ant-image-preview-switch-left-disabled>.anticon,.ant-image-preview-switch-right-disabled>.anticon{cursor:not-allowed}.ant-image-preview-switch-left>.anticon,.ant-image-preview-switch-right>.anticon{font-size:18px}.ant-image-preview-switch-left{left:10px}.ant-image-preview-switch-right{right:10px}.ant-input-number-affix-wrapper{background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;color:#000000d9;display:inline-block;display:inline-flex;font-size:14px;line-height:1.5715;min-width:0;padding:0;padding-inline-start:11px;position:relative;transition:all .3s;width:100%;width:90px}.ant-input-number-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-input-number-affix-wrapper-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper-borderless,.ant-input-number-affix-wrapper-borderless-disabled,.ant-input-number-affix-wrapper-borderless-focused,.ant-input-number-affix-wrapper-borderless:focus,.ant-input-number-affix-wrapper-borderless:hover,.ant-input-number-affix-wrapper-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-input-number-affix-wrapper{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-input-number-affix-wrapper-lg{font-size:16px;padding:6.5px 11px}.ant-input-number-affix-wrapper-sm{padding:0 7px}.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{z-index:1}.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled]{background:#0000}.ant-input-number-affix-wrapper>div.ant-input-number{border:none;outline:none;width:100%}.ant-input-number-affix-wrapper>div.ant-input-number.ant-input-number-focused{box-shadow:none!important}.ant-input-number-affix-wrapper input.ant-input-number-input{padding:0}.ant-input-number-affix-wrapper:before{content:"\a0";visibility:hidden;width:0}.ant-input-number-affix-wrapper .ant-input-number-handler-wrap{z-index:2}.ant-input-number-prefix,.ant-input-number-suffix{align-items:center;display:flex;flex:none;pointer-events:none}.ant-input-number-prefix{margin-inline-end:4px}.ant-input-number-suffix{height:100%;margin-left:4px;margin-right:11px;position:absolute;right:0;top:0;z-index:1}.ant-input-number-group-wrapper .ant-input-number-affix-wrapper{width:100%}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-input-number-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#faad14}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-input-number-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon{border-color:#ff4d4f;color:#ff4d4f}.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon{border-color:#faad14;color:#faad14}.ant-input-number{font-feature-settings:"tnum","tnum";background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;min-width:0;padding:0;position:relative;transition:all .3s;width:100%;width:90px}.ant-input-number::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number:placeholder-shown{text-overflow:ellipsis}.ant-input-number-focused,.ant-input-number:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-input-number[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-number[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-borderless,.ant-input-number-borderless-disabled,.ant-input-number-borderless-focused,.ant-input-number-borderless:focus,.ant-input-number-borderless:hover,.ant-input-number-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-input-number{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-input-number-lg{padding:6.5px 11px}.ant-input-number-sm{padding:0 7px}.ant-input-number-group{font-feature-settings:"tnum","tnum";border-collapse:initial;border-spacing:0;box-sizing:border-box;color:#000000d9;display:table;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative;width:100%}.ant-input-number-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ant-input-number-group>[class*=col-]{padding-right:8px}.ant-input-number-group>[class*=col-]:last-child{padding-right:0}.ant-input-number-group-addon,.ant-input-number-group-wrap,.ant-input-number-group>.ant-input-number{display:table-cell}.ant-input-number-group-addon:not(:first-child):not(:last-child),.ant-input-number-group-wrap:not(:first-child):not(:last-child),.ant-input-number-group>.ant-input-number:not(:first-child):not(:last-child){border-radius:0}.ant-input-number-group-addon,.ant-input-number-group-wrap{vertical-align:middle;white-space:nowrap;width:1px}.ant-input-number-group-wrap>*{display:block!important}.ant-input-number-group .ant-input-number{float:left;margin-bottom:0;text-align:inherit;width:100%}.ant-input-number-group .ant-input-number:focus,.ant-input-number-group .ant-input-number:hover{border-right-width:1px;z-index:1}.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover{z-index:0}.ant-input-number-group-addon{background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;color:#000000d9;font-size:14px;font-weight:400;padding:0 11px;position:relative;text-align:center;transition:all .3s}.ant-input-number-group-addon .ant-select{margin:-5px -11px}.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid #0000;box-shadow:none}.ant-input-number-group-addon .ant-select-focused .ant-select-selector,.ant-input-number-group-addon .ant-select-open .ant-select-selector{color:#1890ff}.ant-input-number-group-addon .ant-cascader-picker{background-color:initial;margin:-9px -12px}.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input{border:0;box-shadow:none;text-align:left}.ant-input-number-group-addon:first-child,.ant-input-number-group-addon:first-child .ant-select .ant-select-selector,.ant-input-number-group>.ant-input-number:first-child,.ant-input-number-group>.ant-input-number:first-child .ant-select .ant-select-selector{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:first-child) .ant-input-number{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:last-child) .ant-input-number{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-number-group-addon:first-child{border-right:0}.ant-input-number-group-addon:last-child{border-left:0}.ant-input-number-group-addon:last-child,.ant-input-number-group-addon:last-child .ant-select .ant-select-selector,.ant-input-number-group>.ant-input-number:last-child,.ant-input-number-group>.ant-input-number:last-child .ant-select .ant-select-selector{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-number-group-lg .ant-input-number,.ant-input-number-group-lg>.ant-input-number-group-addon{font-size:16px;padding:6.5px 11px}.ant-input-number-group-sm .ant-input-number,.ant-input-number-group-sm>.ant-input-number-group-addon{padding:0 7px}.ant-input-number-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-number-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-number-group.ant-input-number-group-compact{display:block}.ant-input-number-group.ant-input-number-group-compact:before{content:"";display:table}.ant-input-number-group.ant-input-number-group-compact:after{clear:both;content:"";display:table}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*{border-radius:0;display:inline-block;float:none;vertical-align:top}.ant-input-number-group.ant-input-number-group-compact>.ant-input-number-affix-wrapper,.ant-input-number-group.ant-input-number-group-compact>.ant-picker-range{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>:not(:last-child){border-right-width:1px;margin-right:-1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-number{float:none}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector{border-radius:0;border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select-focused,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-arrow,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>:last-child{border-bottom-right-radius:2px;border-right-width:1px;border-top-right-radius:2px}.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper,.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-number-group>.ant-input-number-rtl:first-child{border-radius:0 2px 2px 0}.ant-input-number-group>.ant-input-number-rtl:last-child{border-radius:2px 0 0 2px}.ant-input-number-group-rtl .ant-input-number-group-addon:first-child{border-left:0;border-radius:0 2px 2px 0;border-right:1px solid #d9d9d9}.ant-input-number-group-rtl .ant-input-number-group-addon:last-child{border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px;border-right:0}.ant-input-number-group-wrapper{display:inline-block;text-align:start;vertical-align:top}.ant-input-number-handler{border-left:1px solid #d9d9d9;color:#00000073;display:block;font-weight:700;height:50%;line-height:0;overflow:hidden;position:relative;text-align:center;transition:all .1s linear;width:100%}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-down-inner,.ant-input-number-handler:hover .ant-input-number-handler-up-inner{color:#40a9ff}.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:inherit;color:#00000073;display:inline-block;font-style:normal;height:12px;line-height:0;line-height:12px;position:absolute;right:4px;text-align:center;text-transform:none;transition:all .1s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:-.125em;width:12px}.ant-input-number-handler-down-inner>*,.ant-input-number-handler-up-inner>*{line-height:1}.ant-input-number-handler-down-inner svg,.ant-input-number-handler-up-inner svg{display:inline-block}.ant-input-number-handler-down-inner:before,.ant-input-number-handler-up-inner:before{display:none}.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon{display:block}.ant-input-number:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number:hover+.ant-form-item-children-icon{opacity:0;transition:opacity .24s linear .24s}.ant-input-number-focused{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-input-number-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-number-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap,.ant-input-number-readonly .ant-input-number-handler-wrap{display:none}.ant-input-number-input{-webkit-appearance:textfield!important;-moz-appearance:textfield!important;appearance:textfield!important;background-color:initial;border:0;border-radius:2px;height:30px;outline:0;padding:0 11px;text-align:left;transition:all .3s linear;width:100%}.ant-input-number-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-input:placeholder-shown{text-overflow:ellipsis}.ant-input-number-input[type=number]::-webkit-inner-spin-button,.ant-input-number-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.ant-input-number-lg{font-size:16px;padding:0}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{background:#fff;border-radius:0 2px 2px 0;height:100%;opacity:0;position:absolute;right:0;top:0;transition:opacity .24s linear .1s;width:22px}.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner,.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner{align-items:center;display:flex;font-size:7px;justify-content:center;margin-right:0;min-width:auto}.ant-input-number-borderless .ant-input-number-handler-wrap{border-left-width:0}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number-focused .ant-input-number-handler-wrap,.ant-input-number:hover .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{border-top-right-radius:2px;cursor:pointer}.ant-input-number-handler-up-inner{margin-top:-5px;text-align:center;top:50%}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{border-bottom-right-radius:2px;border-top:1px solid #d9d9d9;cursor:pointer;top:0}.ant-input-number-handler-down-inner{text-align:center;top:50%;transform:translateY(-50%)}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-borderless .ant-input-number-handler-down{border-top-width:0}.ant-input-number-handler-down-disabled,.ant-input-number-handler-up-disabled{cursor:not-allowed}.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner{color:#00000040}.ant-input-number-borderless{box-shadow:none}.ant-input-number-out-of-range input{color:#ff4d4f}.ant-input-number-rtl{direction:rtl}.ant-input-number-rtl .ant-input-number-handler{border-left:0;border-right:1px solid #d9d9d9}.ant-input-number-rtl .ant-input-number-handler-wrap{left:0;right:auto}.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap{border-right-width:0}.ant-input-number-rtl .ant-input-number-handler-up{border-top-right-radius:0}.ant-input-number-rtl .ant-input-number-handler-down{border-bottom-right-radius:0}.ant-input-number-rtl .ant-input-number-input{direction:ltr;text-align:right}.ant-input-affix-wrapper{background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;color:#000000d9;display:inline-block;display:inline-flex;font-size:14px;line-height:1.5715;min-width:0;padding:4px 11px;position:relative;transition:all .3s;width:100%}.ant-input-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input-affix-wrapper:hover{border-left-width:1px!important;border-right-width:0}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-input-rtl .ant-input-affix-wrapper-focused,.ant-input-rtl .ant-input-affix-wrapper:focus{border-left-width:1px!important;border-right-width:0}.ant-input-affix-wrapper-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper-borderless,.ant-input-affix-wrapper-borderless-disabled,.ant-input-affix-wrapper-borderless-focused,.ant-input-affix-wrapper-borderless:focus,.ant-input-affix-wrapper-borderless:hover,.ant-input-affix-wrapper-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-input-affix-wrapper{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-input-affix-wrapper-lg{font-size:16px;padding:6.5px 11px}.ant-input-affix-wrapper-sm{padding:0 7px}.ant-input-affix-wrapper-rtl{direction:rtl}.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-left-width:1px!important;border-right-width:0}.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{z-index:0}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{z-index:1}.ant-input-affix-wrapper-disabled .ant-input[disabled]{background:#0000}.ant-input-affix-wrapper>input.ant-input{border:none;outline:none;padding:0}.ant-input-affix-wrapper>input.ant-input:focus{box-shadow:none!important}.ant-input-affix-wrapper:before{content:"\a0";visibility:hidden;width:0}.ant-input-prefix,.ant-input-suffix{align-items:center;display:flex;flex:none}.ant-input-prefix>:not(:last-child),.ant-input-suffix>:not(:last-child){margin-right:8px}.ant-input-show-count-suffix{color:#00000073}.ant-input-show-count-has-suffix{margin-right:2px}.ant-input-prefix{margin-right:4px}.ant-input-suffix{margin-left:4px}.ant-input-clear-icon,.anticon.ant-input-clear-icon{color:#00000040;cursor:pointer;font-size:12px;margin:0;transition:color .3s;vertical-align:-1px}.ant-input-clear-icon:hover,.anticon.ant-input-clear-icon:hover{color:#00000073}.ant-input-clear-icon:active,.anticon.ant-input-clear-icon:active{color:#000000d9}.ant-input-clear-icon-hidden,.anticon.ant-input-clear-icon-hidden{visibility:hidden}.ant-input-clear-icon-has-suffix,.anticon.ant-input-clear-icon-has-suffix{margin:0 4px}.ant-input-affix-wrapper-textarea-with-clear-btn{border:0!important;padding:0!important}.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon{position:absolute;right:8px;top:8px;z-index:1}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#ff4d4f}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-input-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#faad14}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-input-status-warning .ant-input-prefix{color:#faad14}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-input-affix-wrapper-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-input-affix-wrapper-status-warning .ant-input-prefix{color:#faad14}.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input{padding-right:24px}.ant-input-group-wrapper-status-error .ant-input-group-addon{border-color:#ff4d4f;color:#ff4d4f}.ant-input-group-wrapper-status-warning .ant-input-group-addon{border-color:#faad14;color:#faad14}.ant-input{font-feature-settings:"tnum","tnum";background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;min-width:0;padding:4px 11px;position:relative;transition:all .3s;width:100%}.ant-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input:placeholder-shown{text-overflow:ellipsis}.ant-input:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input:hover{border-left-width:1px!important;border-right-width:0}.ant-input-focused,.ant-input:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-input-rtl .ant-input-focused,.ant-input-rtl .ant-input:focus{border-left-width:1px!important;border-right-width:0}.ant-input-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-borderless,.ant-input-borderless-disabled,.ant-input-borderless-focused,.ant-input-borderless:focus,.ant-input-borderless:hover,.ant-input-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-input{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-input-lg{font-size:16px;padding:6.5px 11px}.ant-input-sm{padding:0 7px}.ant-input-rtl{direction:rtl}.ant-input-group{font-feature-settings:"tnum","tnum";border-collapse:initial;border-spacing:0;box-sizing:border-box;color:#000000d9;display:table;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative;width:100%}.ant-input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{vertical-align:middle;white-space:nowrap;width:1px}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;margin-bottom:0;text-align:inherit;width:100%}.ant-input-group .ant-input:focus,.ant-input-group .ant-input:hover{border-right-width:1px;z-index:1}.ant-input-search-with-button .ant-input-group .ant-input:hover{z-index:0}.ant-input-group-addon{background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;color:#000000d9;font-size:14px;font-weight:400;padding:0 11px;position:relative;text-align:center;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid #0000;box-shadow:none}.ant-input-group-addon .ant-select-focused .ant-select-selector,.ant-input-group-addon .ant-select-open .ant-select-selector{color:#1890ff}.ant-input-group-addon .ant-cascader-picker{background-color:initial;margin:-9px -12px}.ant-input-group-addon .ant-cascader-picker .ant-cascader-input{border:0;box-shadow:none;text-align:left}.ant-input-group-addon:first-child,.ant-input-group-addon:first-child .ant-select .ant-select-selector,.ant-input-group>.ant-input:first-child,.ant-input-group>.ant-input:first-child .ant-select .ant-select-selector{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group-addon:last-child,.ant-input-group-addon:last-child .ant-select .ant-select-selector,.ant-input-group>.ant-input:last-child,.ant-input-group>.ant-input:last-child .ant-select .ant-select-selector{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{font-size:16px;padding:6.5px 11px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:0 7px}.ant-input-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child){border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-input-group .ant-input-affix-wrapper:not(:first-child),.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group.ant-input-group-compact{display:block}.ant-input-group.ant-input-group-compact:before{content:"";display:table}.ant-input-group.ant-input-group-compact:after{clear:both;content:"";display:table}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-group.ant-input-group-compact>*{border-radius:0;display:inline-block;float:none;vertical-align:top}.ant-input-group.ant-input-group-compact>.ant-input-affix-wrapper,.ant-input-group.ant-input-group-compact>.ant-picker-range{display:inline-flex}.ant-input-group.ant-input-group-compact>:not(:last-child){border-right-width:1px;margin-right:-1px}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector{border-radius:0;border-right-width:1px}.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-select-focused,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-arrow,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:hover{z-index:1}.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>:last-child{border-bottom-right-radius:2px;border-right-width:1px;border-top-right-radius:2px}.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper,.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-group-rtl .ant-input-group-addon:first-child,.ant-input-group>.ant-input-rtl:first-child{border-radius:0 2px 2px 0}.ant-input-group-rtl .ant-input-group-addon:first-child{border-left:0;border-right:1px solid #d9d9d9}.ant-input-group-rtl .ant-input-group-addon:last-child{border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px;border-right:0}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child),.ant-input-group-rtl.ant-input-group-addon:last-child,.ant-input-group-rtl.ant-input-group>.ant-input:last-child{border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:not(:last-child){border-left-width:1px;margin-left:-1px;margin-right:0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:first-child{border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:last-child{border-left-width:1px;border-radius:2px 0 0 2px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl+.ant-input-group-wrapper-rtl{margin-left:0;margin-right:-1px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:0 2px 2px 0}.ant-input-group-wrapper{display:inline-block;text-align:start;vertical-align:top;width:100%}.ant-input-password-icon.anticon{color:#00000073;cursor:pointer;transition:all .3s}.ant-input-password-icon.anticon:hover{color:#000000d9}.ant-input[type=color]{height:32px}.ant-input[type=color].ant-input-lg{height:40px}.ant-input[type=color].ant-input-sm{height:24px;padding-bottom:3px;padding-top:3px}.ant-input-textarea-show-count>.ant-input{height:100%}.ant-input-textarea-show-count:after{color:#00000073;content:attr(data-count);float:right;pointer-events:none;white-space:nowrap}.ant-input-textarea-show-count.ant-input-textarea-in-form-item:after{margin-bottom:-22px}.ant-input-textarea-suffix{align-items:center;bottom:0;display:inline-flex;margin:auto;position:absolute;right:11px;top:0;z-index:1}.ant-input-search .ant-input:focus,.ant-input-search .ant-input:hover{border-color:#40a9ff}.ant-input-search .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#40a9ff}.ant-input-search .ant-input-affix-wrapper{border-radius:0}.ant-input-search .ant-input-lg{line-height:1.5713}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child{border:0;left:-1px;padding:0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{border-radius:0 2px 2px 0;padding-bottom:0;padding-top:0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary){color:#00000073}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading:before{bottom:0;left:0;right:0;top:0}.ant-input-search-button{height:32px}.ant-input-search-button:focus,.ant-input-search-button:hover{z-index:1}.ant-input-search-large .ant-input-search-button{height:40px}.ant-input-search-small .ant-input-search-button{height:24px}.ant-input-group-rtl,.ant-input-group-wrapper-rtl{direction:rtl}.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl>input.ant-input{border:none;outline:none}.ant-input-affix-wrapper-rtl .ant-input-prefix{margin:0 0 0 4px}.ant-input-affix-wrapper-rtl .ant-input-suffix{margin:0 4px 0 0}.ant-input-textarea-rtl{direction:rtl}.ant-input-textarea-rtl.ant-input-textarea-show-count:after{text-align:left}.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix{margin-left:4px;margin-right:0}.ant-input-affix-wrapper-rtl .ant-input-clear-icon{left:8px;right:auto}.ant-input-search-rtl{direction:rtl}.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#d9d9d9;border-right-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper-focused,.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper:hover{border-right-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon{left:auto;right:-1px}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon .ant-input-search-button{border-radius:2px 0 0 2px}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ant-input{height:32px}.ant-input-lg{height:40px}.ant-input-sm{height:24px}.ant-input-affix-wrapper>input.ant-input{height:auto}}.ant-layout{background:#f0f2f5;display:flex;flex:auto;flex-direction:column;min-height:0}.ant-layout,.ant-layout *{box-sizing:border-box}.ant-layout.ant-layout-has-sider{flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{width:0}.ant-layout-footer,.ant-layout-header{flex:0 0 auto}.ant-layout-header{background:#001529;color:#000000d9;height:64px;line-height:64px;padding:0 50px}.ant-layout-footer{background:#f0f2f5;color:#000000d9;font-size:14px;padding:24px 50px}.ant-layout-content{flex:auto;min-height:0}.ant-layout-sider{background:#001529;min-width:0;position:relative;transition:all .2s}.ant-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed{width:auto}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{order:1}.ant-layout-sider-trigger{background:#002140;bottom:0;color:#fff;cursor:pointer;height:48px;line-height:48px;position:fixed;text-align:center;transition:all .2s;z-index:1}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{background:#001529;border-radius:0 2px 2px 0;color:#fff;cursor:pointer;font-size:18px;height:42px;line-height:42px;position:absolute;right:-36px;text-align:center;top:64px;transition:background .3s ease;width:36px;z-index:1}.ant-layout-sider-zero-width-trigger:after{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0;transition:all .3s}.ant-layout-sider-zero-width-trigger:hover:after{background:#ffffff1a}.ant-layout-sider-zero-width-trigger-right{border-radius:2px 0 0 2px;left:-36px}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{background:#fff;color:#000000d9}.ant-layout-rtl{direction:rtl}.ant-list{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative}.ant-list *{outline:none}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-pagination .ant-pagination-options{text-align:left}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-left:32px;padding-right:32px}.ant-list-spin{min-height:40px;text-align:center}.ant-list-empty-text{color:#00000040;font-size:14px;padding:16px;text-align:center}.ant-list-items{list-style:none;margin:0;padding:0}.ant-list-item{align-items:center;color:#000000d9;display:flex;justify-content:space-between;padding:12px 0}.ant-list-item-meta{align-items:flex-start;display:flex;flex:1 1;max-width:100%}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{color:#000000d9;flex:1 0;width:0}.ant-list-item-meta-title{color:#000000d9;font-size:14px;line-height:1.5715;margin-bottom:4px}.ant-list-item-meta-title>a{color:#000000d9;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#1890ff}.ant-list-item-meta-description{color:#00000073;font-size:14px;line-height:1.5715}.ant-list-item-action{flex:0 0 auto;font-size:0;list-style:none;margin-left:48px;padding:0}.ant-list-item-action>li{color:#00000073;display:inline-block;font-size:14px;line-height:1.5715;padding:0 8px;position:relative;text-align:center}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{background-color:#f0f0f0;height:14px;margin-top:-7px;position:absolute;right:0;top:50%;width:1px}.ant-list-footer,.ant-list-header{background:#0000}.ant-list-footer,.ant-list-header{padding-bottom:12px;padding-top:12px}.ant-list-empty{color:#00000073;font-size:12px;padding:16px 0;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #f0f0f0}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #f0f0f0}.ant-list-split.ant-list-empty .ant-list-footer{border-top:1px solid #f0f0f0}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-split.ant-list-something-after-last-item .ant-spin-container>.ant-list-items>.ant-list-item:last-child{border-bottom:1px solid #f0f0f0}.ant-list-lg .ant-list-item{padding:16px 24px}.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-vertical .ant-list-item{align-items:normal}.ant-list-vertical .ant-list-item-main{display:block;flex:1 1}.ant-list-vertical .ant-list-item-extra{margin-left:40px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-title{color:#000000d9;font-size:16px;line-height:24px;margin-bottom:12px}.ant-list-vertical .ant-list-item-action{margin-left:auto;margin-top:16px}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-col>.ant-list-item{border-bottom:none;display:block;margin-bottom:16px;max-width:100%;padding-bottom:0;padding-top:0}.ant-list-item-no-flex{display:block}.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:right}.ant-list-bordered{border:1px solid #d9d9d9;border-radius:2px}.ant-list-bordered .ant-list-footer,.ant-list-bordered .ant-list-header,.ant-list-bordered .ant-list-item{padding-left:24px;padding-right:24px}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-footer,.ant-list-bordered.ant-list-sm .ant-list-header,.ant-list-bordered.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-footer,.ant-list-bordered.ant-list-lg .ant-list-header,.ant-list-bordered.ant-list-lg .ant-list-item{padding:16px 24px}@media screen and (max-width:768px){.ant-list-item-action,.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width:576px){.ant-list-item{flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item{flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-list-rtl{direction:rtl;text-align:right}.ant-list-rtl .ReactVirtualized__List .ant-list-item{direction:rtl}.ant-list-rtl .ant-list-pagination{text-align:left}.ant-list-rtl .ant-list-item-meta-avatar{margin-left:16px;margin-right:0}.ant-list-rtl .ant-list-item-action{margin-left:0;margin-right:48px}.ant-list.ant-list-rtl .ant-list-item-action>li:first-child{padding-left:16px;padding-right:0}.ant-list-rtl .ant-list-item-action-split{left:0;right:auto}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin-left:0;margin-right:40px}.ant-list-rtl.ant-list-vertical .ant-list-item-action{margin-right:auto}.ant-list-rtl .ant-list-vertical .ant-list-item-action>li:first-child{padding-left:16px;padding-right:0}.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:left}@media screen and (max-width:768px){.ant-list-rtl .ant-list-item-action,.ant-list-rtl .ant-list-vertical .ant-list-item-extra{margin-left:0;margin-right:24px}}@media screen and (max-width:576px){.ant-list-rtl .ant-list-item-action{margin-left:0;margin-right:22px}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-pagination{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715}.ant-pagination,.ant-pagination ol,.ant-pagination ul{list-style:none;margin:0;padding:0}.ant-pagination:after{clear:both;content:" ";display:block;height:0;overflow:hidden;visibility:hidden}.ant-pagination-item,.ant-pagination-total-text{display:inline-block;height:32px;line-height:30px;margin-right:8px;vertical-align:middle}.ant-pagination-item{background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;list-style:none;min-width:32px;outline:0;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-item a{color:#000000d9;display:block;padding:0 6px;transition:none}.ant-pagination-item a:hover{text-decoration:none}.ant-pagination-item:hover{border-color:#1890ff;transition:all .3s}.ant-pagination-item:hover a{color:#1890ff}.ant-pagination-item:focus-visible{border-color:#1890ff;transition:all .3s}.ant-pagination-item:focus-visible a{color:#1890ff}.ant-pagination-item-active{background:#fff;border-color:#1890ff;font-weight:500}.ant-pagination-item-active a{color:#1890ff}.ant-pagination-item-active:hover{border-color:#40a9ff}.ant-pagination-item-active:focus-visible{border-color:#40a9ff}.ant-pagination-item-active:hover a{color:#40a9ff}.ant-pagination-item-active:focus-visible a{color:#40a9ff}.ant-pagination-jump-next,.ant-pagination-jump-prev{outline:0}.ant-pagination-jump-next .ant-pagination-item-container,.ant-pagination-jump-prev .ant-pagination-item-container{position:relative}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{color:#1890ff;font-size:12px;letter-spacing:-1px;opacity:0;transition:all .2s}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg{bottom:0;left:0;margin:auto;right:0;top:0}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis{bottom:0;color:#00000040;display:block;font-family:Arial,Helvetica,sans-serif;left:0;letter-spacing:2px;margin:auto;opacity:1;position:absolute;right:0;text-align:center;text-indent:.13em;top:0;transition:all .2s}.ant-pagination-jump-next:hover .ant-pagination-item-link-icon,.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon,.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-prev{margin-right:8px}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-next,.ant-pagination-prev{border-radius:2px;color:#000000d9;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;height:32px;line-height:32px;list-style:none;min-width:32px;text-align:center;transition:all .3s;vertical-align:middle}.ant-pagination-next,.ant-pagination-prev{font-family:Arial,Helvetica,sans-serif;outline:0}.ant-pagination-next button,.ant-pagination-prev button{color:#000000d9;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-next:hover button,.ant-pagination-prev:hover button{border-color:#40a9ff}.ant-pagination-next .ant-pagination-item-link,.ant-pagination-prev .ant-pagination-item-link{background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;display:block;font-size:12px;height:100%;outline:none;padding:0;text-align:center;transition:all .3s;width:100%}.ant-pagination-next:focus-visible .ant-pagination-item-link,.ant-pagination-prev:focus-visible .ant-pagination-item-link{border-color:#1890ff;color:#1890ff}.ant-pagination-next:hover .ant-pagination-item-link,.ant-pagination-prev:hover .ant-pagination-item-link{border-color:#1890ff;color:#1890ff}.ant-pagination-disabled,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:hover .ant-pagination-item-link{border-color:#d9d9d9;color:#00000040;cursor:not-allowed}.ant-pagination-disabled:focus-visible{cursor:not-allowed}.ant-pagination-disabled:focus-visible .ant-pagination-item-link{border-color:#d9d9d9;color:#00000040;cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}@media (-ms-high-contrast:none){.ant-pagination-options,.ant-pagination-options ::-ms-backdrop{vertical-align:top}}.ant-pagination-options-size-changer.ant-select{display:inline-block;width:auto}.ant-pagination-options-quick-jumper{display:inline-block;height:32px;line-height:32px;margin-left:8px;vertical-align:top}.ant-pagination-options-quick-jumper input{background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;color:#000000d9;display:inline-block;font-size:14px;height:32px;line-height:1.5715;margin:0 8px;min-width:0;padding:4px 11px;position:relative;transition:all .3s;width:100%;width:50px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:hover{border-color:#40a9ff;border-right-width:1px}.ant-pagination-options-quick-jumper input-focused,.ant-pagination-options-quick-jumper input:focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-pagination-options-quick-jumper input-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input-borderless,.ant-pagination-options-quick-jumper input-borderless-disabled,.ant-pagination-options-quick-jumper input-borderless-focused,.ant-pagination-options-quick-jumper input-borderless:focus,.ant-pagination-options-quick-jumper input-borderless:hover,.ant-pagination-options-quick-jumper input-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-pagination-options-quick-jumper input{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-pagination-options-quick-jumper input-lg{font-size:16px;padding:6.5px 11px}.ant-pagination-options-quick-jumper input-sm{padding:0 7px}.ant-pagination-simple .ant-pagination-next,.ant-pagination-simple .ant-pagination-prev{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link{background-color:initial;border:0;height:24px}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;height:24px;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;height:100%;margin-right:8px;outline:none;padding:0 6px;text-align:center;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#1890ff}.ant-pagination-simple .ant-pagination-simple-pager input:focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33}.ant-pagination-simple .ant-pagination-simple-pager input[disabled]{background:#f5f5f5;border-color:#d9d9d9;color:#00000040;cursor:not-allowed}.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager,.ant-pagination.ant-pagination-mini .ant-pagination-total-text{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-item{height:24px;line-height:22px;margin:0;min-width:24px}.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active){background:#0000;border-color:#0000}.ant-pagination.ant-pagination-mini .ant-pagination-next,.ant-pagination.ant-pagination-mini .ant-pagination-prev{height:24px;line-height:24px;margin:0;min-width:24px}.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link,.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link{background:#0000;border-color:#0000}.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-jump-next,.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev{height:24px;line-height:24px;margin-right:0}.ant-pagination.ant-pagination-mini .ant-pagination-options{margin-left:2px}.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer{top:0}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input{height:24px;padding:0 7px;width:44px}.ant-pagination.ant-pagination-disabled{cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item a{background:#0000;border:none;color:#00000040;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active{background:#e6e6e6}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a{color:#00000040}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{background:#f5f5f5;border-color:#d9d9d9;color:#00000040;cursor:not-allowed}.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{background:#0000}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon{opacity:0}.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis{opacity:1}.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager{color:#00000040}@media only screen and (max-width:992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width:576px){.ant-pagination-options{display:none}}.ant-pagination-rtl .ant-pagination-item,.ant-pagination-rtl .ant-pagination-jump-next,.ant-pagination-rtl .ant-pagination-jump-prev,.ant-pagination-rtl .ant-pagination-prev,.ant-pagination-rtl .ant-pagination-total-text{margin-left:8px;margin-right:0}.ant-pagination-rtl .ant-pagination-slash{margin:0 5px 0 10px}.ant-pagination-rtl .ant-pagination-options{margin-left:0;margin-right:16px}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select{margin-left:8px;margin-right:0}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper{margin-left:0}.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager,.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input{margin-left:8px;margin-right:0}.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options{margin-left:0;margin-right:2px}.ant-spin{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;color:#1890ff;display:none;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;opacity:0;padding:0;position:absolute;text-align:center;transition:transform .3s cubic-bezier(.78,.14,.15,.86);vertical-align:middle}.ant-spin-spinning{display:inline-block;opacity:1;position:static}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{display:block;height:100%;left:0;max-height:400px;position:absolute;top:0;width:100%;z-index:4}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{left:50%;margin:-10px;position:absolute;top:50%}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{padding-top:5px;position:absolute;text-shadow:0 1px 2px #fff;top:50%;width:100%}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;transition:opacity .3s}.ant-spin-container:after{background:#fff;bottom:0;content:"";display:none\9;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:all .3s;width:100%;z-index:10}.ant-spin-blur{clear:both;opacity:.5;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-spin-blur:after{opacity:.4;pointer-events:auto}.ant-spin-tip{color:#00000073}.ant-spin-dot{display:inline-block;font-size:20px;height:1em;position:relative;width:1em}.ant-spin-dot-item{animation:antSpinMove 1s linear infinite alternate;background-color:#1890ff;border-radius:100%;display:block;height:9px;opacity:.3;position:absolute;transform:scale(.75);transform-origin:50% 50%;width:9px}.ant-spin-dot-item:first-child{left:0;top:0}.ant-spin-dot-item:nth-child(2){animation-delay:.4s;right:0;top:0}.ant-spin-dot-item:nth-child(3){animation-delay:.8s;bottom:0;right:0}.ant-spin-dot-item:nth-child(4){animation-delay:1.2s;bottom:0;left:0}.ant-spin-dot-spin{animation:antRotate 1.2s linear infinite;transform:rotate(0deg)}.ant-spin-sm .ant-spin-dot{font-size:14px}.ant-spin-sm .ant-spin-dot i{height:6px;width:6px}.ant-spin-lg .ant-spin-dot{font-size:32px}.ant-spin-lg .ant-spin-dot i{height:14px;width:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ant-spin-blur{background:#fff;opacity:.5}}@keyframes antSpinMove{to{opacity:1}}@keyframes antRotate{to{transform:rotate(1turn)}}.ant-spin-rtl{direction:rtl}.ant-spin-rtl .ant-spin-dot-spin{animation-name:antRotateRtl;transform:rotate(-45deg)}@keyframes antRotateRtl{to{transform:rotate(-405deg)}}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#ff4d4f}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus{border-color:#ff7875;border-right-width:1px;box-shadow:0 0 0 2px #ff4d4f33;outline:0}.ant-mentions-status-error .ant-input-prefix{color:#ff4d4f}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#faad14}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus{border-color:#ffc53d;border-right-width:1px;box-shadow:0 0 0 2px #faad1433;outline:0}.ant-mentions-status-warning .ant-input-prefix{color:#faad14}.ant-mentions{font-feature-settings:"tnum","tnum";background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;height:auto;line-height:1.5715;list-style:none;margin:0;min-width:0;overflow:hidden;padding:0;position:relative;transition:all .3s;vertical-align:bottom;white-space:pre-wrap;width:100%}.ant-mentions::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions:placeholder-shown{text-overflow:ellipsis}.ant-mentions-focused,.ant-mentions:focus,.ant-mentions:hover{border-color:#40a9ff;border-right-width:1px}.ant-mentions-focused,.ant-mentions:focus{box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-mentions-disabled{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-mentions-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions[disabled]{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-mentions[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-borderless,.ant-mentions-borderless-disabled,.ant-mentions-borderless-focused,.ant-mentions-borderless:focus,.ant-mentions-borderless:hover,.ant-mentions-borderless[disabled]{background-color:initial;border:none;box-shadow:none}textarea.ant-mentions{height:auto;line-height:1.5715;max-width:100%;min-height:32px;transition:all .3s,height 0s;vertical-align:bottom}.ant-mentions-lg{font-size:16px;padding:6.5px 11px}.ant-mentions-sm{padding:0 7px}.ant-mentions-disabled>textarea{background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;color:#00000040;cursor:not-allowed;opacity:1}.ant-mentions-disabled>textarea:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-focused{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-mentions-measure,.ant-mentions>textarea{font-feature-settings:inherit;word-wrap:break-word;direction:inherit;font-family:inherit;font-size:inherit;font-size-adjust:inherit;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;min-height:30px;overflow:inherit;overflow-x:hidden;overflow-y:auto;padding:4px 11px;-moz-tab-size:inherit;-o-tab-size:inherit;tab-size:inherit;text-align:inherit;vertical-align:top;white-space:inherit;word-break:inherit}.ant-mentions>textarea{border:none;outline:none;resize:none;width:100%}.ant-mentions>textarea::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions>textarea:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions>textarea::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions>textarea:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions>textarea:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions>textarea:placeholder-shown{text-overflow:ellipsis}.ant-mentions-measure{bottom:0;color:#0000;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:-1}.ant-mentions-measure>span{display:inline-block;min-height:1em}.ant-mentions-dropdown{font-feature-settings:"tnum","tnum",;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;font-variant:normal;left:-9999px;line-height:1.5715;list-style:none;margin:0;outline:none;padding:0;position:absolute;top:-9999px;z-index:1050}.ant-mentions-dropdown-hidden{display:none}.ant-mentions-dropdown-menu{list-style:none;margin-bottom:0;max-height:250px;outline:none;overflow:auto;padding-left:0}.ant-mentions-dropdown-menu-item{color:#000000d9;cursor:pointer;display:block;font-weight:400;line-height:1.5715;min-width:100px;overflow:hidden;padding:5px 12px;position:relative;text-overflow:ellipsis;transition:background .3s ease;white-space:nowrap}.ant-mentions-dropdown-menu-item:hover{background-color:#f5f5f5}.ant-mentions-dropdown-menu-item:first-child{border-radius:2px 2px 0 0}.ant-mentions-dropdown-menu-item:last-child{border-radius:0 0 2px 2px}.ant-mentions-dropdown-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-mentions-dropdown-menu-item-disabled:hover{background-color:#fff;color:#00000040;cursor:not-allowed}.ant-mentions-dropdown-menu-item-selected{background-color:#fafafa;color:#000000d9;font-weight:600}.ant-mentions-dropdown-menu-item-active{background-color:#f5f5f5}.ant-mentions-suffix{align-items:center;bottom:0;display:inline-flex;margin:auto;position:absolute;right:11px;top:0;z-index:1}.ant-mentions-rtl{direction:rtl}.ant-message{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;left:0;line-height:1.5715;list-style:none;margin:0;padding:0;pointer-events:none;position:fixed;top:8px;width:100%;z-index:1010}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice-content{background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;display:inline-block;padding:10px 16px;pointer-events:all}.ant-message-success .anticon{color:#52c41a}.ant-message-error .anticon{color:#ff4d4f}.ant-message-warning .anticon{color:#faad14}.ant-message-info .anticon,.ant-message-loading .anticon{color:#1890ff}.ant-message .anticon{font-size:16px;margin-right:8px;position:relative;top:1px}.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active{animation-duration:.3s;animation-name:MessageMoveOut}@keyframes MessageMoveOut{0%{max-height:150px;opacity:1;padding:8px}to{max-height:0;opacity:0;padding:0}}.ant-message-rtl,.ant-message-rtl span{direction:rtl}.ant-message-rtl .anticon{margin-left:8px;margin-right:0}.ant-modal{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0 auto;max-width:calc(100vw - 32px);padding:0 0 24px;pointer-events:none;position:relative;top:100px;width:auto}.ant-modal.ant-zoom-appear,.ant-modal.ant-zoom-enter{animation-duration:.3s;opacity:0;transform:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{background-color:#00000073;bottom:0;height:100%;left:0;position:fixed;right:0;top:0;z-index:1000}.ant-modal-mask-hidden{display:none}.ant-modal-wrap{bottom:0;left:0;outline:0;overflow:auto;position:fixed;right:0;top:0;z-index:1000}.ant-modal-title{word-wrap:break-word;color:#000000d9;font-size:16px;font-weight:500;line-height:22px;margin:0}.ant-modal-content{background-clip:padding-box;background-color:#fff;border:0;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;pointer-events:auto;position:relative}.ant-modal-close{background:#0000;border:0;color:#00000073;cursor:pointer;font-weight:700;line-height:1;outline:0;padding:0;position:absolute;right:0;text-decoration:none;top:0;transition:color .3s;z-index:10}.ant-modal-close-x{text-rendering:auto;display:block;font-size:16px;font-style:normal;height:54px;line-height:54px;text-align:center;text-transform:none;width:54px}.ant-modal-close:focus,.ant-modal-close:hover{color:#000000bf;text-decoration:none}.ant-modal-header{background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0;color:#000000d9;padding:16px 24px}.ant-modal-body{word-wrap:break-word;font-size:14px;line-height:1.5715;padding:24px}.ant-modal-footer{background:#0000;border-radius:0 0 2px 2px;border-top:1px solid #f0f0f0;padding:10px 16px;text-align:right}.ant-modal-footer .ant-btn+.ant-btn:not(.ant-dropdown-trigger){margin-bottom:0;margin-left:8px}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{content:"";display:inline-block;height:100%;vertical-align:middle;width:0}.ant-modal-centered .ant-modal{display:inline-block;padding-bottom:0;text-align:left;top:0;vertical-align:middle}@media (max-width:767px){.ant-modal{margin:8px auto;max-width:calc(100vw - 16px)}.ant-modal-centered .ant-modal{flex:1 1}}.ant-modal-confirm .ant-modal-header{display:none}.ant-modal-confirm .ant-modal-body{padding:32px 32px 24px}.ant-modal-confirm-body-wrapper:before{content:"";display:table}.ant-modal-confirm-body-wrapper:after{clear:both;content:"";display:table}.ant-modal-confirm-body .ant-modal-confirm-title{color:#000000d9;display:block;font-size:16px;font-weight:500;line-height:1.4;overflow:hidden}.ant-modal-confirm-body .ant-modal-confirm-content{color:#000000d9;font-size:14px;margin-top:8px}.ant-modal-confirm-body>.anticon{float:left;font-size:22px;margin-right:16px}.ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:38px}.ant-modal-confirm .ant-modal-confirm-btns{margin-top:24px;text-align:right}.ant-modal-confirm .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-bottom:0;margin-left:8px}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#ff4d4f}.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon,.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon{color:#faad14}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#1890ff}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#52c41a}.ant-modal-wrap-rtl{direction:rtl}.ant-modal-wrap-rtl .ant-modal-close{left:0;right:auto}.ant-modal-wrap-rtl .ant-modal-footer{text-align:left}.ant-modal-wrap-rtl .ant-modal-footer .ant-btn+.ant-btn{margin-left:0;margin-right:8px}.ant-modal-wrap-rtl .ant-modal-confirm-body{direction:rtl}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon{float:right;margin-left:16px;margin-right:0}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:0;margin-right:38px}.ant-modal-wrap-rtl .ant-modal-confirm-btns{text-align:left}.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-left:0;margin-right:8px}.ant-modal-wrap-rtl.ant-modal-centered .ant-modal{text-align:right}.ant-notification{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0 24px 0 0;padding:0;position:fixed;z-index:1010}.ant-notification-close-icon{cursor:pointer;font-size:14px}.ant-notification-hook-holder{position:relative}.ant-notification-notice{word-wrap:break-word;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;line-height:1.5715;margin-bottom:16px;margin-left:auto;max-width:calc(100vw - 48px);overflow:hidden;padding:16px 24px;position:relative;width:384px}.ant-notification-bottom .ant-notification-notice,.ant-notification-top .ant-notification-notice{margin-left:auto;margin-right:auto}.ant-notification-bottomLeft .ant-notification-notice,.ant-notification-topLeft .ant-notification-notice{margin-left:0;margin-right:auto}.ant-notification-notice-message{color:#000000d9;font-size:16px;line-height:24px;margin-bottom:8px}.ant-notification-notice-message-single-line-auto-margin{background-color:initial;display:block;max-width:4px;pointer-events:none;width:calc(264px - 100%)}.ant-notification-notice-message-single-line-auto-margin:before{content:"";display:block}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{font-size:16px;margin-bottom:4px;margin-left:48px}.ant-notification-notice-with-icon .ant-notification-notice-description{font-size:14px;margin-left:48px}.ant-notification-notice-icon{font-size:24px;line-height:24px;margin-left:4px;position:absolute}.anticon.ant-notification-notice-icon-success{color:#52c41a}.anticon.ant-notification-notice-icon-info{color:#1890ff}.anticon.ant-notification-notice-icon-warning{color:#faad14}.anticon.ant-notification-notice-icon-error{color:#ff4d4f}.ant-notification-notice-close{color:#00000073;outline:none;position:absolute;right:22px;top:16px}.ant-notification-notice-close:hover{color:#000000ab}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{animation-duration:.24s;animation-fill-mode:both;animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-appear,.ant-notification-fade-enter{animation-play-state:paused;opacity:0}.ant-notification-fade-appear,.ant-notification-fade-enter,.ant-notification-fade-leave{animation-duration:.24s;animation-fill-mode:both;animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-leave{animation-duration:.2s;animation-play-state:paused}.ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationFadeIn;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@keyframes NotificationFadeOut{0%{margin-bottom:16px;max-height:150px;opacity:1}to{margin-bottom:0;max-height:0;opacity:0;padding-bottom:0;padding-top:0}}.ant-notification-rtl{direction:rtl}.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message{padding-left:24px;padding-right:0}.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description,.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message{margin-left:0;margin-right:48px}.ant-notification-rtl .ant-notification-notice-icon{margin-left:0;margin-right:4px}.ant-notification-rtl .ant-notification-notice-close{left:22px;right:auto}.ant-notification-rtl .ant-notification-notice-btn{float:left}.ant-notification-bottom,.ant-notification-top{margin-left:0;margin-right:0}.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationTopFadeIn}.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationBottomFadeIn}.ant-notification-bottomLeft,.ant-notification-topLeft{margin-left:24px;margin-right:0}.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationLeftFadeIn}@keyframes NotificationTopFadeIn{0%{margin-top:-100%;opacity:0}to{margin-top:0;opacity:1}}@keyframes NotificationBottomFadeIn{0%{margin-bottom:-100%;opacity:0}to{margin-bottom:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{opacity:0;right:384px}to{opacity:1;right:0}}.ant-page-header{font-feature-settings:"tnum","tnum";background-color:#fff;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:16px 24px;position:relative}.ant-page-header-ghost{background-color:inherit}.ant-page-header.has-breadcrumb{padding-top:12px}.ant-page-header.has-footer{padding-bottom:0}.ant-page-header-back{font-size:16px;line-height:1;margin-right:16px}.ant-page-header-back-button{color:#1890ff;color:#000;cursor:pointer;outline:none;text-decoration:none;transition:color .3s}.ant-page-header-back-button:focus,.ant-page-header-back-button:hover{color:#40a9ff}.ant-page-header-back-button:active{color:#096dd9}.ant-page-header .ant-divider-vertical{height:14px;margin:0 12px;vertical-align:middle}.ant-breadcrumb+.ant-page-header-heading{margin-top:8px}.ant-page-header-heading{display:flex;justify-content:space-between}.ant-page-header-heading-left{align-items:center;display:flex;margin:4px 0;overflow:hidden}.ant-page-header-heading-title{color:#000000d9;font-size:20px;font-weight:600;line-height:32px;margin-bottom:0;margin-right:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-page-header-heading .ant-avatar{margin-right:12px}.ant-page-header-heading-sub-title{color:#00000073;font-size:14px;line-height:1.5715;margin-right:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-page-header-heading-extra{margin:4px 0;white-space:nowrap}.ant-page-header-heading-extra>*{white-space:inherit}.ant-page-header-content{padding-top:12px}.ant-page-header-footer{margin-top:16px}.ant-page-header-footer .ant-tabs>.ant-tabs-nav{margin:0}.ant-page-header-footer .ant-tabs>.ant-tabs-nav:before{border:none}.ant-page-header-footer .ant-tabs .ant-tabs-tab{font-size:16px;padding-bottom:8px;padding-top:8px}.ant-page-header-compact .ant-page-header-heading{flex-wrap:wrap}.ant-page-header-rtl{direction:rtl}.ant-page-header-rtl .ant-page-header-back{float:right;margin-left:16px;margin-right:0}.ant-page-header-rtl .ant-page-header-heading .ant-avatar,.ant-page-header-rtl .ant-page-header-heading-title{margin-left:12px;margin-right:0}.ant-page-header-rtl .ant-page-header-heading-sub-title{float:right;margin-left:12px;margin-right:0}.ant-page-header-rtl .ant-page-header-heading-tags{float:right}.ant-page-header-rtl .ant-page-header-heading-extra{float:left}.ant-page-header-rtl .ant-page-header-heading-extra>*{margin-left:0;margin-right:12px}.ant-page-header-rtl .ant-page-header-heading-extra>:first-child{margin-right:0}.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav{float:right}.ant-space{display:inline-flex}.ant-space-vertical{flex-direction:column}.ant-space-align-center{align-items:center}.ant-space-align-start{align-items:flex-start}.ant-space-align-end{align-items:flex-end}.ant-space-align-baseline{align-items:baseline}.ant-space-item:empty{display:none}.ant-space-rtl{direction:rtl}.ant-popconfirm{z-index:1060}.ant-progress{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-progress-line{font-size:14px;position:relative;width:100%}.ant-progress-steps{display:inline-block}.ant-progress-steps-outer{align-items:center;display:flex;flex-direction:row}.ant-progress-steps-item{background:#f3f3f3;flex-shrink:0;margin-right:2px;min-width:2px;transition:all .3s}.ant-progress-steps-item-active{background:#1890ff}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;margin-right:0;padding-right:0;width:100%}.ant-progress-show-info .ant-progress-outer{margin-right:calc(-2em - 8px);padding-right:calc(2em + 8px)}.ant-progress-inner{background-color:#f5f5f5;border-radius:100px;display:inline-block;overflow:hidden;position:relative;vertical-align:middle;width:100%}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{animation:ant-progress-appear .3s}.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#1890ff}.ant-progress-bg,.ant-progress-success-bg{background-color:#1890ff;border-radius:100px;position:relative;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.ant-progress-success-bg{background-color:#52c41a;left:0;position:absolute;top:0}.ant-progress-text{color:#000000d9;display:inline-block;font-size:1em;line-height:1;margin-left:8px;text-align:left;vertical-align:middle;white-space:nowrap;width:2em;word-break:normal}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;background:#fff;border-radius:10px;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0}.ant-progress-status-exception .ant-progress-bg{background-color:#ff4d4f}.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#ff4d4f}.ant-progress-status-success .ant-progress-bg{background-color:#52c41a}.ant-progress-status-success .ant-progress-text{color:#52c41a}.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#52c41a}.ant-progress-circle .ant-progress-inner{background-color:initial;line-height:1;position:relative}.ant-progress-circle .ant-progress-text{color:#000000d9;font-size:1em;left:50%;line-height:1;margin:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);white-space:normal;width:100%}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#52c41a}@keyframes ant-progress-active{0%{opacity:.1;transform:translateX(-100%) scaleX(0)}20%{opacity:.5;transform:translateX(-100%) scaleX(0)}to{opacity:0;transform:translateX(0) scaleX(1)}}.ant-progress-rtl{direction:rtl}.ant-progress-rtl.ant-progress-show-info .ant-progress-outer{margin-left:calc(-2em - 8px);margin-right:0;padding-left:calc(2em + 8px);padding-right:0}.ant-progress-rtl .ant-progress-success-bg{left:auto;right:0}.ant-progress-rtl.ant-progress-line .ant-progress-text,.ant-progress-rtl.ant-progress-steps .ant-progress-text{margin-left:0;margin-right:8px;text-align:right}.ant-rate{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;color:#fadb14;display:inline-block;font-size:14px;font-size:20px;font-variant:tabular-nums;line-height:1.5715;line-height:inherit;list-style:none;margin:0;outline:none;padding:0}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star>div:hover{transform:scale(1)}.ant-rate-star{color:inherit;cursor:pointer;display:inline-block;position:relative}.ant-rate-star:not(:last-child){margin-right:8px}.ant-rate-star>div{transition:all .3s,outline 0s}.ant-rate-star>div:hover{transform:scale(1.1)}.ant-rate-star>div:focus{outline:0}.ant-rate-star>div:focus-visible{outline:1px dashed #fadb14;transform:scale(1.1)}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star-first{height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;width:50%}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-full .ant-rate-star-second,.ant-rate-star-half .ant-rate-star-first{color:inherit}.ant-rate-text{display:inline-block;font-size:14px;margin:0 8px}.ant-rate-rtl{direction:rtl}.ant-rate-rtl .ant-rate-star:not(:last-child){margin-left:8px;margin-right:0}.ant-rate-rtl .ant-rate-star-first{left:auto;right:0}.ant-result{padding:48px 32px}.ant-result-success .ant-result-icon>.anticon{color:#52c41a}.ant-result-error .ant-result-icon>.anticon{color:#ff4d4f}.ant-result-info .ant-result-icon>.anticon{color:#1890ff}.ant-result-warning .ant-result-icon>.anticon{color:#faad14}.ant-result-image{height:295px;margin:auto;width:250px}.ant-result-icon{margin-bottom:24px;text-align:center}.ant-result-icon>.anticon{font-size:72px}.ant-result-title{color:#000000d9;font-size:24px;line-height:1.8;text-align:center}.ant-result-subtitle{color:#00000073;font-size:14px;line-height:1.6;text-align:center}.ant-result-extra{margin:24px 0 0;text-align:center}.ant-result-extra>*{margin-right:8px}.ant-result-extra>:last-child{margin-right:0}.ant-result-content{background-color:#fafafa;margin-top:24px;padding:24px 40px}.ant-result-rtl{direction:rtl}.ant-result-rtl .ant-result-extra>*{margin-left:8px;margin-right:0}.ant-result-rtl .ant-result-extra>:last-child{margin-left:0}.segmented-disabled-item,.segmented-disabled-item:focus,.segmented-disabled-item:hover{color:#00000040;cursor:not-allowed}.segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px 0 #00000014}.segmented-text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all}.ant-segmented{font-feature-settings:"tnum","tnum";background-color:#0000000a;border-radius:2px;box-sizing:border-box;color:#000000d9;color:#000000a6;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:2px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-group{align-items:stretch;display:flex;justify-items:flex-start;position:relative;width:100%}.ant-segmented.ant-segmented-block{display:flex}.ant-segmented.ant-segmented-block .ant-segmented-item{flex:1 1;min-width:0}.ant-segmented:not(.ant-segmented-disabled):focus,.ant-segmented:not(.ant-segmented-disabled):hover{background-color:#0000000f}.ant-segmented-item{cursor:pointer;position:relative;text-align:center;transition:color .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px 0 #00000014;color:#262626}.ant-segmented-item:focus,.ant-segmented-item:hover{color:#262626}.ant-segmented-item-label{line-height:28px;min-height:28px;overflow:hidden;padding:0 11px;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all}.ant-segmented-item-icon+*{margin-left:6px}.ant-segmented-item-input{height:0;left:0;opacity:0;pointer-events:none;position:absolute;top:0;width:0}.ant-segmented.ant-segmented-lg .ant-segmented-item-label{font-size:16px;line-height:36px;min-height:36px;padding:0 11px}.ant-segmented.ant-segmented-sm .ant-segmented-item-label{line-height:20px;min-height:20px;padding:0 7px}.ant-segmented-item-disabled,.ant-segmented-item-disabled:focus,.ant-segmented-item-disabled:hover{color:#00000040;cursor:not-allowed}.ant-segmented-thumb{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px 0 #00000014;height:100%;left:0;padding:4px 0;position:absolute;top:0;width:0}.ant-segmented-thumb-motion-appear-active{transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);will-change:transform,width}.ant-segmented.ant-segmented-rtl{direction:rtl}.ant-segmented.ant-segmented-rtl .ant-segmented-item-icon{margin-left:6px;margin-right:0}.ant-slider{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;height:12px;line-height:1.5715;list-style:none;margin:10px 6px;padding:4px 0;position:relative;touch-action:none}.ant-slider-vertical{height:100%;margin:6px 10px;padding:0 4px;width:12px}.ant-slider-vertical .ant-slider-rail{height:100%;width:4px}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-left:-5px;margin-top:-6px}.ant-slider-vertical .ant-slider-mark{height:100%;left:12px;top:0;width:18px}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{height:100%;width:4px}.ant-slider-vertical .ant-slider-dot{margin-left:-2px;top:auto}.ant-slider-tooltip .ant-tooltip-inner{min-width:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-handle{margin-left:0;margin-right:-5px}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark{left:auto;right:12px}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text{left:auto;right:4px}.ant-slider-rtl.ant-slider-vertical .ant-slider-dot{left:auto;right:2px}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{background-color:#f5f5f5;width:100%}.ant-slider-rail,.ant-slider-track{border-radius:2px;height:4px;position:absolute;transition:background-color .3s}.ant-slider-track{background-color:#91d5ff}.ant-slider-handle{background-color:#fff;border:2px solid #91d5ff;border-radius:50%;box-shadow:0;cursor:pointer;height:14px;margin-top:-5px;position:absolute;transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28);width:14px}.ant-slider-handle-dragging{z-index:1}.ant-slider-handle:focus{border-color:#46a6ff;box-shadow:0 0 0 5px #1890ff1f;outline:none}.ant-slider-handle.ant-tooltip-open{border-color:#1890ff}.ant-slider-handle:after{bottom:-6px;content:"";left:-6px;position:absolute;right:-6px;top:-6px}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#69c0ff}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#69c0ff}.ant-slider-mark{font-size:14px;left:0;position:absolute;top:14px;width:100%}.ant-slider-mark-text{color:#00000073;cursor:pointer;display:inline-block;position:absolute;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:keep-all}.ant-slider-mark-text-active{color:#000000d9}.ant-slider-step{background:#0000;height:4px;pointer-events:none;position:absolute;width:100%}.ant-slider-dot{background-color:#fff;border:2px solid #f0f0f0;border-radius:50%;cursor:pointer;height:8px;position:absolute;top:-2px;width:8px}.ant-slider-dot-active{border-color:#8cc8ff}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-rail{background-color:#f5f5f5!important}.ant-slider-disabled .ant-slider-track{background-color:#00000040!important}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-handle{background-color:#fff;border-color:#00000040!important;box-shadow:none;cursor:not-allowed}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-mark-text{cursor:not-allowed!important}.ant-slider-rtl{direction:rtl}.ant-slider-rtl .ant-slider-mark{left:auto;right:0}.ant-statistic{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-statistic-title{color:#00000073;font-size:14px;margin-bottom:4px}.ant-statistic-skeleton{padding-top:16px}.ant-statistic-content{color:#000000d9;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:24px}.ant-statistic-content-value{direction:ltr;display:inline-block}.ant-statistic-content-prefix,.ant-statistic-content-suffix{display:inline-block}.ant-statistic-content-prefix{margin-right:4px}.ant-statistic-content-suffix{margin-left:4px}.ant-statistic-rtl{direction:rtl}.ant-statistic-rtl .ant-statistic-content-prefix{margin-left:4px;margin-right:0}.ant-statistic-rtl .ant-statistic-content-suffix{margin-left:0;margin-right:4px}.ant-steps{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:flex;font-size:14px;font-size:0;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;text-align:initial;width:100%}.ant-steps-item{display:inline-block;flex:1 1;overflow:hidden;position:relative;vertical-align:top}.ant-steps-item-container{outline:none}.ant-steps-item:last-child{flex:none}.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after,.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-tail{display:none}.ant-steps-item-content,.ant-steps-item-icon{display:inline-block;vertical-align:top}.ant-steps-item-icon{border:1px solid #00000040;border-radius:32px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:16px;height:32px;line-height:32px;margin:0 8px 0 0;text-align:center;transition:background-color .3s,border-color .3s;width:32px}.ant-steps-item-icon .ant-steps-icon{color:#1890ff;line-height:1;position:relative;top:-.5px}.ant-steps-item-tail{left:0;padding:0 10px;position:absolute;top:12px;width:100%}.ant-steps-item-tail:after{background:#f0f0f0;border-radius:1px;content:"";display:inline-block;height:1px;transition:background .3s;width:100%}.ant-steps-item-title{color:#000000d9;display:inline-block;font-size:16px;line-height:32px;padding-right:16px;position:relative}.ant-steps-item-title:after{background:#f0f0f0;content:"";display:block;height:1px;left:100%;position:absolute;top:16px;width:9999px}.ant-steps-item-subtitle{display:inline;font-weight:400;margin-left:8px}.ant-steps-item-description,.ant-steps-item-subtitle{color:#00000073;font-size:14px}.ant-steps-item-wait .ant-steps-item-icon{background-color:#fff;border-color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#00000040}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon .ant-steps-icon{color:#fff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#1890ff}.ant-steps-item-error .ant-steps-item-icon{background-color:#fff;border-color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#ff4d4f}.ant-steps-item-disabled{cursor:not-allowed}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]{cursor:pointer}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-icon .ant-steps-icon,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-title{transition:color .3s}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-title{color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon{border-color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon .ant-steps-icon{color:#1890ff}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon{background:none;border:0;height:auto}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon>.ant-steps-icon{font-size:24px;height:32px;left:.5px;line-height:32px;top:0;width:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon{background:none;width:auto}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-small .ant-steps-item-icon{border-radius:24px;font-size:12px;height:24px;line-height:24px;margin:0 8px 0 0;text-align:center;width:24px}.ant-steps-small .ant-steps-item-title{font-size:14px;line-height:24px;padding-right:12px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{color:#00000073;font-size:14px}.ant-steps-small .ant-steps-item-tail{top:8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{background:none;border:0;border-radius:0;height:inherit;line-height:inherit;width:inherit}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;transform:none}.ant-steps-vertical{display:flex;flex-direction:column}.ant-steps-vertical>.ant-steps-item{display:block;flex:1 0 auto;overflow:visible;padding-left:0}.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-vertical>.ant-steps-item .ant-steps-item-title{line-height:32px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{height:100%;left:16px;padding:38px 0 6px;position:absolute;top:0;width:1px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail:after{height:100%;width:1px}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-container>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{left:12px;padding:30px 0 6px;position:absolute;top:0}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title{line-height:24px}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{margin-left:58px;padding:3.5px 24px}.ant-steps-label-vertical .ant-steps-item-content{display:block;margin-top:8px;text-align:center;width:116px}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:42px}.ant-steps-label-vertical .ant-steps-item-title{padding-left:0;padding-right:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-label-vertical .ant-steps-item-subtitle{display:block;line-height:1.5715;margin-bottom:4px;margin-left:0}.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon{margin-left:46px}.ant-steps-dot .ant-steps-item-title,.ant-steps-dot.ant-steps-small .ant-steps-item-title{line-height:1.5715}.ant-steps-dot .ant-steps-item-tail,.ant-steps-dot.ant-steps-small .ant-steps-item-tail{margin:0 0 0 70px;padding:0;top:2px;width:100%}.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{height:3px;margin-left:12px;width:calc(100% - 20px)}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-icon{background:#0000;border:0;height:8px;line-height:8px;margin-left:67px;padding-right:0;width:8px}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{border-radius:100px;float:left;height:100%;position:relative;transition:all .3s;width:100%}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{background:rgba(0,0,0,.001);content:"";height:32px;left:-26px;position:absolute;top:-12px;width:60px}.ant-steps-dot .ant-steps-item-content,.ant-steps-dot.ant-steps-small .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon{background:none;height:10px;line-height:10px;position:relative;top:-1px;width:10px}.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{background:none;margin-left:0;margin-top:13px}.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:-9px;margin:0;padding:22px 0 4px;top:6.5px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-top:10px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:3.5px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-content{width:inherit}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot{left:-1px;top:-1px}.ant-steps-navigation{padding-top:12px}.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-left:-12px}.ant-steps-navigation .ant-steps-item{overflow:visible;text-align:center}.ant-steps-navigation .ant-steps-item-container{display:inline-block;height:100%;margin-left:-16px;padding-bottom:12px;text-align:left;transition:opacity .3s}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content{max-width:auto}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{max-width:100%;overflow:hidden;padding-right:0;text-overflow:ellipsis;white-space:nowrap}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title:after{display:none}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]{cursor:pointer}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]:hover{opacity:.85}.ant-steps-navigation .ant-steps-item:last-child{flex:1 1}.ant-steps-navigation .ant-steps-item:last-child:after{display:none}.ant-steps-navigation .ant-steps-item:after{border:1px solid #00000040;border-bottom:none;border-left:none;content:"";display:inline-block;height:12px;left:100%;margin-left:-2px;margin-top:-14px;position:absolute;top:50%;transform:rotate(45deg);width:12px}.ant-steps-navigation .ant-steps-item:before{background-color:#1890ff;bottom:0;content:"";display:inline-block;height:2px;left:50%;position:absolute;transition:width .3s,left .3s;transition-timing-function:ease-out;width:0}.ant-steps-navigation .ant-steps-item.ant-steps-item-active:before{left:0;width:100%}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item{margin-right:0!important}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:before{display:none}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item.ant-steps-item-active:before{display:block;height:calc(100% - 24px);left:auto;right:0;top:0;width:3px}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:after{display:block;height:8px;left:50%;margin-bottom:8px;position:relative;text-align:center;top:-2px;transform:rotate(135deg);width:8px}.ant-steps-navigation.ant-steps-horizontal>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail,.ant-steps-navigation.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-rtl{direction:rtl}.ant-steps.ant-steps-rtl .ant-steps-item-icon{margin-left:8px;margin-right:0}.ant-steps-rtl .ant-steps-item-tail{left:auto;right:0}.ant-steps-rtl .ant-steps-item-title{padding-left:16px;padding-right:0}.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle{float:left;margin-left:0;margin-right:8px}.ant-steps-rtl .ant-steps-item-title:after{left:auto;right:100%}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:0;padding-right:16px}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-left:0}.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{left:auto;right:.5px}.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-left:0;margin-right:-12px}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container{margin-left:0;margin-right:-16px;text-align:right}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item:after{left:auto;margin-left:0;margin-right:-2px;right:100%;transform:rotate(225deg)}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:0;padding-right:12px}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-small .ant-steps-item-title{padding-left:12px;padding-right:0}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:right;margin-left:16px;margin-right:0}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:auto;right:16px}.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{left:auto;right:12px}.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail{margin:0 70px 0 0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{margin-left:0;margin-right:12px}.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{left:auto;right:2px}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-left:0;margin-right:67px}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{float:right}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{left:auto;right:-26px}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-left:16px;margin-right:0}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:auto;right:-9px}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:auto;right:0}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{left:auto;right:-2px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child{padding-left:0;padding-right:4px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active{padding-right:4px}.ant-steps-with-progress .ant-steps-item{padding-top:4px}.ant-steps-with-progress .ant-steps-item .ant-steps-item-tail{top:4px!important}.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child{padding-bottom:4px;padding-left:4px}.ant-steps-with-progress .ant-steps-item-icon{position:relative}.ant-steps-with-progress .ant-steps-item-icon .ant-progress{bottom:-5px;left:-5px;position:absolute;right:-5px;top:-5px}.ant-switch{font-feature-settings:"tnum","tnum";background-image:linear-gradient(90deg,#00000040,#00000040),linear-gradient(90deg,#fff,#fff);border:0;border-radius:100px;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-block;font-size:14px;font-variant:tabular-nums;height:22px;line-height:1.5715;line-height:22px;list-style:none;margin:0;min-width:44px;padding:0;position:relative;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.ant-switch:focus{box-shadow:0 0 0 2px #0000001a;outline:0}.ant-switch-checked:focus{box-shadow:0 0 0 2px #e6f7ff}.ant-switch:focus:hover{box-shadow:none}.ant-switch-checked{background:#1890ff}.ant-switch-disabled,.ant-switch-loading{cursor:not-allowed;opacity:.4}.ant-switch-disabled *,.ant-switch-loading *{box-shadow:none;cursor:not-allowed}.ant-switch-inner{color:#fff;display:block;font-size:12px;margin:0 7px 0 25px;transition:margin .2s}.ant-switch-checked .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-handle{height:18px;left:2px;top:2px;width:18px}.ant-switch-handle,.ant-switch-handle:before{position:absolute;transition:all .2s ease-in-out}.ant-switch-handle:before{background-color:#fff;border-radius:9px;bottom:0;box-shadow:0 2px 4px 0 #00230b33;content:"";left:0;right:0;top:0}.ant-switch-checked .ant-switch-handle{left:calc(100% - 20px)}.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle:before{left:0;right:-30%}.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle:before{left:-30%;right:0}.ant-switch-loading-icon.anticon{color:#000000a6;position:relative;top:2px;vertical-align:top}.ant-switch-checked .ant-switch-loading-icon{color:#1890ff}.ant-switch-small{height:16px;line-height:16px;min-width:28px}.ant-switch-small .ant-switch-inner{font-size:12px;margin:0 5px 0 18px}.ant-switch-small .ant-switch-handle{height:12px;width:12px}.ant-switch-small .ant-switch-loading-icon{font-size:9px;top:1.5px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin:0 18px 0 5px}.ant-switch-small.ant-switch-checked .ant-switch-handle{left:calc(100% - 14px)}.ant-switch-rtl{direction:rtl}.ant-switch-rtl .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-rtl .ant-switch-handle{left:auto;right:2px}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle:before{left:-30%;right:0}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle:before{left:0;right:-30%}.ant-switch-rtl.ant-switch-checked .ant-switch-inner{margin:0 7px 0 25px}.ant-switch-rtl.ant-switch-checked .ant-switch-handle{right:calc(100% - 20px)}.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle{right:calc(100% - 14px)}.ant-table.ant-table-middle{font-size:14px}.ant-table.ant-table-middle .ant-table-footer,.ant-table.ant-table-middle .ant-table-tbody>tr>td,.ant-table.ant-table-middle .ant-table-thead>tr>th,.ant-table.ant-table-middle .ant-table-title,.ant-table.ant-table-middle tfoot>tr>td,.ant-table.ant-table-middle tfoot>tr>th{padding:12px 8px}.ant-table.ant-table-middle .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-middle .ant-table-expanded-row-fixed{margin:-12px -8px}.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-12px -8px -12px 40px}.ant-table.ant-table-middle .ant-table-selection-column{padding-inline-start:2px}.ant-table.ant-table-small{font-size:14px}.ant-table.ant-table-small .ant-table-footer,.ant-table.ant-table-small .ant-table-tbody>tr>td,.ant-table.ant-table-small .ant-table-thead>tr>th,.ant-table.ant-table-small .ant-table-title,.ant-table.ant-table-small tfoot>tr>td,.ant-table.ant-table-small tfoot>tr>th{padding:8px}.ant-table.ant-table-small .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-small .ant-table-expanded-row-fixed{margin:-8px}.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-8px -8px -8px 40px}.ant-table.ant-table-small .ant-table-selection-column{padding-inline-start:2px}.ant-table.ant-table-bordered>.ant-table-title{border:1px solid #f0f0f0;border-bottom:0}.ant-table.ant-table-bordered>.ant-table-container{border-left:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr:not(:last-child)>th{border-bottom:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th:before{background-color:initial!important}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>.ant-table-cell-fix-right-first:after{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-16px -17px}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed:after{border-right:1px solid #f0f0f0;bottom:0;content:"";position:absolute;right:1px;top:0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{border-top:1px solid #f0f0f0}.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-expanded-row>td,.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-placeholder>td{border-right:0}.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-12px -9px}.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-8px -9px}.ant-table.ant-table-bordered>.ant-table-footer{border:1px solid #f0f0f0;border-top:0}.ant-table-cell .ant-table-container:first-child{border-top:0}.ant-table-cell-scrollbar:not([rowspan]){box-shadow:0 1px 0 1px #fafafa}.ant-table-wrapper{clear:both;max-width:100%}.ant-table-wrapper:before{content:"";display:table}.ant-table-wrapper:after{clear:both;content:"";display:table}.ant-table{font-feature-settings:"tnum","tnum";background:#fff;border-radius:2px;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative}.ant-table table{border-collapse:initial;border-radius:2px 2px 0 0;border-spacing:0;text-align:left;width:100%}.ant-table tfoot>tr>td,.ant-table tfoot>tr>th,.ant-table-tbody>tr>td,.ant-table-thead>tr>th{overflow-wrap:break-word;padding:16px;position:relative}.ant-table-cell-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first{overflow:visible}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content{display:block;overflow:hidden;text-overflow:ellipsis}.ant-table-cell-ellipsis .ant-table-column-title{overflow:hidden;text-overflow:ellipsis;word-break:keep-all}.ant-table-title{padding:16px}.ant-table-footer{background:#fafafa;color:#000000d9;padding:16px}.ant-table-thead>tr>th{background:#fafafa;border-bottom:1px solid #f0f0f0;color:#000000d9;font-weight:500;position:relative;text-align:left;transition:background .3s ease}.ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{background-color:#0000000f;content:"";height:1.6em;position:absolute;right:0;top:50%;transform:translateY(-50%);transition:background-color .3s;width:1px}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #f0f0f0;transition:background .3s}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table{margin:-16px -16px -16px 32px}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td{border-bottom:0}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child{border-radius:0}.ant-table-tbody>tr.ant-table-row:hover>td,.ant-table-tbody>tr>td.ant-table-cell-row-hover{background:#fafafa}.ant-table-tbody>tr.ant-table-row-selected>td{background:#e6f7ff;border-color:#00000008}.ant-table-tbody>tr.ant-table-row-selected:hover>td{background:#dcf4ff}.ant-table-summary{background:#fff;position:relative;z-index:2}div.ant-table-summary{box-shadow:0 -1px 0 #f0f0f0}.ant-table-summary>tr>td,.ant-table-summary>tr>th{border-bottom:1px solid #f0f0f0}.ant-table-pagination.ant-pagination{margin:16px 0}.ant-table-pagination{display:flex;flex-wrap:wrap;row-gap:8px}.ant-table-pagination>*{flex:none}.ant-table-pagination-left{justify-content:flex-start}.ant-table-pagination-center{justify-content:center}.ant-table-pagination-right{justify-content:flex-end}.ant-table-thead th.ant-table-column-has-sorters{cursor:pointer;outline:none;transition:all .3s}.ant-table-thead th.ant-table-column-has-sorters:hover{background:#0000000a}.ant-table-thead th.ant-table-column-has-sorters:hover:before{background-color:initial!important}.ant-table-thead th.ant-table-column-has-sorters:focus-visible{color:#1890ff}.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover,.ant-table-thead th.ant-table-column-sort{background:#f5f5f5}.ant-table-thead th.ant-table-column-sort:before{background-color:initial!important}td.ant-table-column-sort{background:#fafafa}.ant-table-column-title{flex:1 1;position:relative;z-index:1}.ant-table-column-sorters{align-items:center;display:flex;flex:auto;justify-content:space-between}.ant-table-column-sorters:after{bottom:0;content:"";height:100%;left:0;position:absolute;right:0;top:0;width:100%}.ant-table-column-sorter{color:#bfbfbf;font-size:0;margin-left:4px;transition:color .3s}.ant-table-column-sorter-inner{align-items:center;display:inline-flex;flex-direction:column}.ant-table-column-sorter-down,.ant-table-column-sorter-up{font-size:11px}.ant-table-column-sorter-down.active,.ant-table-column-sorter-up.active{color:#1890ff}.ant-table-column-sorter-up+.ant-table-column-sorter-down{margin-top:-.3em}.ant-table-column-sorters:hover .ant-table-column-sorter{color:#a6a6a6}.ant-table-filter-column{display:flex;justify-content:space-between}.ant-table-filter-trigger{align-items:center;border-radius:2px;color:#bfbfbf;cursor:pointer;display:flex;font-size:12px;margin:-4px -8px -4px 4px;padding:0 4px;position:relative;transition:all .3s}.ant-table-filter-trigger:hover{background:#0000000a;color:#00000073}.ant-table-filter-trigger.active{color:#1890ff}.ant-table-filter-dropdown{font-feature-settings:"tnum","tnum";background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px 0 #00000014,0 9px 28px 8px #0000000d;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;min-width:120px;padding:0}.ant-table-filter-dropdown .ant-dropdown-menu{border:0;box-shadow:none;max-height:264px;overflow-x:hidden}.ant-table-filter-dropdown .ant-dropdown-menu:empty:after{color:#00000040;content:"Not Found";display:block;font-size:12px;padding:8px 0;text-align:center}.ant-table-filter-dropdown-tree{padding:8px 8px 0}.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover{background-color:#bae7ff}.ant-table-filter-dropdown-search{border-bottom:1px solid #f0f0f0;padding:8px}.ant-table-filter-dropdown-search-input input{min-width:140px}.ant-table-filter-dropdown-search-input .anticon{color:#00000040}.ant-table-filter-dropdown-checkall{margin-bottom:4px;margin-left:4px;width:100%}.ant-table-filter-dropdown-submenu>ul{max-height:calc(100vh - 130px);overflow-x:hidden;overflow-y:auto}.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-left:8px}.ant-table-filter-dropdown-btns{background-color:inherit;border-top:1px solid #f0f0f0;display:flex;justify-content:space-between;overflow:hidden;padding:7px 8px}.ant-table-selection-col{width:32px}.ant-table-bordered .ant-table-selection-col{width:50px}table tr td.ant-table-selection-column,table tr th.ant-table-selection-column{padding-left:8px;padding-right:8px;text-align:center}table tr td.ant-table-selection-column .ant-radio-wrapper,table tr th.ant-table-selection-column .ant-radio-wrapper{margin-right:0}table tr th.ant-table-selection-column.ant-table-cell-fix-left{z-index:3}table tr th.ant-table-selection-column:after{background-color:initial!important}.ant-table-selection{display:inline-flex;flex-direction:column;position:relative}.ant-table-selection-extra{cursor:pointer;margin-inline-start:100%;padding-inline-start:4px;position:absolute;top:0;transition:all .3s;z-index:1}.ant-table-selection-extra .anticon{color:#bfbfbf;font-size:10px}.ant-table-selection-extra .anticon:hover{color:#a6a6a6}.ant-table-expand-icon-col{width:48px}.ant-table-row-expand-icon-cell{text-align:center}.ant-table-row-expand-icon-cell .ant-table-row-expand-icon{display:inline-flex;float:none;vertical-align:sub}.ant-table-row-indent{float:left;height:1px}.ant-table-row-expand-icon{background:#fff;border:1px solid #f0f0f0;border-radius:2px;box-sizing:border-box;color:#1890ff;color:inherit;cursor:pointer;float:left;height:17px;line-height:17px;outline:none;padding:0;position:relative;text-decoration:none;transform:scale(.94117647);transition:color .3s;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:17px}.ant-table-row-expand-icon:focus,.ant-table-row-expand-icon:hover{color:#40a9ff}.ant-table-row-expand-icon:active{color:#096dd9}.ant-table-row-expand-icon:active,.ant-table-row-expand-icon:focus,.ant-table-row-expand-icon:hover{border-color:currentcolor}.ant-table-row-expand-icon:after,.ant-table-row-expand-icon:before{background:currentcolor;content:"";position:absolute;transition:transform .3s ease-out}.ant-table-row-expand-icon:before{height:1px;left:3px;right:3px;top:7px}.ant-table-row-expand-icon:after{bottom:3px;left:7px;top:3px;transform:rotate(90deg);width:1px}.ant-table-row-expand-icon-collapsed:before{transform:rotate(-180deg)}.ant-table-row-expand-icon-collapsed:after{transform:rotate(0deg)}.ant-table-row-expand-icon-spaced{background:#0000;border:0;visibility:hidden}.ant-table-row-expand-icon-spaced:after,.ant-table-row-expand-icon-spaced:before{content:none;display:none}.ant-table-row-indent+.ant-table-row-expand-icon{margin-right:8px;margin-top:2.5005px}tr.ant-table-expanded-row:hover>td,tr.ant-table-expanded-row>td{background:#fbfbfb}tr.ant-table-expanded-row .ant-descriptions-view{display:flex}tr.ant-table-expanded-row .ant-descriptions-view table{flex:auto;width:auto}.ant-table .ant-table-expanded-row-fixed{margin:-16px;padding:16px;position:relative}.ant-table-tbody>tr.ant-table-placeholder{text-align:center}.ant-table-empty .ant-table-tbody>tr.ant-table-placeholder{color:#00000040}.ant-table-tbody>tr.ant-table-placeholder:hover>td{background:#fff}.ant-table-cell-fix-left,.ant-table-cell-fix-right{background:#fff;position:sticky!important;z-index:2}.ant-table-cell-fix-left-first:after,.ant-table-cell-fix-left-last:after{bottom:-1px;content:"";pointer-events:none;position:absolute;right:0;top:0;transform:translateX(100%);transition:box-shadow .3s;width:30px}.ant-table-cell-fix-left-all:after{display:none}.ant-table-cell-fix-right-first:after,.ant-table-cell-fix-right-last:after{bottom:-1px;content:"";left:0;pointer-events:none;position:absolute;top:0;transform:translateX(-100%);transition:box-shadow .3s;width:30px}.ant-table .ant-table-container:after,.ant-table .ant-table-container:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0;transition:box-shadow .3s;width:30px;z-index:2}.ant-table .ant-table-container:before{left:0}.ant-table .ant-table-container:after{right:0}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container{position:relative}.ant-table-ping-left .ant-table-cell-fix-left-first:after,.ant-table-ping-left .ant-table-cell-fix-left-last:after,.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container:before{box-shadow:inset 10px 0 8px -8px #00000026}.ant-table-ping-left .ant-table-cell-fix-left-last:before{background-color:initial!important}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container{position:relative}.ant-table-ping-right .ant-table-cell-fix-right-first:after,.ant-table-ping-right .ant-table-cell-fix-right-last:after,.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container:after{box-shadow:inset -10px 0 8px -8px #00000026}.ant-table-sticky-holder,.ant-table-sticky-scroll{background:#fff;position:sticky;z-index:3}.ant-table-sticky-scroll{align-items:center;border-top:1px solid #f0f0f0;bottom:0;display:flex;opacity:.6}.ant-table-sticky-scroll:hover{transform-origin:center bottom}.ant-table-sticky-scroll-bar{background-color:#00000059;border-radius:4px;height:8px}.ant-table-sticky-scroll-bar-active,.ant-table-sticky-scroll-bar:hover{background-color:#000c}@media (-ms-high-contrast:none){.ant-table-ping-left .ant-table-cell-fix-left-last:after,.ant-table-ping-right .ant-table-cell-fix-right-first:after{box-shadow:none!important}}.ant-table-title{border-radius:2px 2px 0 0}.ant-table-title+.ant-table-container{border-top-left-radius:0;border-top-right-radius:0}.ant-table-title+.ant-table-container table,.ant-table-title+.ant-table-container table>thead>tr:first-child th:first-child,.ant-table-title+.ant-table-container table>thead>tr:first-child th:last-child{border-radius:0}.ant-table-container{border-top-right-radius:2px}.ant-table-container,.ant-table-container table>thead>tr:first-child th:first-child{border-top-left-radius:2px}.ant-table-container table>thead>tr:first-child th:last-child{border-top-right-radius:2px}.ant-table-footer{border-radius:0 0 2px 2px}.ant-table-rtl,.ant-table-wrapper-rtl{direction:rtl}.ant-table-wrapper-rtl .ant-table table{text-align:right}.ant-table-wrapper-rtl .ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-wrapper-rtl .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{left:0;right:auto}.ant-table-wrapper-rtl .ant-table-thead>tr>th{text-align:right}.ant-table-tbody>tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl{margin:-16px 33px -16px -16px}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left{justify-content:flex-end}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right{justify-content:flex-start}.ant-table-wrapper-rtl .ant-table-column-sorter{margin-left:0;margin-right:4px}.ant-table-wrapper-rtl .ant-table-filter-column-title{padding:16px 16px 16px 2.3em}.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title{padding:0 0 0 2.3em}.ant-table-wrapper-rtl .ant-table-filter-trigger{margin:-4px 4px -4px -8px}.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-left:0;padding-right:8px}.ant-table-wrapper-rtl .ant-table-selection{text-align:center}.ant-table-wrapper-rtl .ant-table-row-expand-icon,.ant-table-wrapper-rtl .ant-table-row-indent{float:right}.ant-table-wrapper-rtl .ant-table-row-indent+.ant-table-row-expand-icon{margin-left:8px;margin-right:0}.ant-table-wrapper-rtl .ant-table-row-expand-icon:after{transform:rotate(-90deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:before{transform:rotate(180deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:after{transform:rotate(0deg)}.ant-tree.ant-tree-directory .ant-tree-treenode{position:relative}.ant-tree.ant-tree-directory .ant-tree-treenode:before{bottom:4px;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0;transition:background-color .3s}.ant-tree.ant-tree-directory .ant-tree-treenode:hover:before{background:#f5f5f5}.ant-tree.ant-tree-directory .ant-tree-treenode>*{z-index:1}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher{transition:color .3s}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background:#0000}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected{background:#0000;color:#fff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected:before,.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover:before{background:#1890ff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper{background:#0000;color:#fff}.ant-tree-checkbox{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:1;list-style:none;margin:0;outline:none;padding:0;position:relative;top:.2em;white-space:nowrap}.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree-checkbox-checked:after{animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;border:1px solid #1890ff;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;visibility:hidden;width:100%}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after,.ant-tree-checkbox:hover:after{visibility:visible}.ant-tree-checkbox-inner{background-color:#fff;border:1px solid #d9d9d9;border-collapse:initial;border-radius:2px;direction:ltr;display:block;height:16px;left:0;position:relative;top:0;transition:all .3s;width:16px}.ant-tree-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;height:9.14285714px;left:21.5%;opacity:0;position:absolute;top:50%;transform:rotate(45deg) scale(0) translate(-50%,-50%);transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;width:5.71428571px}.ant-tree-checkbox-input{bottom:0;cursor:pointer;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%;z-index:1}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;opacity:1;position:absolute;transform:rotate(45deg) scale(1) translate(-50%,-50%);transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{animation-name:none;border-color:#00000040}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{animation-name:none;border-collapse:initial;border-color:#f5f5f5}.ant-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-tree-checkbox-disabled:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled:after{visibility:hidden}.ant-tree-checkbox-wrapper{font-feature-settings:"tnum","tnum";align-items:baseline;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:inherit;list-style:none;margin:0;padding:0}.ant-tree-checkbox-wrapper:after{content:"\a0";display:inline-block;overflow:hidden;width:0}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type=checkbox]{height:14px;width:14px}.ant-tree-checkbox+span{padding-left:8px;padding-right:8px}.ant-tree-checkbox-group{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-tree-checkbox-group-item{margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{background-color:#1890ff;border:0;content:" ";height:8px;left:50%;opacity:1;top:50%;transform:translate(-50%,-50%) scale(1);width:8px}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree{font-feature-settings:"tnum","tnum";background:#fff;border-radius:2px;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;transition:background-color .3s}.ant-tree-focused:not(:hover):not(.ant-tree-active-focused){background:#e6f7ff}.ant-tree-list-holder-inner{align-items:flex-start}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner{align-items:stretch}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper{flex:auto}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging{position:relative}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging:after{animation:ant-tree-node-fx-do-not-use .3s;animation-fill-mode:forwards;animation-play-state:running;border:1px solid #1890ff;bottom:4px;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0}.ant-tree .ant-tree-treenode{align-items:flex-start;display:flex;outline:none;padding:0 0 4px}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover{background:#0000}.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper{background:#f5f5f5}.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title{color:inherit;font-weight:500}.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{line-height:24px;opacity:.2;text-align:center;transition:opacity .3s;visibility:visible;width:24px}.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{opacity:.45}.ant-tree-indent{align-self:stretch;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.ant-tree-indent-unit{display:inline-block;width:24px}.ant-tree-draggable-icon{visibility:hidden}.ant-tree-switcher{align-self:stretch;cursor:pointer;flex:none;line-height:24px;margin:0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:24px}.ant-tree-switcher .ant-select-tree-switcher-icon,.ant-tree-switcher .ant-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:initial}.ant-tree-switcher .ant-select-tree-switcher-icon svg,.ant-tree-switcher .ant-tree-switcher-icon svg{transition:transform .3s}.ant-tree-switcher-noop{cursor:default}.ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-tree-switcher-loading-icon{color:#1890ff}.ant-tree-switcher-leaf-line{display:inline-block;height:100%;position:relative;width:100%;z-index:1}.ant-tree-switcher-leaf-line:before{border-right:1px solid #d9d9d9;bottom:-4px;content:" ";margin-left:-1px;position:absolute;right:12px;top:0}.ant-tree-switcher-leaf-line:after{border-bottom:1px solid #d9d9d9;content:" ";height:14px;position:absolute;width:10px}.ant-tree-checkbox{margin:4px 8px 0 0;top:auto}.ant-tree .ant-tree-node-content-wrapper{background:#0000;border-radius:2px;color:inherit;cursor:pointer;line-height:24px;margin:0;min-height:24px;padding:0 4px;position:relative;transition:all .3s,border 0s,line-height 0s,box-shadow 0s;z-index:auto}.ant-tree .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bae7ff}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle{display:inline-block;height:24px;line-height:24px;text-align:center;vertical-align:top;width:24px}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty{display:none}.ant-tree-unselectable .ant-tree-node-content-wrapper:hover{background-color:initial}.ant-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator{background-color:#1890ff;border-radius:1px;height:2px;pointer-events:none;position:absolute;z-index:1}.ant-tree-node-content-wrapper .ant-tree-drop-indicator:after{background-color:initial;border:2px solid #1890ff;border-radius:50%;content:"";height:8px;left:-6px;position:absolute;top:-3px;width:8px}.ant-tree .ant-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-tree-show-line .ant-tree-indent-unit{height:100%;position:relative}.ant-tree-show-line .ant-tree-indent-unit:before{border-right:1px solid #d9d9d9;bottom:-4px;content:"";position:absolute;right:12px;top:0}.ant-tree-show-line .ant-tree-indent-unit-end:before{display:none}.ant-tree-show-line .ant-tree-switcher{background:#fff}.ant-tree-show-line .ant-tree-switcher-line-icon{vertical-align:-.15em}.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line:before{bottom:auto!important;height:14px!important;top:auto!important}.ant-tree-rtl{direction:rtl}.ant-tree-rtl .ant-tree-node-content-wrapper[draggable=true] .ant-tree-drop-indicator:after{left:auto;right:-6px}.ant-tree .ant-tree-treenode-rtl{direction:rtl}.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit:before{border-left:1px solid #d9d9d9;border-right:none;left:-13px;right:auto}.ant-tree-rtl .ant-tree-checkbox,.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox{margin:4px 0 0 8px}.ant-timeline{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-timeline-item{font-size:14px;list-style:none;margin:0;padding-bottom:20px;position:relative}.ant-timeline-item-tail{border-left:2px solid #f0f0f0;height:calc(100% - 10px);left:4px;position:absolute;top:10px}.ant-timeline-item-pending .ant-timeline-item-head{background-color:initial;font-size:12px}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{background-color:#fff;border:2px solid #0000;border-radius:100px;height:10px;position:absolute;width:10px}.ant-timeline-item-head-blue{border-color:#1890ff;color:#1890ff}.ant-timeline-item-head-red{border-color:#ff4d4f;color:#ff4d4f}.ant-timeline-item-head-green{border-color:#52c41a;color:#52c41a}.ant-timeline-item-head-gray{border-color:#00000040;color:#00000040}.ant-timeline-item-head-custom{border:0;border-radius:0;height:auto;left:5px;line-height:1;margin-top:0;padding:3px 1px;position:absolute;text-align:center;top:5.5px;transform:translate(-50%,-50%);width:auto}.ant-timeline-item-content{margin:0 0 0 26px;position:relative;top:-7.001px;word-break:break-word}.ant-timeline-item-last>.ant-timeline-item-tail{display:none}.ant-timeline-item-last>.ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-tail{left:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head{margin-left:-4px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom{margin-left:1px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content{left:calc(50% - 4px);text-align:left;width:calc(50% - 14px)}.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{margin:0;text-align:right;width:calc(50% - 12px)}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail{left:calc(100% - 6px)}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{width:calc(100% - 18px)}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{border-left:2px dotted #f0f0f0;display:block;height:calc(100% - 14px)}.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{border-left:2px dotted #f0f0f0;display:block;height:calc(100% - 15px);top:15px}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-label .ant-timeline-item-label{position:absolute;text-align:right;top:-7.001px;width:calc(50% - 12px)}.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{left:calc(50% + 14px);text-align:left;width:calc(50% - 14px)}.ant-timeline-rtl{direction:rtl}.ant-timeline-rtl .ant-timeline-item-tail{border-left:none;border-right:2px solid #f0f0f0;left:auto;right:4px}.ant-timeline-rtl .ant-timeline-item-head-custom{left:auto;right:5px;transform:translate(50%,-50%)}.ant-timeline-rtl .ant-timeline-item-content{margin:0 18px 0 0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail{left:auto;right:50%}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head{margin-left:0;margin-right:-4px}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom{margin-left:0;margin-right:1px}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content{left:auto;right:calc(50% - 4px);text-align:right}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail{left:auto;right:0}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{margin-right:18px;text-align:right;width:100%}.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{border-left:none;border-right:2px dotted #f0f0f0}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{right:calc(50% + 14px);text-align:right}.ant-transfer-customize-list .ant-transfer-list{flex:1 1 50%;height:auto;min-height:200px;width:auto}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small{border:0;border-radius:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{min-width:40px;width:40px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th{background:#fafafa}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:1px solid #f0f0f0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body{margin:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:16px 0 4px}.ant-transfer-customize-list .ant-input[disabled]{background-color:initial}.ant-transfer-status-error .ant-transfer-list{border-color:#ff4d4f}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-transfer-status-warning .ant-transfer-list{border-color:#faad14}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;border-right-width:1px;box-shadow:0 0 0 2px #1890ff33;outline:0}.ant-transfer{font-feature-settings:"tnum","tnum";align-items:stretch;box-sizing:border-box;color:#000000d9;display:flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;position:relative}.ant-transfer-disabled .ant-transfer-list{background:#f5f5f5}.ant-transfer-list{border:1px solid #d9d9d9;border-radius:2px;display:flex;flex-direction:column;height:200px;width:180px}.ant-transfer-list-with-pagination{height:auto;width:250px}.ant-transfer-list-search .anticon-search{color:#00000040}.ant-transfer-list-header{align-items:center;background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0;color:#000000d9;display:flex;flex:none;height:40px;padding:8px 12px 9px}.ant-transfer-list-header>:not(:last-child){margin-right:4px}.ant-transfer-list-header>*{flex:none}.ant-transfer-list-header-title{flex:auto;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.ant-transfer-list-header-dropdown{cursor:pointer;font-size:10px;transform:translateY(10%)}.ant-transfer-list-header-dropdown[disabled]{cursor:not-allowed}.ant-transfer-list-body{display:flex;flex:auto;flex-direction:column;font-size:14px;overflow:hidden}.ant-transfer-list-body-search-wrapper{flex:none;padding:12px;position:relative}.ant-transfer-list-content{flex:auto;list-style:none;margin:0;overflow:auto;padding:0}.ant-transfer-list-content-item{align-items:center;display:flex;line-height:20px;min-height:32px;padding:6px 12px;transition:all .3s}.ant-transfer-list-content-item>:not(:last-child){margin-right:8px}.ant-transfer-list-content-item>*{flex:none}.ant-transfer-list-content-item-text{flex:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-transfer-list-content-item-remove{color:#1890ff;color:#d9d9d9;cursor:pointer;outline:none;position:relative;text-decoration:none;transition:color .3s}.ant-transfer-list-content-item-remove:focus,.ant-transfer-list-content-item-remove:hover{color:#40a9ff}.ant-transfer-list-content-item-remove:active{color:#096dd9}.ant-transfer-list-content-item-remove:after{bottom:-6px;content:"";left:-50%;position:absolute;right:-50%;top:-6px}.ant-transfer-list-content-item-remove:hover{color:#40a9ff}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background-color:#f5f5f5;cursor:pointer}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover{background-color:#dcf4ff}.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background:#0000;cursor:default}.ant-transfer-list-content-item-checked{background-color:#e6f7ff}.ant-transfer-list-content-item-disabled{color:#00000040;cursor:not-allowed}.ant-transfer-list-pagination{border-top:1px solid #f0f0f0;padding:8px 0;text-align:right}.ant-transfer-list-body-not-found{color:#00000040;flex:none;margin:auto 0;text-align:center;width:100%}.ant-transfer-list-footer{border-top:1px solid #f0f0f0}.ant-transfer-operation{align-self:center;display:flex;flex:none;flex-direction:column;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}.ant-transfer .ant-empty-image{max-height:-2px}.ant-transfer-rtl{direction:rtl}.ant-transfer-rtl .ant-transfer-list-search{padding-left:24px;padding-right:8px}.ant-transfer-rtl .ant-transfer-list-search-action{left:12px;right:auto}.ant-transfer-rtl .ant-transfer-list-header>:not(:last-child){margin-left:4px;margin-right:0}.ant-transfer-rtl .ant-transfer-list-header{left:auto;right:0}.ant-transfer-rtl .ant-transfer-list-header-title{text-align:left}.ant-transfer-rtl .ant-transfer-list-content-item>:not(:last-child){margin-left:8px;margin-right:0}.ant-transfer-rtl .ant-transfer-list-pagination{text-align:left}.ant-transfer-rtl .ant-transfer-list-footer{left:auto;right:0}@keyframes ant-tree-node-fx-do-not-use{0%{opacity:0}to{opacity:1}}@keyframes antCheckboxEffect{0%{opacity:.5;transform:scale(1)}to{opacity:0;transform:scale(1.6)}}.ant-select-tree-checkbox{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;cursor:pointer;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:1;list-style:none;margin:0;outline:none;padding:0;position:relative;top:.2em;white-space:nowrap}.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner{border-color:#1890ff}.ant-select-tree-checkbox-checked:after{animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;border:1px solid #1890ff;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;visibility:hidden;width:100%}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after,.ant-select-tree-checkbox:hover:after{visibility:visible}.ant-select-tree-checkbox-inner{background-color:#fff;border:1px solid #d9d9d9;border-collapse:initial;border-radius:2px;direction:ltr;display:block;height:16px;left:0;position:relative;top:0;transition:all .3s;width:16px}.ant-select-tree-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;height:9.14285714px;left:21.5%;opacity:0;position:absolute;top:50%;transform:rotate(45deg) scale(0) translate(-50%,-50%);transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;width:5.71428571px}.ant-select-tree-checkbox-input{bottom:0;cursor:pointer;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%;z-index:1}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{border:2px solid #fff;border-left:0;border-top:0;content:" ";display:table;opacity:1;position:absolute;transform:rotate(45deg) scale(1) translate(-50%,-50%);transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{animation-name:none;border-color:#00000040}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{animation-name:none;border-collapse:initial;border-color:#f5f5f5}.ant-select-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-select-tree-checkbox-disabled:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled:after{visibility:hidden}.ant-select-tree-checkbox-wrapper{font-feature-settings:"tnum","tnum";align-items:baseline;box-sizing:border-box;color:#000000d9;cursor:pointer;display:inline-flex;font-size:14px;font-variant:tabular-nums;line-height:1.5715;line-height:inherit;list-style:none;margin:0;padding:0}.ant-select-tree-checkbox-wrapper:after{content:"\a0";display:inline-block;overflow:hidden;width:0}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type=checkbox]{height:14px;width:14px}.ant-select-tree-checkbox+span{padding-left:8px;padding-right:8px}.ant-select-tree-checkbox-group{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;display:inline-block;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-select-tree-checkbox-group-item{margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{background-color:#1890ff;border:0;content:" ";height:8px;left:50%;opacity:1;top:50%;transform:translate(-50%,-50%) scale(1);width:8px}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree-select-dropdown{padding:8px 4px}.ant-tree-select-dropdown-rtl{direction:rtl}.ant-tree-select-dropdown .ant-select-tree{border-radius:0}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner{align-items:stretch}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree{font-feature-settings:"tnum","tnum";background:#fff;border-radius:2px;box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0;transition:background-color .3s}.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused){background:#e6f7ff}.ant-select-tree-list-holder-inner{align-items:flex-start}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner{align-items:stretch}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging{position:relative}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging:after{animation:ant-tree-node-fx-do-not-use .3s;animation-fill-mode:forwards;animation-play-state:running;border:1px solid #1890ff;bottom:4px;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0}.ant-select-tree .ant-select-tree-treenode{align-items:flex-start;display:flex;outline:none;padding:0 0 4px}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover{background:#0000}.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper{background:#f5f5f5}.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title{color:inherit;font-weight:500}.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{line-height:24px;opacity:.2;text-align:center;transition:opacity .3s;visibility:visible;width:24px}.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{opacity:.45}.ant-select-tree-indent{align-self:stretch;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.ant-select-tree-indent-unit{display:inline-block;width:24px}.ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-switcher{align-self:stretch;cursor:pointer;flex:none;line-height:24px;margin:0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:24px}.ant-select-tree-switcher .ant-select-tree-switcher-icon,.ant-select-tree-switcher .ant-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:initial}.ant-select-tree-switcher .ant-select-tree-switcher-icon svg,.ant-select-tree-switcher .ant-tree-switcher-icon svg{transition:transform .3s}.ant-select-tree-switcher-noop{cursor:default}.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-select-tree-switcher-loading-icon{color:#1890ff}.ant-select-tree-switcher-leaf-line{display:inline-block;height:100%;position:relative;width:100%;z-index:1}.ant-select-tree-switcher-leaf-line:before{border-right:1px solid #d9d9d9;bottom:-4px;content:" ";margin-left:-1px;position:absolute;right:12px;top:0}.ant-select-tree-switcher-leaf-line:after{border-bottom:1px solid #d9d9d9;content:" ";height:14px;position:absolute;width:10px}.ant-select-tree-checkbox{margin:4px 8px 0 0;top:auto}.ant-select-tree .ant-select-tree-node-content-wrapper{background:#0000;border-radius:2px;color:inherit;cursor:pointer;line-height:24px;margin:0;min-height:24px;padding:0 4px;position:relative;transition:all .3s,border 0s,line-height 0s,box-shadow 0s;z-index:auto}.ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bae7ff}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle{display:inline-block;height:24px;line-height:24px;text-align:center;vertical-align:top;width:24px}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty{display:none}.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover{background-color:initial}.ant-select-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator{background-color:#1890ff;border-radius:1px;height:2px;pointer-events:none;position:absolute;z-index:1}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator:after{background-color:initial;border:2px solid #1890ff;border-radius:50%;content:"";height:8px;left:-6px;position:absolute;top:-3px;width:8px}.ant-select-tree .ant-select-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-select-tree-show-line .ant-select-tree-indent-unit{height:100%;position:relative}.ant-select-tree-show-line .ant-select-tree-indent-unit:before{border-right:1px solid #d9d9d9;bottom:-4px;content:"";position:absolute;right:12px;top:0}.ant-select-tree-show-line .ant-select-tree-indent-unit-end:before{display:none}.ant-select-tree-show-line .ant-select-tree-switcher{background:#fff}.ant-select-tree-show-line .ant-select-tree-switcher-line-icon{vertical-align:-.15em}.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line:before{bottom:auto!important;height:14px!important;top:auto!important}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon{transform:scaleY(-1)}.ant-typography{color:#000000d9;overflow-wrap:break-word}.ant-typography.ant-typography-secondary{color:#00000073}.ant-typography.ant-typography-success{color:#52c41a}.ant-typography.ant-typography-warning{color:#faad14}.ant-typography.ant-typography-danger{color:#ff4d4f}a.ant-typography.ant-typography-danger:active,a.ant-typography.ant-typography-danger:focus{color:#d9363e}a.ant-typography.ant-typography-danger:hover{color:#ff7875}.ant-typography.ant-typography-disabled{color:#00000040;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-typography p,div.ant-typography{margin-bottom:1em}.ant-typography h1,div.ant-typography-h1,div.ant-typography-h1>textarea,h1.ant-typography{color:#000000d9;font-size:38px;font-weight:600;line-height:1.23;margin-bottom:.5em}.ant-typography h2,div.ant-typography-h2,div.ant-typography-h2>textarea,h2.ant-typography{color:#000000d9;font-size:30px;font-weight:600;line-height:1.35;margin-bottom:.5em}.ant-typography h3,div.ant-typography-h3,div.ant-typography-h3>textarea,h3.ant-typography{color:#000000d9;font-size:24px;font-weight:600;line-height:1.35;margin-bottom:.5em}.ant-typography h4,div.ant-typography-h4,div.ant-typography-h4>textarea,h4.ant-typography{color:#000000d9;font-size:20px;font-weight:600;line-height:1.4;margin-bottom:.5em}.ant-typography h5,div.ant-typography-h5,div.ant-typography-h5>textarea,h5.ant-typography{color:#000000d9;font-size:16px;font-weight:600;line-height:1.5;margin-bottom:.5em}.ant-typography div+h1,.ant-typography div+h2,.ant-typography div+h3,.ant-typography div+h4,.ant-typography div+h5,.ant-typography h1+h1,.ant-typography h1+h2,.ant-typography h1+h3,.ant-typography h1+h4,.ant-typography h1+h5,.ant-typography h2+h1,.ant-typography h2+h2,.ant-typography h2+h3,.ant-typography h2+h4,.ant-typography h2+h5,.ant-typography h3+h1,.ant-typography h3+h2,.ant-typography h3+h3,.ant-typography h3+h4,.ant-typography h3+h5,.ant-typography h4+h1,.ant-typography h4+h2,.ant-typography h4+h3,.ant-typography h4+h4,.ant-typography h4+h5,.ant-typography h5+h1,.ant-typography h5+h2,.ant-typography h5+h3,.ant-typography h5+h4,.ant-typography h5+h5,.ant-typography li+h1,.ant-typography li+h2,.ant-typography li+h3,.ant-typography li+h4,.ant-typography li+h5,.ant-typography p+h1,.ant-typography p+h2,.ant-typography p+h3,.ant-typography p+h4,.ant-typography p+h5,.ant-typography ul+h1,.ant-typography ul+h2,.ant-typography ul+h3,.ant-typography ul+h4,.ant-typography ul+h5,.ant-typography+h1.ant-typography,.ant-typography+h2.ant-typography,.ant-typography+h3.ant-typography,.ant-typography+h4.ant-typography,.ant-typography+h5.ant-typography{margin-top:1.2em}a.ant-typography-ellipsis,span.ant-typography-ellipsis{display:inline-block;max-width:100%}.ant-typography a,a.ant-typography{color:#1890ff;cursor:pointer;outline:none;text-decoration:none;transition:color .3s}.ant-typography a:focus,.ant-typography a:hover,a.ant-typography:focus,a.ant-typography:hover{color:#40a9ff}.ant-typography a:active,a.ant-typography:active{color:#096dd9}.ant-typography a:active,.ant-typography a:hover,a.ant-typography:active,a.ant-typography:hover{text-decoration:none}.ant-typography a.ant-typography-disabled,.ant-typography a[disabled],a.ant-typography.ant-typography-disabled,a.ant-typography[disabled]{color:#00000040;cursor:not-allowed}.ant-typography a.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:hover,.ant-typography a[disabled]:active,.ant-typography a[disabled]:hover,a.ant-typography.ant-typography-disabled:active,a.ant-typography.ant-typography-disabled:hover,a.ant-typography[disabled]:active,a.ant-typography[disabled]:hover{color:#00000040}.ant-typography a.ant-typography-disabled:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,a.ant-typography[disabled]:active{pointer-events:none}.ant-typography code{background:#9696961a;border:1px solid #64646433;border-radius:3px;font-size:85%;margin:0 .2em;padding:.2em .4em .1em}.ant-typography kbd{background:#9696960f;border:solid #64646433;border-radius:3px;border-width:1px 1px 2px;font-size:90%;margin:0 .2em;padding:.15em .4em .1em}.ant-typography mark{background-color:#ffe58f;padding:0}.ant-typography ins,.ant-typography u{-webkit-text-decoration-skip:ink;text-decoration:underline;text-decoration-skip-ink:auto}.ant-typography del,.ant-typography s{text-decoration:line-through}.ant-typography strong{font-weight:600}.ant-typography-copy,.ant-typography-edit,.ant-typography-expand{color:#1890ff;cursor:pointer;margin-left:4px;outline:none;text-decoration:none;transition:color .3s}.ant-typography-copy:focus,.ant-typography-copy:hover,.ant-typography-edit:focus,.ant-typography-edit:hover,.ant-typography-expand:focus,.ant-typography-expand:hover{color:#40a9ff}.ant-typography-copy:active,.ant-typography-edit:active,.ant-typography-expand:active{color:#096dd9}.ant-typography-copy-success,.ant-typography-copy-success:focus,.ant-typography-copy-success:hover{color:#52c41a}.ant-typography-edit-content{position:relative}div.ant-typography-edit-content{left:-12px;margin-bottom:calc(1em - 5px);margin-top:-5px}.ant-typography-edit-content-confirm{bottom:8px;color:#00000073;font-size:14px;font-style:normal;font-weight:400;pointer-events:none;position:absolute;right:10px}.ant-typography-edit-content textarea{height:1em;margin:0!important;-moz-transition:none}.ant-typography ol,.ant-typography ul{margin:0 0 1em;padding:0}.ant-typography ol li,.ant-typography ul li{margin:0 0 0 20px;padding:0 0 0 4px}.ant-typography ul{list-style-type:circle}.ant-typography ul ul{list-style-type:disc}.ant-typography ol{list-style-type:decimal}.ant-typography blockquote,.ant-typography pre{margin:1em 0}.ant-typography pre{word-wrap:break-word;background:#9696961a;border:1px solid #64646433;border-radius:3px;padding:.4em .6em;white-space:pre-wrap}.ant-typography pre code{background:#0000;border:0;display:inline;font-family:inherit;font-size:inherit;margin:0;padding:0}.ant-typography blockquote{border-left:4px solid #64646433;opacity:.85;padding:0 0 0 .6em}.ant-typography-single-line{white-space:nowrap}.ant-typography-ellipsis-single-line{overflow:hidden;text-overflow:ellipsis}a.ant-typography-ellipsis-single-line,span.ant-typography-ellipsis-single-line{vertical-align:bottom}.ant-typography-ellipsis-multiple-line{-webkit-line-clamp:3; - /*! autoprefixer: ignore next */-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ant-typography-rtl{direction:rtl}.ant-typography-rtl .ant-typography-copy,.ant-typography-rtl .ant-typography-edit,.ant-typography-rtl .ant-typography-expand{margin-left:0;margin-right:4px}.ant-typography-rtl .ant-typography-expand{float:left}div.ant-typography-edit-content.ant-typography-rtl{left:auto;right:-12px}.ant-typography-rtl .ant-typography-edit-content-confirm{left:10px;right:auto}.ant-typography-rtl.ant-typography ol li,.ant-typography-rtl.ant-typography ul li{margin:0 20px 0 0;padding:0 4px 0 0}.ant-upload{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;outline:0;padding:0}.ant-upload p{margin:0}.ant-upload-btn{display:block;outline:none;width:100%}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-disabled{color:#00000040;cursor:not-allowed}.ant-upload.ant-upload-select-picture-card{background-color:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;height:104px;margin-bottom:8px;margin-right:8px;text-align:center;transition:border-color .3s;vertical-align:top;width:104px}.ant-upload.ant-upload-select-picture-card>.ant-upload{align-items:center;display:flex;height:100%;justify-content:center;text-align:center}.ant-upload.ant-upload-select-picture-card:hover{border-color:#1890ff}.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover{border-color:#d9d9d9}.ant-upload.ant-upload-drag{background:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;height:100%;position:relative;text-align:center;transition:border-color .3s;width:100%}.ant-upload.ant-upload-drag .ant-upload{padding:16px 0}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border-color:#096dd9}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{margin-bottom:20px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{color:#40a9ff;font-size:48px}.ant-upload.ant-upload-drag p.ant-upload-text{color:#000000d9;font-size:16px;margin:0 0 4px}.ant-upload.ant-upload-drag p.ant-upload-hint{color:#00000073;font-size:14px}.ant-upload.ant-upload-drag .anticon-plus{color:#00000040;font-size:30px;transition:all .3s}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:#00000073}.ant-upload-picture-card-wrapper{display:inline-block;width:100%}.ant-upload-picture-card-wrapper:before{content:"";display:table}.ant-upload-picture-card-wrapper:after{clear:both;content:"";display:table}.ant-upload-list{font-feature-settings:"tnum","tnum";box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;margin:0;padding:0}.ant-upload-list:after,.ant-upload-list:before{content:"";display:table}.ant-upload-list:after{clear:both}.ant-upload-list-item{font-size:14px;height:22.001px;margin-top:8px;position:relative}.ant-upload-list-item-name{display:inline-block;line-height:1.5715;overflow:hidden;padding-left:22px;text-overflow:ellipsis;white-space:nowrap;width:100%}.ant-upload-list-item-card-actions{position:absolute;right:0}.ant-upload-list-item-card-actions-btn{opacity:0}.ant-upload-list-item-card-actions-btn.ant-btn-sm{height:22.001px;line-height:1;vertical-align:top}.ant-upload-list-item-card-actions.picture{line-height:0;top:22px}.ant-upload-list-item-card-actions-btn:focus,.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-card-actions .anticon{color:#00000073;transition:all .3s}.ant-upload-list-item-card-actions:hover .anticon{color:#000000d9}.ant-upload-list-item-info{height:100%;transition:background-color .3s}.ant-upload-list-item-info>span{display:block;height:100%;width:100%}.ant-upload-list-item-info .ant-upload-text-icon .anticon,.ant-upload-list-item-info .anticon-loading .anticon{color:#00000073;font-size:14px;position:absolute;top:5px}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#f5f5f5}.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon,.ant-upload-list-item-error .ant-upload-list-item-name,.ant-upload-list-item-error .ant-upload-text-icon>.anticon{color:#ff4d4f}.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-progress{bottom:-12px;font-size:14px;line-height:0;padding-left:26px;position:absolute;width:100%}.ant-upload-list-picture .ant-upload-list-item,.ant-upload-list-picture-card .ant-upload-list-item{border:1px solid #d9d9d9;border-radius:2px;height:66px;padding:8px;position:relative}.ant-upload-list-picture .ant-upload-list-item:hover,.ant-upload-list-picture-card .ant-upload-list-item:hover{background:#0000}.ant-upload-list-picture .ant-upload-list-item-error,.ant-upload-list-picture-card .ant-upload-list-item-error{border-color:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info{background:#0000}.ant-upload-list-picture .ant-upload-list-item-uploading,.ant-upload-list-picture-card .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{height:48px;line-height:60px;opacity:.8;text-align:center;width:48px}.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"]{fill:#fff2f0}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"]{fill:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-picture-card .ant-upload-list-item-icon{font-size:26px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.ant-upload-list-picture .ant-upload-list-item-icon .anticon,.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-image,.ant-upload-list-picture-card .ant-upload-list-item-image{max-width:100%}.ant-upload-list-picture .ant-upload-list-item-thumbnail img,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;height:48px;overflow:hidden;width:48px}.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-name{box-sizing:border-box;display:inline-block;line-height:44px;margin:0 0 0 8px;max-width:100%;overflow:hidden;padding-left:48px;padding-right:8px;text-overflow:ellipsis;transition:all .3s;white-space:nowrap}.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name{margin-bottom:12px}.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:14px;margin-top:0;padding-left:56px;width:calc(100% - 24px)}.ant-upload-list-picture-card-container{display:inline-block;height:104px;margin:0 8px 8px 0;vertical-align:top;width:104px}.ant-upload-list-picture-card .ant-upload-list-item{height:100%;margin:0}.ant-upload-list-picture-card .ant-upload-list-item-info{height:100%;overflow:hidden;position:relative}.ant-upload-list-picture-card .ant-upload-list-item-info:before{background-color:#00000080;content:" ";height:100%;opacity:0;position:absolute;transition:all .3s;width:100%;z-index:1}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .3s;white-space:nowrap;z-index:10}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye{color:#ffffffd9;cursor:pointer;font-size:16px;margin:0 4px;transition:all .3s;width:16px;z-index:10}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-actions:hover,.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;height:100%;-o-object-fit:contain;object-fit:contain;position:static;width:100%}.ant-upload-list-picture-card .ant-upload-list-item-name{display:none;line-height:1.5715;margin:8px 0 0;padding:0;text-align:center}.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{bottom:10px;display:block;position:absolute}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fafafa}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before{display:none}.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:32px;padding-left:0;width:calc(100% - 14px)}.ant-upload-list-picture-container,.ant-upload-list-text-container{transition:opacity .3s,height .3s}.ant-upload-list-picture-container:before,.ant-upload-list-text-container:before{content:"";display:table;height:0;width:0}.ant-upload-list-picture-container .ant-upload-span,.ant-upload-list-text-container .ant-upload-span{display:block;flex:auto}.ant-upload-list-picture .ant-upload-span,.ant-upload-list-text .ant-upload-span{align-items:center;display:flex}.ant-upload-list-picture .ant-upload-span>*,.ant-upload-list-text .ant-upload-span>*{flex:none}.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-text .ant-upload-list-item-name{flex:auto;margin:0;padding:0 8px}.ant-upload-list-picture .ant-upload-list-item-card-actions,.ant-upload-list-text .ant-upload-list-item-card-actions,.ant-upload-list-text .ant-upload-text-icon .anticon{position:static}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave{animation-duration:.3s;animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter{animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{animation-name:uploadAnimateInlineOut}@keyframes uploadAnimateInlineIn{0%{height:0;margin:0;opacity:0;padding:0;width:0}}@keyframes uploadAnimateInlineOut{to{height:0;margin:0;opacity:0;padding:0;width:0}}.ant-upload-rtl{direction:rtl}.ant-upload-rtl.ant-upload.ant-upload-select-picture-card{margin-left:8px;margin-right:auto}.ant-upload-list-rtl{direction:rtl}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1{padding-left:14px;padding-right:22px}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2{padding-left:28px;padding-right:22px}.ant-upload-list-rtl .ant-upload-list-item-name{padding-left:0;padding-right:22px}.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1{padding-left:14px}.ant-upload-list-rtl .ant-upload-list-item-card-actions{left:0;right:auto}.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon{padding-left:5px;padding-right:0}.ant-upload-list-rtl .ant-upload-list-item-info{padding:0 4px 0 12px}.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon{padding-left:5px;padding-right:0}.ant-upload-list-rtl .ant-upload-list-item-progress{padding-left:0;padding-right:26px}.ant-upload-list-picture .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item-info{padding:0}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{left:auto;right:8px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon{left:auto;right:50%;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name{margin:0 8px 0 0;padding-left:8px;padding-right:48px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1{padding-left:18px;padding-right:48px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2{padding-left:36px;padding-right:48px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress{padding-left:0;padding-right:0}.ant-upload-list-rtl .ant-upload-list-picture-card-container{margin:0 0 8px 8px}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions{left:auto;right:50%;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{margin:8px 0 0;padding:0}.cy-context-menus-cxt-menu{border:1px solid #a0a0a0;display:none;margin:0;padding:0;position:absolute;width:auto;z-index:1000}.cy-context-menus-cxt-menuitem{background-color:#f8f8f8;border:0;display:block;font-size:12px;font-weight:400;margin:0;padding:3px 20px;position:relative;text-align:left;white-space:nowrap;width:100%}.cy-context-menus-cxt-menuitem:enabled{color:#000}.cy-context-menus-ctx-operation:focus{outline:none}.cy-context-menus-cxt-menuitem:hover{background-color:#0b9bcd;background-image:none;color:#fff;cursor:pointer;text-decoration:none}.cy-context-menus-cxt-menuitem[content]:before{content:attr(content)}.cy-context-menus-divider{border-bottom:1px solid #a0a0a0}.cy-context-menus-submenu-indicator{position:absolute;right:2px;top:50%;transform:translateY(-50%)}.cy-container{background:#fafafa radial-gradient(#dcdcdc 1px,#0000 0);background-size:18px 18px;height:100%;margin:auto;width:100%}.cy-container,.node-core{position:relative}.icon{background-position:50%;background-repeat:no-repeat;background-size:12px 12px;border:3px solid #fff;border-radius:50%;display:block;height:24px;left:-6px;position:absolute;top:-4px;width:24px}.icon,.icon:hover{background-color:#ffc18e}.icon-table{background-image:url(/static/media/db-icon.9befcb0d4eeb44fd922f.svg)}.icon-fn{background-image:url(/static/media/fn-icon.947c4ec9c8f529970e90.svg)}.name{padding-top:6px}.indexes,.name{text-align:center}.indexes{color:#2c3333;font-size:10px;font-style:italic}.store{background:#fbdcb9}.store,.transform-type{border-radius:5px;bottom:-5px;font-size:8px;left:50%;padding:0 10px;position:absolute;transform:translate(-50%)}.transform-type{background:#beddcd}.custom-menu-item{background-color:#fafafa!important;border:none!important;box-shadow:none!important;color:#000000de!important;font-size:13px!important;font-weight:400!important;height:32px!important;padding-left:24px!important;text-align:left!important;width:170px!important}.custom-menu-item:hover{background-color:#c8c8c8!important}.custom-context-menu{background-color:#fafafa!important;border:none!important;box-shadow:0 0 8px 0 #0000001f,0 8px 8px 0 #0000003d!important;padding-bottom:8px!important;padding-top:8px!important}.dragger{border-left:1px dashed #e1e1e1;bottom:0;cursor:col-resize;left:0;position:absolute;top:0;width:5px}.drag-badge{background:#e1e1e1;border:3px solid #fff;border-radius:50%;font-size:8px;height:16px;left:-6px;top:50%;width:16px}.drag-badge,.spin{align-items:center;display:flex;justify-content:center;position:absolute}.spin{height:100%;transform:scale(1.5);width:100%;z-index:1}.pipeline-btn{left:8px;position:absolute;top:8px;z-index:100} -/*# sourceMappingURL=main.ef52a49f.css.map*/ \ No newline at end of file diff --git a/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css.map b/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css.map deleted file mode 100644 index affb87032..000000000 --- a/libs/datapipe-app/datapipe_app/frontend/static/css/main.ef52a49f.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/main.ef52a49f.css","mappings":"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Zq7BJ,CYj7BI,mEACE,cZo7BN,CC97BC,yBWcG,uDZm7BJ,CCj8BC,0DMMC,uBACA,wBAAyB,CAavB,2BPw7BJ,CC58BC,0FMwBG,2BACA,4BPw7BJ,CCj9BC,4CM4BG,4BACA,4BAA6B,CAC7B,mBPw7BJ,CCt9BC,uCWOG,sDADA,SAAU,CADV,kBZu9BJ,CYn9BI,uDACE,cZs9BN,CCh+BC,mBWcG,uDZq9BJ,CCn+BC,gEMMC,uBACA,wBAAyB,CAavB,2BP09BJ,CC9+BC,kGMwBG,6BACA,4BP09BJ,CCn/BC,gDM4BG,8BACA,4BAA6B,CAC7B,mBP09BJ,CCx/BC,2CWOG,sDADA,SAAU,CADV,kBZy/BJ,CYr/BI,2DACE,cZw/BN,CClgCC,qBWcG,uDZu/BJ,CCrgCC,gEMMC,uBACA,wBAAyB,CAavB,2BP4/BJ,CChhCC,kGMwBG,6BACA,4BP4/BJ,CCrhCC,gDM4BG,8BACA,4BAA6B,CAC7B,mBP4/BJ,CC1hCC,2CWOG,sDADA,SAAU,CADV,kBZ2hCJ,CYvhCI,2DACE,cZ0hCN,CCpiCC,qBWcG,uDZyhCJ,CCviCC,mEMMC,uBACA,wBAAyB,CAavB,2BP8hCJ,CCljCC,sGMwBG,8BACA,4BP8hCJ,CCvjCC,kDM4BG,+BACA,4BAA6B,CAC7B,mBP8hCJ,CC5jCC,6CWOG,sDADA,SAAU,CADV,kBZ6jCJ,CYzjCI,6DACE,cZ4jCN,CCtkCC,sBWcG,uDZ2jCJ,CY3iCA,qBACE,GAEE,SAAU,CADV,mBZ8iCF,CY1iCA,GAEE,SAAU,CADV,kBZ6iCF,CACF,CYziCA,sBACE,GACE,kBZ2iCF,CYxiCA,GAEE,SAAU,CADV,mBZ2iCF,CACF,CYviCA,wBACE,GAEE,SAAU,CADV,mBZ0iCF,CYtiCA,GAEE,SAAU,CADV,kBZyiCF,CACF,CYriCA,yBACE,GACE,kBZuiCF,CYpiCA,GAEE,SAAU,CADV,mBZuiCF,CACF,CYniCA,uBACE,GAGE,SAAU,CAFV,mBAAqB,CACrB,sBZsiCF,CYliCA,GACE,kBAAmB,CACnB,sBZoiCF,CACF,CYjiCA,wBACE,GACE,kBAAmB,CACnB,sBZmiCF,CYhiCA,GAGE,SAA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BDyFR,CCrFM,wDACE,oBAAqB,CACrB,iBACA,eAAgB,CAEhB,sBAAuB,CADvB,eDwFR,CCpFM,uDnB9FJ,iCAAkC,CAClC,kCAAmC,CACnC,iCAAkC,CARlC,cmBuGM,gBAIA,cAAe,CALf,oBAAqB,CAGrB,cAAe,CnBxGrB,iBAAkB,CmBuGZ,eAAiB,CnBtGvB,aAAc,CmBwGR,mBAAoB,CnBvG1B,iBAAkB,CAClB,mBAAoB,CACpB,sBkBoMF,CCrGM,yDnBzFF,akBiMJ,CCxGM,2DnBrFF,oBkBgMJ,ClB7LE,8DACE,YkB+LJ,ClB5LE,mHACE,akB8LJ,CCjHM,gEAUI,qBD0GV,CCvGQ,6DACE,eDyGV,CC5LE,0HA2FM,qBDoGR,CC/LE,kDAkGI,wBADA,cAAe,CADf,iBDoGN,CChGM,iHAGE,yKADA,YAEA,iBACA,kBDkGR,CC/FM,wDAEE,eAAgB,CADhB,UDkGR,CC9FM,yDAGE,MAAO,CAFP,iBAAkB,CAClB,KAAM,CAIN,iBAAkB,CADlB,eAAgB,CADhB,WDkGR,CCvNE,uDAgII,UAHA,iBAAkB,CAElB,WADA,OAAQ,CAGR,0BAA2B,CAC3B,kBD6FN,CFhQC,8DGgLS,gBDmFV,CFnQC,8DGqLS,gBDkFV,CFvQC,gEGyLS,YACA,gBDiFV,CC/EU,6IAEE,YACA,gBDiFZ,CFhRC,8DGgLS,gBDmGV,CFnRC,8DGoLS,YACA,gBDkGV,CFvRC,gEGyLS,YACA,gBDiGV,CC/FU,6IAEE,YACA,gBDiGZ,CFhSC,qEG2MO,QDwFR,CFnSC,gEG+MO,uBDuFR,CFtSC,8DGoNO,YACA,gBDqFR,CF1SC,uDG2NG,YDkFJ,CF7SC,oHIaK,sBACA,8BFmSN,CFjTC,2QKsBG,qBAUF,uBAPE,+BAQF,SHuRF,CFxTC,sHIaK,sBACA,8BF8SN,CF5TC,+QKsBG,qBAUF,uBAPE,+BAQF,SHkSF,CFnUC,qRIuCO,UFkSR,CFzUC,iWI2CO,kBFoSR,CF/UC,YNSC,oCARA,qBAAsB,CAGtB,gBQmEA,cAAe,CADf,oBAAqB,CRjErB,eACA,0BACA,mBACA,eAAgB,CANhB,QAAS,CACT,SAAU,CQkEV,iBAyRF,CArRE,kEA5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DtwBC,gQ4D0eO,+BACA,0BAFA,SFoSR,CE5RE,wCAEI,gBF6RN,C1DhxBC,4M4D2fO,0BF0RR,CEtRI,8BAEI,yBFuRR,CEpRM,oCACE,kBFsRR,CEnRM,oFAEE,kBFqRR,C1D/xBC,8H4D6gBS,eFsRV,C1DnyBC,4L4DihBS,iBFsRV,CE/RM,kIAaI,UFsRV,CE/QE,wCAEI,gBFgRN,CElRE,2CAMI,WF+QN,CErRE,8CASM,UF+QR,CEzQE,2BACE,YF2QJ,CE5QE,kDAII,6BF2QN,CE/QE,oGASI,sBF0QN,CEtQI,kHAGI,UFuQR,CErQQ,gIACE,SFwQV,CEjQE,uBAEE,cAAe,CADf,UFoQJ,CErQE,2CAKI,YAAa,CACb,SAAU,CACV,YFmQN,CEhQI,8BACE,aAAc,CAMd,eAAgB,CAJhB,QAAS,CAET,iBAAkB,CADlB,SAAU,CAEV,eAAgB,CAEhB,0BANA,UFwQN,CEhQM,oCAGE,UAAW,CAFX,aAAc,CACd,YFmQR,C1D91BC,+D4D8lBS,YFmQV,CE9PM,gDACE,6BFgQR,CE7PM,qCACE,oBF+PR,CE5PM,oCACE,eF8PR,CE3RI,iCAiCI,QAAS,CACT,SF6PR,C1D92BC,8F4D4nBW,eAAgB,CAFhB,gBAGA,cAAe,CARf,aAAc,CAEd,YAIA,iBAHA,QAAS,CACT,mBAKA,0BARA,UFoQZ,CE1PY,oGACE,kBF4Pd,CExPU,uGAEI,kBFyPd,CErPU,uGAGI,gBAAuB,CADvB,gBAEA,kBFsPd,CEzOA,wTAKM,cF2ON,CG34BE,gBACE,aH64BJ,C1D/4BC,mC6DQK,aAAc,CADd,gBH44BN,C1Dn5BC,kC6DeK,MAAO,CADP,UHy4BN,C1Dv5BC,sC6DqBK,wBHq4BN,C1D15BC,uE6D+BW,aAAc,CADd,gBHg4BZ,C1D95BC,mD6D4CO,UADA,UHu3BR,C1Dl6BC,wD6DoDO,aAAc,CADd,iBHm3BR,C1Dt6BC,yE6D2DS,gBH82BV,C1Dz6BC,4C6DoEK,gBHw2BN,C1D56BC,2D6DyEO,UAAW,CAEX,aAAc,CADd,gBHu2BR,CG/1BI,sBACE,aHi2BN,C1Dp7BC,8F6D0FK,wBH81BN,C1Dx7BC,8F6DiGK,wBH21BN,C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ANhB,QAAS,CACT,SmEoJF,CHMI,4BAIE,aAAc,CAHd,oBAAqB,CAErB,eAAgB,CADhB,OGFN,CjF7JC,oD8EqKK,kBGLN,CHQI,4CACE,eGNN,CHSI,6EAGI,WAAY,CADZ,UGPR,CjFvKC,mB8EsLG,gBAAiB,CADjB,iBGVJ,CjF3KC,oBcSC,oCARA,qBAAsB,CAGtB,gBgEuLE,oBAAqB,ChEtLvB,eACA,0BACA,mBACA,eAAgB,CANhB,QAAS,CACT,SmEoLF,CHMI,yBACE,gBGJN,CHMM,oCACE,cGJR,CHQI,kDACE,aGNN,CjFhMC,gD8E6MK,sBACA,oBGVN,CjFpMC,sD8EwNK,yBACA,QAAS,CAGT,WAAY,CALZ,WAFA,QAAS,CAMT,SAAU,CAPV,OAAQ,CAMR,uCAAyC,CAJzC,SGPN,CjF/MC,4E8EgOK,2BACA,sBGdN,CjFnNC,kBkFIG,aDkNJ,CjFtNC,iDkFWO,gBADA,cDgNR,CjF1NC,4DkFgBS,uBD6MV,CjF7NC,0EkFuBO,eDyMR,CjFhOC,SmFOC,kBAAF,CAEE,wCAHA,YAKF,CAIE,iBACE,gBAFJ,CnFdC,emFsBC,0BALF,CnFjBC,gBmF2BC,sBAPF,CnFpBC,amFgCC,wBATF,CnFvBC,uBmFqCC,6BAXF,CnF1BC,sBmF0CC,4BAbF,CnF7BC,sBmF+CC,4BAfF,CnFhCC,amFoDC,sBAjBF,CnFnCC,gBmFyDC,kBAnBF,CnFtCC,gBmF8DC,oBArBF,CnFzCC,SmFmEC,cAAe,CAEf,cAAe,CAHf,iBApBF,CnF9CC,YoFUG,aAAc,CACd,cACA,cDuCJ,CnFnDC,iBoFeG,SDuCJ,CnFtDC,iBoFkBG,UDuCJ,CnFzDC,mBoFqBG,gBDuCJ,CnF5DC,kBoFwBG,QDuCJ,CnF/DC,YoFUG,aAAc,CACd,sBACA,sBDwDJ,CnFpEC,iBoFeG,iBDwDJ,CnFvEC,iBoFkBG,kBDwDJ,CnF1EC,mBoFqBG,wBDwDJ,CnF7EC,kBoFwBG,QDwDJ,CnFhFC,YoFUG,aAAc,CACd,sBACA,sBDyEJ,CnFrFC,iBoFeG,iBDyEJ,CnFxFC,iBoFkBG,kBDyEJ,CnF3FC,mBoFqBG,wBDyEJ,CnF9FC,kBoFwBG,QDyEJ,CnFjGC,YoFUG,aAAc,CACd,eACA,eD0FJ,CnFtGC,iBoFeG,UD0FJ,CnFzGC,iBoFkBG,WD0FJ,CnF5GC,mBoFqBG,iBD0FJ,CnF/GC,kBoFwBG,QD0FJ,CnFlHC,YoFUG,aAAc,CACd,sBACA,sBD2GJ,CnFvHC,iBoFeG,iBD2GJ,CnF1HC,iBoFkBG,kBD2GJ,CnF7HC,mBoFqBG,wBD2GJ,CnFhIC,kBoFwBG,QD2GJ,CnFnIC,YoFUG,aAAc,CACd,sBACA,sBD4HJ,CnFxIC,iBoFeG,iBD4HJ,CnF3IC,iBoFkBG,kBD4HJ,CnF9IC,mBoFqBG,wBD4HJ,CnFjJC,kBoFwBG,QD4HJ,CnFpJC,YoFUG,aAAc,CACd,aACA,aD6IJ,CnFzJC,iBoFeG,QD6IJ,CnF5JC,iBoFkBG,SD6IJ,CnF/JC,mBoFqBG,eD6IJ,CnFlKC,kBoFwBG,QD6IJ,CnFrKC,YoFUG,aAAc,CACd,sBACA,sBD8JJ,CnF1KC,iBoFeG,iBD8JJ,CnF7KC,iBoFkBG,kBD8JJ,CnFhLC,mBoFqBG,wBD8JJ,CnFnLC,kBoFwBG,QD8JJ,CnFtLC,YoFUG,aAAc,CACd,sBACA,sBD+KJ,CnF3LC,iBoFeG,iBD+KJ,CnF9LC,iBoFkBG,kBD+KJ,CnFjMC,mBoFqBG,wBD+KJ,CnFpMC,kBoFwBG,QD+KJ,CnFvMC,YoFUG,aAAc,CACd,eACA,eDgMJ,CnF5MC,iBoFeG,UDgMJ,CnF/MC,iBoFkBG,WDgMJ,CnFlNC,mBoFqBG,iBDgMJ,CnFrNC,kBoFwBG,QDgMJ,CnFxNC,YoFUG,aAAc,CACd,sBACA,sBDiNJ,CnF7NC,iBoFeG,iBDiNJ,CnFhOC,iBoFkBG,kBDiNJ,CnFnOC,mBoFqBG,wBDiNJ,CnFtOC,kBoFwBG,QDiNJ,CnFzOC,YoFUG,aAAc,CACd,sBACA,sBDkOJ,CnF9OC,iBoFeG,iBDkOJ,CnFjPC,iBoFkBG,kBDkOJ,CnFpPC,mBoFqBG,wBDkOJ,CnFvPC,kBoFwBG,QDkOJ,CnF1PC,YoFUG,aAAc,CACd,aACA,aDmPJ,CnF/PC,iBoFeG,QDmPJ,CnFlQC,iBoFkBG,SDmPJ,CnFrQC,mBoFqBG,eDmPJ,CnFxQC,kBoFwBG,QDmPJ,CnF3QC,YoFUG,aAAc,CACd,sBACA,sBDoQJ,CnFhRC,iBoFeG,iBDoQJ,CnFnRC,iBoFkBG,kBDoQJ,CnFtRC,mBoFqBG,wBDoQJ,CnFzRC,kBoFwBG,QDoQJ,CnF5RC,YoFUG,aAAc,CACd,sBACA,sBDqRJ,CnFjSC,iBoFeG,iBDqRJ,CnFpSC,iBoFkBG,kBDqRJ,CnFvSC,mBoFqBG,wBDqRJ,CnF1SC,kBoFwBG,QDqRJ,CnF7SC,WoFUG,aAAc,CACd,eACA,eDsSJ,CnFlTC,gBoFeG,UDsSJ,CnFrTC,gBoFkBG,WDsSJ,CnFxTC,kBoFqBG,iBDsSJ,CnF3TC,iBoFwBG,ODsSJ,CnF9TC,WoFUG,aAAc,CACd,sBACA,sBDuTJ,CnFnUC,gBoFeG,iBDuTJ,CnFtUC,gBoFkBG,kBDuTJ,CnFzUC,kBoFqBG,wBDuTJ,CnF5UC,iBoFwBG,ODuTJ,CnF/UC,WoFUG,aAAc,CACd,sBACA,sBDwUJ,CnFpVC,gBoFeG,iBDwUJ,CnFvVC,gBoFkBG,kBDwUJ,CnF1VC,kBoFqBG,wBDwUJ,CnF7VC,iBoFwBG,ODwUJ,CnFhWC,WoFUG,aAAc,CACd,aACA,aDyVJ,CnFrWC,gBoFeG,QDyVJ,CnFxWC,gBoFkBG,SDyVJ,CnF3WC,kBoFqBG,eDyVJ,CnF9WC,iBoFwBG,ODyVJ,CnFjXC,WoFUG,aAAc,CACd,sBACA,sBD0WJ,CnFtXC,gBoFeG,iBD0WJ,CnFzXC,gBoFkBG,kBD0WJ,CnF5XC,kBoFqBG,wBD0WJ,CnF/XC,iBoFwBG,OD0WJ,CnFlYC,WoFUG,aAAc,CACd,sBACA,sBD2XJ,CnFvYC,gBoFeG,iBD2XJ,CnF1YC,gBoFkBG,kBD2XJ,CnF7YC,kBoFqBG,wBD2XJ,CnFhZC,iBoFwBG,OD2XJ,CnFnZC,WoFUG,aAAc,CACd,eACA,eD4YJ,CnFxZC,gBoFeG,UD4YJ,CnF3ZC,gBoFkBG,WD4YJ,CnF9ZC,kBoFqBG,iBD4YJ,CnFjaC,iBoFwBG,OD4YJ,CnFpaC,WoFUG,aAAc,CACd,qBACA,qBD6ZJ,CnFzaC,gBoFeG,gBD6ZJ,CnF5aC,gBoFkBG,iBD6ZJ,CnF/aC,kBoFqBG,uBD6ZJ,CnFlbC,iBoFwBG,OD6ZJ,CnFrbC,WoFUG,aAAc,CACd,qBACA,qBD8aJ,CnF1bC,gBoFeG,gBD8aJ,CnF7bC,gBoFkBG,iBD8aJ,CnFhcC,kBoFqBG,uBD8aJ,CnFncC,iBoFwBG,OD8aJ,CnFtcC,WoF+BG,YD0aJ,CnFzcC,kBoF8CG,aD0aJ,CnFxdC,iBoFiDG,OD0aJ,CnF3dC,8BqFiEK,cFyaN,CnF1eC,4BqFgBK,SAAU,CADV,iBF+dN,CnF9eC,4BqFwBK,iBADA,UF2dN,CnFlfC,8BqFgCK,aAAc,CADd,wBFudN,CnFtfC,4BqFgBK,SAAU,CADV,iBF2eN,CnF1fC,4BqFwBK,iBADA,UFueN,CnF9fC,8BqFgCK,aAAc,CADd,wBFmeN,CnFlgBC,4BqFgBK,SAAU,CADV,WFufN,CnFtgBC,4BqFwBK,WADA,UFmfN,CnF1gBC,8BqFgCK,aAAc,CADd,kBF+eN,CnF9gBC,4BqFgBK,SAAU,CADV,kBFmgBN,CnFlhBC,4BqFwBK,kBADA,UF+fN,CnFthBC,8BqFgCK,aAAc,CADd,yBF2fN,CnF1hBC,4BqFgBK,SAAU,CADV,kBF+gBN,CnF9hBC,4BqFwBK,kBADA,UF2gBN,CnFliBC,8BqFgCK,aAAc,CADd,yBFugBN,CnFtiBC,4BqFgBK,SAAU,CADV,SF2hBN,CnF1iBC,4BqFwBK,SADA,UFuhBN,CnF9iBC,8BqFgCK,aAAc,CADd,gBFmhBN,CnFljBC,4BqFgBK,SAAU,CADV,kBFuiBN,CnFtjBC,4BqFwBK,kBADA,UFmiBN,CnF1jBC,8BqFgCK,aAAc,CADd,yBF+hBN,CnF9jBC,4BqFgBK,SAAU,CADV,kBFmjBN,CnFlkBC,4BqFwBK,kBADA,UF+iBN,CnFtkBC,8BqFgCK,aAAc,CADd,yBF2iBN,CnF1kBC,4BqFgBK,SAAU,CADV,WF+jBN,CnF9kBC,4BqFwBK,WADA,UF2jBN,CnFllBC,8BqFgCK,aAAc,CADd,kBFujBN,CnFtlBC,6BqFgBK,SAAU,CADV,kBF2kBN,CnF1lBC,6BqFwBK,kBADA,UFukBN,CnF9lBC,+BqFgCK,aAAc,CADd,yBFmkBN,CnFlmBC,6BqFgBK,SAAU,CADV,kBFulBN,CnFtmBC,6BqFwBK,kBADA,UFmlBN,CnF1mBC,+BqFgCK,aAAc,CADd,yBF+kBN,CnF9mBC,6BqFgBK,SAAU,CADV,SFmmBN,CnFlnBC,6BqFwBK,SADA,UF+lBN,CnFtnBC,+BqFgCK,aAAc,CADd,gBF2lBN,CnF1nBC,6BqFgBK,SAAU,CADV,kBF+mBN,CnF9nBC,6BqFwBK,kBADA,UF2mBN,CnFloBC,+BqFgCK,aAAc,CADd,yBFumBN,CnFtoBC,6BqFgBK,SAAU,CADV,kBF2nBN,CnF1oBC,6BqFwBK,kBADA,UFunBN,CnF9oBC,+BqFgCK,aAAc,CADd,yBFmnBN,CnFlpBC,6BqFgBK,SAAU,CADV,WFuoBN,CnFtpBC,6BqFwBK,WADA,UFmoBN,CnF1pBC,+BqFgCK,aAAc,CADd,kBF+nBN,CnF9pBC,6BqFgBK,SAAU,CADV,kBFmpBN,CnFlqBC,6BqFwBK,kBADA,UF+oBN,CnFtqBC,+BqFgCK,aAAc,CADd,yBF2oBN,CnF1qBC,6BqFgBK,SAAU,CADV,kBF+pBN,CnF9qBC,6BqFwBK,kBADA,UF2pBN,CnFlrBC,+BqFgCK,aAAc,CADd,yBFupBN,CnFtrBC,6BqFgBK,SAAU,CADV,SF2qBN,CnF1rBC,6BqFwBK,SADA,UFuqBN,CnF9rBC,+BqFgCK,aAAc,CADd,gBFmqBN,CnFlsBC,6BqFgBK,SAAU,CADV,kBFurBN,CnFtsBC,6BqFwBK,kBADA,UFmrBN,CnF1sBC,+BqFgCK,aAAc,CADd,yBF+qBN,CnF9sBC,6BqFgBK,SAAU,CADV,kBFmsBN,CnFltBC,6BqFwBK,kBADA,UF+rBN,CnFttBC,+BqFgCK,aAAc,CADd,yBF2rBN,CnF1tBC,6BqFgBK,SAAU,CADV,WF+sBN,CnF9tBC,6BqFwBK,WADA,UF2sBN,CnFluBC,+BqFgCK,aAAc,CADd,kBFusBN,CnFtuBC,6BqFgBK,SAAU,CADV,kBF2tBN,CnF1uBC,6BqFwBK,kBADA,UFutBN,CnF9uBC,+BqFgCK,aAAc,CADd,yBFmtBN,CnFlvBC,6BqFgBK,SAAU,CADV,kBFuuBN,CnFtvBC,6BqFwBK,kBADA,UFmuBN,CnF1vBC,+BqFgCK,aAAc,CADd,yBF+tBN,CnF9vBC,6BqFgBK,SAAU,CADV,UFmvBN,CnFlwBC,6BqFwBK,UADA,UF+uBN,CnFtwBC,+BqFgCK,aAAc,CADd,iBF2uBN,CnF1wBC,eoFUG,aAAc,CACd,cACA,cDmwBJ,CnF/wBC,oBoFeG,SDmwBJ,CnFlxBC,oBoFkBG,UDmwBJ,CnFrxBC,sBoFqBG,gBDmwBJ,CnFxxBC,qBoFwBG,QDmwBJ,CnF3xBC,eoFUG,aAAc,CACd,sBACA,sBDoxBJ,CnFhyBC,oBoFeG,iBDoxBJ,CnFnyBC,oBoFkBG,kBDoxBJ,CnFtyBC,sBoFqBG,wBDoxBJ,CnFzyBC,qBoFwBG,QDoxBJ,CnF5yBC,eoFUG,aAAc,CACd,sBACA,sBDqyBJ,CnFjzBC,oBoFeG,iBDqyBJ,CnFpzBC,oBoFkBG,kBDqyBJ,CnFvzBC,sBoFqBG,wBDqyBJ,CnF1zBC,qBoFwBG,QDqyBJ,CnF7zBC,eoFUG,aAAc,CACd,eACA,eDszBJ,CnFl0BC,oBoFeG,UDszBJ,CnFr0BC,oBoFkBG,WDszBJ,CnFx0BC,sBoFqBG,iBDszBJ,CnF30BC,qBoFwBG,QDszBJ,CnF90BC,eoFUG,aAAc,CACd,sBACA,sBDu0BJ,CnFn1BC,oBoFeG,iBDu0BJ,CnFt1BC,oBoFkBG,kBDu0BJ,CnFz1BC,sBoFqBG,wBDu0BJ,CnF51BC,qBoFwBG,QDu0BJ,CnF/1BC,eoFUG,aAAc,CACd,sBACA,sBDw1BJ,CnFp2BC,oBoFeG,iBDw1BJ,CnFv2BC,oBoFkBG,kBDw1BJ,CnF12BC,sBoFqBG,wBDw1BJ,CnF72BC,qBoFwBG,QDw1BJ,CnFh3BC,eoFUG,aAAc,CACd,aACA,aDy2BJ,CnFr3BC,oBoFeG,QDy2BJ,CnFx3BC,oBoFkBG,SDy2BJ,CnF33BC,sBoFqBG,eDy2BJ,CnF93BC,qBoFwBG,QDy2BJ,CnFj4BC,eoFUG,aAAc,CACd,sBACA,sBD03BJ,CnFt4BC,oBoFeG,iBD03BJ,CnFz4BC,oBoFkBG,kBD03BJ,CnF54BC,sBoFqBG,wBD03BJ,CnF/4BC,qBoFwBG,QD03BJ,CnFl5BC,eoFUG,aAAc,CACd,sBACA,sBD24BJ,CnFv5BC,oBoFeG,iBD24BJ,CnF15BC,oBoFkBG,kBD24BJ,CnF75BC,sBoFqBG,wBD24BJ,CnFh6BC,qBoFwBG,QD24BJ,CnFn6BC,eoFUG,aAAc,CACd,eACA,eD45BJ,CnFx6BC,oBoFeG,UD45BJ,CnF36BC,oBoFkBG,WD45BJ,CnF96BC,sBoFqBG,iBD45BJ,CnFj7BC,qBoFwBG,QD45BJ,CnFp7BC,eoFUG,aAAc,CACd,sBACA,sBD66BJ,CnFz7BC,oBoFeG,iBD66BJ,CnF57BC,oBoFkBG,kBD66BJ,CnF/7BC,sBoFqBG,wBD66BJ,CnFl8BC,qBoFwBG,QD66BJ,CnFr8BC,eoFUG,aAAc,CACd,sBACA,sBD87BJ,CnF18BC,oBoFeG,iBD87BJ,CnF78BC,oBoFkBG,kBD87BJ,CnFh9BC,sBoFqBG,wBD87BJ,CnFn9BC,qBoFwBG,QD87BJ,CnFt9BC,eoFUG,aAAc,CACd,aACA,aD+8BJ,CnF39BC,oBoFeG,QD+8BJ,CnF99BC,oBoFkBG,SD+8BJ,CnFj+BC,sBoFqBG,eD+8BJ,CnFp+BC,qBoFwBG,QD+8BJ,CnFv+BC,eoFUG,aAAc,CACd,sBACA,sBDg+BJ,CnF5+BC,oBoFeG,iBDg+BJ,CnF/+BC,oBoFkBG,kBDg+BJ,CnFl/BC,sBoFqBG,wBDg+BJ,CnFr/BC,qBoFwBG,QDg+BJ,CnFx/BC,eoFUG,aAAc,CACd,sBACA,sBDi/BJ,CnF7/BC,oBoFeG,iBDi/BJ,CnFhgCC,oBoFkBG,kBDi/BJ,CnFngCC,sBoFqBG,wBDi/BJ,CnFtgCC,qBoFwBG,QDi/BJ,CnFzgCC,coFUG,aAAc,CACd,eACA,eDkgCJ,CnF9gCC,mBoFeG,UDkgCJ,CnFjhCC,mBoFkBG,WDkgCJ,CnFphCC,qBoFqBG,iBDkgCJ,CnFvhCC,oBoFwBG,ODkgCJ,CnF1hCC,coFUG,aAAc,CACd,sBACA,sBDmhCJ,CnF/hCC,mBoFeG,iBDmhCJ,CnFliCC,mBoFkBG,kBDmhCJ,CnFriCC,qBoFqBG,wBDmhCJ,CnFxiCC,oBoFwBG,ODmhCJ,CnF3iCC,coFUG,aAAc,CACd,sBACA,sBDoiCJ,CnFhjCC,mBoFeG,iBDoiCJ,CnFnjCC,mBoFkBG,kBDoiCJ,CnFtjCC,qBoFqBG,wBDoiCJ,CnFzjCC,oBoFwBG,ODoiCJ,CnF5jCC,coFUG,aAAc,CACd,aACA,aDqjCJ,CnFjkCC,mBoFeG,QDqjCJ,CnFpkCC,mBoFkBG,SDqjCJ,CnFvkCC,qBoFqBG,eDqjCJ,CnF1kCC,oBoFwBG,ODqjCJ,CnF7kCC,coFUG,aAAc,CACd,sBACA,sBDskCJ,CnFllCC,mBoFeG,iBDskCJ,CnFrlCC,mBoFkBG,kBDskCJ,CnFxlCC,qBoFqBG,wBDskCJ,CnF3lCC,oBoFwBG,ODskCJ,CnF9lCC,coFUG,aAAc,CACd,sBACA,sBDulCJ,CnFnmCC,mBoFeG,iBDulCJ,CnFtmCC,mBoFkBG,kBDulCJ,CnFzmCC,qBoFqBG,wBDulCJ,CnF5mCC,oBoFwBG,ODulCJ,CnF/mCC,coFUG,aAAc,CACd,eACA,eDwmCJ,CnFpnCC,mBoFeG,UDwmCJ,CnFvnCC,mBoFkBG,WDwmCJ,CnF1nCC,qBoFqBG,iBDwmCJ,CnF7nCC,oBoFwBG,ODwmCJ,CnFhoCC,coFUG,aAAc,CACd,qBACA,qBDynCJ,CnFroCC,mBoFeG,gBDynCJ,CnFxoCC,mBoFkBG,iBDynCJ,CnF3oCC,qBoFqBG,uBDynCJ,CnF9oCC,oBoFwBG,ODynCJ,CnFjpCC,coFUG,aAAc,CACd,qBACA,qBD0oCJ,CnFtpCC,mBoFeG,gBD0oCJ,CnFzpCC,mBoFkBG,iBD0oCJ,CnF5pCC,qBoFqBG,uBD0oCJ,CnF/pCC,oBoFwBG,OD0oCJ,CnFlqCC,coF+BG,YDsoCJ,CnFrqCC,gBoFkCG,SDsoCJ,CnFxqCC,gBoFqCG,UDsoCJ,CnF3qCC,mBoFwCG,SDsoCJ,CnF9qCC,mBoF2CG,UDsoCJ,CnFjrCC,qBoF8CG,aDsoCJ,CnFprCC,oBoFiDG,ODsoCJ,CnFvrCC,4BqFyCK,UFipCN,CnF1rCC,4BqF+CK,SF8oCN,CnF7rCC,+BqFqDK,UF2oCN,CnFhsCC,+BqF2DK,SFwoCN,CnFnsCC,iCqFiEK,cFqoCN,CnFtsCC,+BqFgBK,SAAU,CADV,iBF2rCN,CnF1sCC,+BqFwBK,iBADA,UFurCN,CnF9sCC,iCqFgCK,aAAc,CADd,wBFmrCN,CnFltCC,+BqFgBK,SAAU,CADV,iBFusCN,CnFttCC,+BqFwBK,iBADA,UFmsCN,CnF1tCC,iCqFgCK,aAAc,CADd,wBF+rCN,CnF9tCC,+BqFgBK,SAAU,CADV,WFmtCN,CnFluCC,+BqFwBK,WADA,UF+sCN,CnFtuCC,iCqFgCK,aAAc,CADd,kBF2sCN,CnF1uCC,+BqFgBK,SAAU,CADV,kBF+tCN,CnF9uCC,+BqFwBK,kBADA,UF2tCN,CnFlvCC,iCqFgCK,aAAc,CADd,yBFutCN,CnFtvCC,+BqFgBK,SAAU,CADV,kBF2uCN,CnF1vCC,+BqFwBK,kBADA,UFuuCN,CnF9vCC,iCqFgCK,aAAc,CADd,yBFmuCN,CnFlwCC,+BqFgBK,SAAU,CADV,SFuvCN,CnFtwCC,+BqFwBK,SADA,UFmvCN,CnF1wCC,iCqFgCK,aAAc,CADd,gBF+uCN,CnF9wCC,+BqFgBK,SAAU,CADV,kBFmwCN,CnFlxCC,+BqFwBK,kBADA,UF+vCN,CnFtxCC,iCqFgCK,aAAc,CADd,yBF2vCN,CnF1xCC,+BqFgBK,SAAU,CADV,kBF+wCN,CnF9xCC,+BqFwBK,kBADA,UF2wCN,CnFlyCC,iCqFgCK,aAAc,CADd,yBFuwCN,CnFtyCC,+BqFgBK,SAAU,CADV,WF2xCN,CnF1yCC,+BqFwBK,WADA,UFuxCN,CnF9yCC,iCqFgCK,aAAc,CADd,kBFmxCN,CnFlzCC,gCqFgBK,SAAU,CADV,kBFuyCN,CnFtzCC,gCqFwBK,kBADA,UFmyCN,CnF1zCC,kCqFgCK,aAAc,CADd,yBF+xCN,CnF9zCC,gCqFgBK,SAAU,CADV,kBFmzCN,CnFl0CC,gCqFwBK,kBADA,UF+yCN,CnFt0CC,kCqFgCK,aAAc,CADd,yBF2yCN,CnF10CC,gCqFgBK,SAAU,CADV,SF+zCN,CnF90CC,gCqFwBK,SADA,UF2zCN,CnFl1CC,kCqFgCK,aAAc,CADd,gBFuzCN,CnFt1CC,gCqFgBK,SAAU,CADV,kBF20CN,CnF11CC,gCqFwBK,kBADA,UFu0CN,CnF91CC,kCqFgCK,aAAc,CADd,yBFm0CN,CnFl2CC,gCqFgBK,SAAU,CADV,kBFu1CN,CnFt2CC,gCqFwBK,kBADA,UFm1CN,CnF12CC,kCqFgCK,aAAc,CADd,yBF+0CN,CnF92CC,gCqFgBK,SAAU,CADV,WFm2CN,CnFl3CC,gCqFwBK,WADA,UF+1CN,CnFt3CC,kCqFgCK,aAAc,CADd,kBF21CN,CnF13CC,gCqFgBK,SAAU,CADV,kBF+2CN,CnF93CC,gCqFwBK,kBADA,UF22CN,CnFl4CC,kCqFgCK,aAAc,CADd,yBFu2CN,CnFt4CC,gCqFgBK,SAAU,CADV,kBF23CN,CnF14CC,gCqFwBK,kBADA,UFu3CN,CnF94CC,kCqFgCK,aAAc,CADd,yBFm3CN,CnFl5CC,gCqFgBK,SAAU,CADV,SFu4CN,CnFt5CC,gCqFwBK,SADA,UFm4CN,CnF15CC,kCqFgCK,aAAc,CADd,gBF+3CN,CnF95CC,gCqFgBK,SAAU,CADV,kBFm5CN,CnFl6CC,gCqFwBK,kBADA,UF+4CN,CnFt6CC,kCqFgCK,aAAc,CADd,yBF24CN,CnF16CC,gCqFgBK,SAAU,CADV,kBF+5CN,CnF96CC,gCqFwBK,kBADA,UF25CN,CnFl7CC,kCqFgCK,aAAc,CADd,yBFu5CN,CnFt7CC,gCqFgBK,SAAU,CADV,WF26CN,CnF17CC,gCqFwBK,WADA,UFu6CN,CnF97CC,kCqFgCK,aAAc,CADd,kBFm6CN,CnFl8CC,gCqFgBK,SAAU,CADV,kBFu7CN,CnFt8CC,gCqFwBK,kBADA,UFm7CN,CnF18CC,kCqFgCK,aAAc,CADd,yBF+6CN,CnF98CC,gCqFgBK,SAAU,CADV,kBFm8CN,CnFl9CC,gCqFwBK,kBADA,UF+7CN,CnFt9CC,kCqFgCK,aAAc,CADd,yBF27CN,CnF19CC,gCqFgBK,SAAU,CADV,UF+8CN,CnF99CC,gCqFwBK,UADA,UF28CN,CnFl+CC,kCqFgCK,aAAc,CADd,iBFu8CN,CAh5CA,yBnFtFC,eoFUG,aAAc,CACd,cACA,cDg+CF,CnF5+CD,oBoFeG,SDg+CF,CnF/+CD,oBoFkBG,UDg+CF,CnFl/CD,sBoFqBG,gBDg+CF,CnFr/CD,qBoFwBG,QDg+CF,CnFx/CD,eoFUG,aAAc,CACd,sBACA,sBDi/CF,CnF7/CD,oBoFeG,iBDi/CF,CnFhgDD,oBoFkBG,kBDi/CF,CnFngDD,sBoFqBG,wBDi/CF,CnFtgDD,qBoFwBG,QDi/CF,CnFzgDD,eoFUG,aAAc,CACd,sBACA,sBDkgDF,CnF9gDD,oBoFeG,iBDkgDF,CnFjhDD,oBoFkBG,kBDkgDF,CnFphDD,sBoFqBG,wBDkgDF,CnFvhDD,qBoFwBG,QDkgDF,CnF1hDD,eoFUG,aAAc,CACd,eACA,eDmhDF,CnF/hDD,oBoFeG,UDmhDF,CnFliDD,oBoFkBG,WDmhDF,CnFriDD,sBoFqBG,iBDmhDF,CnFxiDD,qBoFwBG,QDmhDF,CnF3iDD,eoFUG,aAAc,CACd,sBACA,sBDoiDF,CnFhjDD,oBoFeG,iBDoiDF,CnFnjDD,oBoFkBG,kBDoiDF,CnFtjDD,sBoFqBG,wBDoiDF,CnFzjDD,qBoFwBG,QDoiDF,CnF5jDD,eoFUG,aAAc,CACd,sBACA,sBDqjDF,CnFjkDD,oBoFeG,iBDqjDF,CnFpkDD,oBoFkBG,kBDqjDF,CnFvkDD,sBoFqBG,wBDqjDF,CnF1kDD,qBoFwBG,QDqjDF,CnF7kDD,eoFUG,aAAc,CACd,aACA,aDskDF,CnFllDD,oBoFeG,QDskDF,CnFrlDD,oBoFkBG,SDskDF,CnFxlDD,sBoFqBG,eDskDF,CnF3lDD,qBoFwBG,QDskDF,CnF9lDD,eoFUG,aAAc,CACd,sBACA,sBDulDF,CnFnmDD,oBoFeG,iBDulDF,CnFtmDD,oBoFkBG,kBDulDF,CnFzmDD,sBoFqBG,wBDulDF,CnF5mDD,qBoFwBG,QDulDF,CnF/mDD,eoFUG,aAAc,CACd,sBACA,sBDwmDF,CnFpnDD,oBoFeG,iBDwmDF,CnFvnDD,oBoFkBG,kBDwmDF,CnF1nDD,sBoFqBG,wBDwmDF,CnF7nDD,qBoFwBG,QDwmDF,CnFhoDD,eoFUG,aAAc,CACd,eACA,eDynDF,CnFroDD,oBoFeG,UDynDF,CnFxoDD,oBoFkBG,WDynDF,CnF3oDD,sBoFqBG,iBDynDF,CnF9oDD,qBoFwBG,QDynDF,CnFjpDD,eoFUG,aAAc,CACd,sBACA,sBD0oDF,CnFtpDD,oBoFeG,iBD0oDF,CnFzpDD,oBoFkBG,kBD0oDF,CnF5pDD,sBoFqBG,wBD0oDF,CnF/pDD,qBoFwBG,QD0oDF,CnFlqDD,eoFUG,aAAc,CACd,sBACA,sBD2pDF,CnFvqDD,oBoFeG,iBD2pDF,CnF1qDD,oBoFkBG,kBD2pDF,CnF7qDD,sBoFqBG,wBD2pDF,CnFhrDD,qBoFwBG,QD2pDF,CnFnrDD,eoFUG,aAAc,CACd,aACA,aD4qDF,CnFxrDD,oBoFeG,QD4qDF,CnF3rDD,oBoFkBG,SD4qDF,CnF9rDD,sBoFqBG,eD4qDF,CnFjsDD,qBoFwBG,QD4qDF,CnFpsDD,eoFUG,aAAc,CACd,sBACA,sBD6rDF,CnFzsDD,oBoFeG,iBD6rDF,CnF5sDD,oBoFkBG,kBD6rDF,CnF/sDD,sBoFqBG,wBD6rDF,CnFltDD,qBoFwBG,QD6rDF,CnFrtDD,eoFUG,aAAc,CACd,sBACA,sBD8sDF,CnF1tDD,oBoFeG,iBD8sDF,CnF7tDD,oBoFkBG,kBD8sDF,CnFhuDD,sBoFqBG,wBD8sDF,CnFnuDD,qBoFwBG,QD8sDF,CnFtuDD,coFUG,aAAc,CACd,eACA,eD+tDF,CnF3uDD,mBoFeG,UD+tDF,CnF9uDD,mBoFkBG,WD+tDF,CnFjvDD,qBoFqBG,iBD+tDF,CnFpvDD,oBoFwBG,OD+tDF,CnFvvDD,coFUG,aAAc,CACd,sBACA,sBDgvDF,CnF5vDD,mBoFeG,iBDgvDF,CnF/vDD,mBoFkBG,kBDgvDF,CnFlwDD,qBoFqBG,wBDgvDF,CnFrwDD,oBoFwBG,ODgvDF,CnFxwDD,coFUG,aAAc,CACd,sBACA,sBDiwDF,CnF7wDD,mBoFeG,iBDiwDF,CnFhxDD,mBoFkBG,kBDiwDF,CnFnxDD,qBoFqBG,wBDiwDF,CnFtxDD,oBoFwBG,ODiwDF,CnFzxDD,coFUG,aAAc,CACd,aACA,aDkxDF,CnF9xDD,mBoFeG,QDkxDF,CnFjyDD,mBoFkBG,SDkxDF,CnFpyDD,qBoFqBG,eDkxDF,CnFvyDD,oBoFwBG,ODkxDF,CnF1yDD,coFUG,aAAc,CACd,sBACA,sBDmyDF,CnF/yDD,mBoFeG,iBDmyDF,CnFlzDD,mBoFkBG,kBDmyDF,CnFrzDD,qBoFqBG,wBDmyDF,CnFxzDD,oBoFwBG,ODmyDF,CnF3zDD,coFUG,aAAc,CACd,sBACA,sBDozDF,CnFh0DD,mBoFeG,iBDozDF,CnFn0DD,mBoFkBG,kBDozDF,CnFt0DD,qBoFqBG,wBDozDF,CnFz0DD,oBoFwBG,ODozDF,CnF50DD,coFUG,aAAc,CACd,eACA,eDq0DF,CnFj1DD,mBoFeG,UDq0DF,CnFp1DD,mBoFkBG,WDq0DF,CnFv1DD,qBoFqBG,iBDq0DF,CnF11DD,oBoFwBG,ODq0DF,CnF71DD,coFUG,aAAc,CACd,qBACA,qBDs1DF,CnFl2DD,mBoFeG,gBDs1DF,CnFr2DD,mBoFkBG,iBDs1DF,CnFx2DD,qBoFqBG,uBDs1DF,CnF32DD,oBoFwBG,ODs1DF,CnF92DD,coFUG,aAAc,CACd,qBACA,qBDu2DF,CnFn3DD,mBoFeG,gBDu2DF,CnFt3DD,mBoFkBG,iBDu2DF,CnFz3DD,qBoFqBG,uBDu2DF,CnF53DD,oBoFwBG,ODu2DF,CnF/3DD,coF+BG,YDm2DF,CnFl4DD,gBoFkCG,SDm2DF,CnFr4DD,gBoFqCG,UDm2DF,CnFx4DD,mBoFwCG,SDm2DF,CnF34DD,mBoF2CG,UDm2DF,CnF94DD,qBoF8CG,aDm2DF,CnFj5DD,oBoFiDG,ODm2DF,CnFp5DD,4BqFyCK,UF82DJ,CnFv5DD,4BqF+CK,SF22DJ,CnF15DD,+BqFqDK,UFw2DJ,CnF75DD,+BqF2DK,SFq2DJ,CnFh6DD,iCqFiEK,cFk2DJ,CnFn6DD,+BqFgBK,SAAU,CADV,iBFw5DJ,CnFv6DD,+BqFwBK,iBADA,UFo5DJ,CnF36DD,iCqFgCK,aAAc,CADd,wBFg5DJ,CnF/6DD,+BqFgBK,SAAU,CADV,iBFo6DJ,CnFn7DD,+BqFwBK,iBADA,UFg6DJ,CnFv7DD,iCqFgCK,aAAc,CADd,wBF45DJ,CnF37DD,+BqFgBK,SAAU,CADV,WFg7DJ,CnF/7DD,+BqFwBK,WADA,UF46DJ,CnFn8DD,iCqFgCK,aAAc,CADd,kBFw6DJ,CnFv8DD,+BqFgBK,SAAU,CADV,kBF47DJ,CnF38DD,+BqFwBK,kBADA,UFw7DJ,CnF/8DD,iCqFgCK,aAAc,CADd,yBFo7DJ,CnFn9DD,+BqFgBK,SAAU,CADV,kBFw8DJ,CnFv9DD,+BqFwBK,kBADA,UFo8DJ,CnF39DD,iCqFgCK,aAAc,CADd,yBFg8DJ,CnF/9DD,+BqFgBK,SAAU,CADV,SFo9DJ,CnFn+DD,+BqFwBK,SADA,UFg9DJ,CnFv+DD,iCqFgCK,aAAc,CADd,gBF48DJ,CnF3+DD,+BqFgBK,SAAU,CADV,kBFg+DJ,CnF/+DD,+BqFwBK,kBADA,UF49DJ,CnFn/DD,iCqFgCK,aAAc,CADd,yBFw9DJ,CnFv/DD,+BqFgBK,SAAU,CADV,kBF4+DJ,CnF3/DD,+BqFwBK,kBADA,UFw+DJ,CnF//DD,iCqFgCK,aAAc,CADd,yBFo+DJ,CnFngED,+BqFgBK,SAAU,CADV,WFw/DJ,CnFvgED,+BqFwBK,WADA,UFo/DJ,CnF3gED,iCqFgCK,aAAc,CADd,kBFg/DJ,CnF/gED,gCqFgBK,SAAU,CADV,kBFogEJ,CnFnhED,gCqFwBK,kBADA,UFggEJ,CnFvhED,kCqFgCK,aAAc,CADd,yBF4/DJ,CnF3hED,gCqFgBK,SAAU,CADV,kBFghEJ,CnF/hED,gCqFwBK,kBADA,UF4gEJ,CnFniED,kCqFgCK,aAAc,CADd,yBFwgEJ,CnFviED,gCqFgBK,SAAU,CADV,SF4hEJ,CnF3iED,gCqFwBK,SADA,UFwhEJ,CnF/iED,kCqFgCK,aAAc,CADd,gBFohEJ,CnFnjED,gCqFgBK,SAAU,CADV,kBFwiEJ,CnFvjED,gCqFwBK,kBADA,UFoiEJ,CnF3jED,kCqFgCK,aAAc,CADd,yBFgiEJ,CnF/jED,gCqFgBK,SAAU,CADV,kBFojEJ,CnFnkED,gCqFwBK,kBADA,UFgjEJ,CnFvkED,kCqFgCK,aAAc,CADd,yBF4iEJ,CnF3kED,gCqFgBK,SAAU,CADV,WFgkEJ,CnF/kED,gCqFwBK,WADA,UF4jEJ,CnFnlED,kCqFgCK,aAAc,CADd,kBFwjEJ,CnFvlED,gCqFgBK,SAAU,CADV,kBF4kEJ,CnF3lED,gCqFwBK,kBADA,UFwkEJ,CnF/lED,kCqFgCK,aAAc,CADd,yBFokEJ,CnFnmED,gCqFgBK,SAAU,CADV,kBFwlEJ,CnFvmED,gCqFwBK,kBADA,UFolEJ,CnF3mED,kCqFgCK,aAAc,CADd,yBFglEJ,CnF/mED,gCqFgBK,SAAU,CADV,SFomEJ,CnFnnED,gCqFwBK,SADA,UFgmEJ,CnFvnED,kCqFgCK,aAAc,CADd,gBF4lEJ,CnF3nED,gCqFgBK,SAAU,CADV,kBFgnEJ,CnF/nED,gCqFwBK,kBADA,UF4mEJ,CnFnoED,kCqFgCK,aAAc,CADd,yBFwmEJ,CnFvoED,gCqFgBK,SAAU,CADV,kBF4nEJ,CnF3oED,gCqFwBK,kBADA,UFwnEJ,CnF/oED,kCqFgCK,aAAc,CADd,yBFonEJ,CnFnpED,gCqFgBK,SAAU,CADV,WFwoEJ,CnFvpED,gCqFwBK,WADA,UFooEJ,CnF3pED,kCqFgCK,aAAc,CADd,kBFgoEJ,CnF/pED,gCqFgBK,SAAU,CADV,kBFopEJ,CnFnqED,gCqFwBK,kBADA,UFgpEJ,CnFvqED,kCqFgCK,aAAc,CADd,yBF4oEJ,CnF3qED,gCqFgBK,SAAU,CADV,kBFgqEJ,CnF/qED,gCqFwBK,kBADA,UF4pEJ,CnFnrED,kCqFgCK,aAAc,CADd,yBFwpEJ,CnFvrED,gCqFgBK,SAAU,CADV,UF4qEJ,CnF3rED,gCqFwBK,UADA,UFwqEJ,CnF/rED,kCqFgCK,aAAc,CADd,iBFoqEJ,CACF,CAtmEA,yBnF9FC,eoFUG,aAAc,CACd,cACA,cD8rEF,CnF1sED,oBoFeG,SD8rEF,CnF7sED,oBoFkBG,UD8rEF,CnFhtED,sBoFqBG,gBD8rEF,CnFntED,qBoFwBG,QD8rEF,CnFttED,eoFUG,aAAc,CACd,sBACA,sBD+sEF,CnF3tED,oBoFeG,iBD+sEF,CnF9tED,oBoFkBG,kBD+sEF,CnFjuED,sBoFqBG,wBD+sEF,CnFpuED,qBoFwBG,QD+sEF,CnFvuED,eoFUG,aAAc,CACd,sBACA,sBDguEF,CnF5uED,oBoFeG,iBDguEF,CnF/uED,oBoFkBG,kBDguEF,CnFlvED,sBoFqBG,wBDguEF,CnFrvED,qBoFwBG,QDguEF,CnFxvED,eoFUG,aAAc,CACd,eACA,eDivEF,CnF7vED,oBoFeG,UDivEF,CnFhwED,oBoFkBG,WDivEF,CnFnwED,sBoFqBG,iBDivEF,CnFtwED,qBoFwBG,QDivEF,CnFzwED,eoFUG,aAAc,CACd,sBACA,sBDkwEF,CnF9wED,oBoFeG,iBDkwEF,CnFjxED,oBoFkBG,kBDkwEF,CnFpxED,sBoFqBG,wBDkwEF,CnFvxED,qBoFwBG,QDkwEF,CnF1xED,eoFUG,aAAc,CACd,sBACA,sBDmxEF,CnF/xED,oBoFeG,iBDmxEF,CnFlyED,oBoFkBG,kBDmxEF,CnFryED,sBoFqBG,wBDmxEF,CnFxyED,qBoFwBG,QDmxEF,CnF3yED,eoFUG,aAAc,CACd,aACA,aDoyEF,CnFhzED,oBoFeG,QDoyEF,CnFnzED,oBoFkBG,SDoyEF,CnFtzED,sBoFqBG,eDoyEF,CnFzzED,qBoFwBG,QDoyEF,CnF5zED,eoFUG,aAAc,CACd,sBACA,sBDqzEF,CnFj0ED,oBoFeG,iBDqzEF,CnFp0ED,oBoFkBG,kBDqzEF,CnFv0ED,sBoFqBG,wBDqzEF,CnF10ED,qBoFwBG,QDqzEF,CnF70ED,eoFUG,aAAc,CACd,sBACA,sBDs0EF,CnFl1ED,oBoFeG,iBDs0EF,CnFr1ED,oBoFkBG,kBDs0EF,CnFx1ED,sBoFqBG,wBDs0EF,CnF31ED,qBoFwBG,QDs0EF,CnF91ED,eoFUG,aAAc,CACd,eACA,eDu1EF,CnFn2ED,oBoFeG,UDu1EF,CnFt2ED,oBoFkBG,WDu1EF,CnFz2ED,sBoFqBG,iBDu1EF,CnF52ED,qBoFwBG,QDu1EF,CnF/2ED,eoFUG,aAAc,CACd,sBACA,sBDw2EF,CnFp3ED,oBoFeG,iBDw2EF,CnFv3ED,oBoFkBG,kBDw2EF,CnF13ED,sBoFqBG,wBDw2EF,CnF73ED,qBoFwBG,QDw2EF,CnFh4ED,eoFUG,aAAc,CACd,sBACA,sBDy3EF,CnFr4ED,oBoFeG,iBDy3EF,CnFx4ED,oBoFkBG,kBDy3EF,CnF34ED,sBoFqBG,wBDy3EF,CnF94ED,qBoFwBG,QDy3EF,CnFj5ED,eoFUG,aAAc,CACd,aACA,aD04EF,CnFt5ED,oBoFeG,QD04EF,CnFz5ED,oBoFkBG,SD04EF,CnF55ED,sBoFqBG,eD04EF,CnF/5ED,qBoFwBG,QD04EF,CnFl6ED,eoFUG,aAAc,CACd,sBACA,sBD25EF,CnFv6ED,oBoFeG,iBD25EF,CnF16ED,oBoFkBG,kBD25EF,CnF76ED,sBoFqBG,wBD25EF,CnFh7ED,qBoFwBG,QD25EF,CnFn7ED,eoFUG,aAAc,CACd,sBACA,sBD46EF,CnFx7ED,oBoFeG,iBD46EF,CnF37ED,oBoFkBG,kBD46EF,CnF97ED,sBoFqBG,wBD46EF,CnFj8ED,qBoFwBG,QD46EF,CnFp8ED,coFUG,aAAc,CACd,eACA,eD67EF,CnFz8ED,mBoFeG,UD67EF,CnF58ED,mBoFkBG,WD67EF,CnF/8ED,qBoFqBG,iBD67EF,CnFl9ED,oBoFwBG,OD67EF,CnFr9ED,coFUG,aAAc,CACd,sBACA,sBD88EF,CnF19ED,mBoFeG,iBD88EF,CnF79ED,mBoFkBG,kBD88EF,CnFh+ED,qBoFqBG,wBD88EF,CnFn+ED,oBoFwBG,OD88EF,CnFt+ED,coFUG,aAAc,CACd,sBACA,sBD+9EF,CnF3+ED,mBoFeG,iBD+9EF,CnF9+ED,mBoFkBG,kBD+9EF,CnFj/ED,qBoFqBG,wBD+9EF,CnFp/ED,oBoFwBG,OD+9EF,CnFv/ED,coFUG,aAAc,CACd,aACA,aDg/EF,CnF5/ED,mBoFeG,QDg/EF,CnF//ED,mBoFkBG,SDg/EF,CnFlgFD,qBoFqBG,eDg/EF,CnFrgFD,oBoFwBG,ODg/EF,CnFxgFD,coFUG,aAAc,CACd,sBACA,sBDigFF,CnF7gFD,mBoFeG,iBDigFF,CnFhhFD,mBoFkBG,kBDigFF,CnFnhFD,qBoFqBG,wBDigFF,CnFthFD,oBoFwBG,ODigFF,CnFzhFD,coFUG,aAAc,CACd,sBACA,sBDkhFF,CnF9hFD,mBoFeG,iBDkhFF,CnFjiFD,mBoFkBG,kBDkhFF,CnFpiFD,qBoFqBG,wBDkhFF,CnFviFD,oBoFwBG,ODkhFF,CnF1iFD,coFUG,aAAc,CACd,eACA,eDmiFF,CnF/iFD,mBoFeG,UDmiFF,CnFljFD,mBoFkBG,WDmiFF,CnFrjFD,qBoFqBG,iBDmiFF,CnFxjFD,oBoFwBG,ODmiFF,CnF3jFD,coFUG,aAAc,CACd,qBACA,qBDojFF,CnFhkFD,mBoFeG,gBDojFF,CnFnkFD,mBoFkBG,iBDojFF,CnFtkFD,qBoFqBG,uBDojFF,CnFzkFD,oBoFwBG,ODojFF,CnF5kFD,coFUG,aAAc,CACd,qBACA,qBDqkFF,CnFjlFD,mBoFeG,gBDqkFF,CnFplFD,mBoFkBG,iBDqkFF,CnFvlFD,qBoFqBG,uBDqkFF,CnF1lFD,oBoFwBG,ODqkFF,CnF7lFD,coF+BG,YDikFF,CnFhmFD,gBoFkCG,SDikFF,CnFnmFD,gBoFqCG,UDikFF,CnFtmFD,mBoFwCG,SDikFF,CnFzmFD,mBoF2CG,UDikFF,CnF5mFD,qBoF8CG,aDikFF,CnF/mFD,oBoFiDG,ODikFF,CnFlnFD,4BqFyCK,UF4kFJ,CnFrnFD,4BqF+CK,SFykFJ,CnFxnFD,+BqFqDK,UFskFJ,CnF3nFD,+BqF2DK,SFmkFJ,CnF9nFD,iCqFiEK,cFgkFJ,CnFjoFD,+BqFgBK,SAAU,CADV,iBFsnFJ,CnFroFD,+BqFwBK,iBADA,UFknFJ,CnFzoFD,iCqFgCK,aAAc,CADd,wBF8mFJ,CnF7oFD,+BqFgBK,SAAU,CADV,iBFkoFJ,CnFjpFD,+BqFwBK,iBADA,UF8nFJ,CnFrpFD,iCqFgCK,aAAc,CADd,wBF0nFJ,CnFzpFD,+BqFgBK,SAAU,CADV,WF8oFJ,CnF7pFD,+BqFwBK,WADA,UF0oFJ,CnFjqFD,iCqFgCK,aAAc,CADd,kBFsoFJ,CnFrqFD,+BqFgBK,SAAU,CADV,kBF0pFJ,CnFzqFD,+BqFwBK,kBADA,UFspFJ,CnF7qFD,iCqFgCK,aAAc,CADd,yBFkpFJ,CnFjrFD,+BqFgBK,SAAU,CADV,kBFsqFJ,CnFrrFD,+BqFwBK,kBADA,UFkqFJ,CnFzrFD,iCqFgCK,aAAc,CADd,yBF8pFJ,CnF7rFD,+BqFgBK,SAAU,CADV,SFkrFJ,CnFjsFD,+BqFwBK,SADA,UF8qFJ,CnFrsFD,iCqFgCK,aAAc,CADd,gBF0qFJ,CnFzsFD,+BqFgBK,SAAU,CADV,kBF8rFJ,CnF7sFD,+BqFwBK,kBADA,UF0rFJ,CnFjtFD,iCqFgCK,aAAc,CADd,yBFsrFJ,CnFrtFD,+BqFgBK,SAAU,CADV,kBF0sFJ,CnFztFD,+BqFwBK,kBADA,UFssFJ,CnF7tFD,iCqFgCK,aAAc,CADd,yBFksFJ,CnFjuFD,+BqFgBK,SAAU,CADV,WFstFJ,CnFruFD,+BqFwBK,WADA,UFktFJ,CnFzuFD,iCqFgCK,aAAc,CADd,kBF8sFJ,CnF7uFD,gCqFgBK,SAAU,CADV,kBFkuFJ,CnFjvFD,gCqFwBK,kBADA,UF8tFJ,CnFrvFD,kCqFgCK,aAAc,CADd,yBF0tFJ,CnFzvFD,gCqFgBK,SAAU,CADV,kBF8uFJ,CnF7vFD,gCqFwBK,kBADA,UF0uFJ,CnFjwFD,kCqFgCK,aAAc,CADd,yBFsuFJ,CnFrwFD,gCqFgBK,SAAU,CADV,SF0vFJ,CnFzwFD,gCqFwBK,SADA,UFsvFJ,CnF7wFD,kCqFgCK,aAAc,CADd,gBFkvFJ,CnFjxFD,gCqFgBK,SAAU,CADV,kBFswFJ,CnFrxFD,gCqFwBK,kBADA,UFkwFJ,CnFzxFD,kCqFgCK,aAAc,CADd,yBF8vFJ,CnF7xFD,gCqFgBK,SAAU,CADV,kBFkxFJ,CnFjyFD,gCqFwBK,kBADA,UF8wFJ,CnFryFD,kCqFgCK,aAAc,CADd,yBF0wFJ,CnFzyFD,gCqFgBK,SAAU,CADV,WF8xFJ,CnF7yFD,gCqFwBK,WADA,UF0xFJ,CnFjzFD,kCqFgCK,aAAc,CADd,kBFsxFJ,CnFrzFD,gCqFgBK,SAAU,CADV,kBF0yFJ,CnFzzFD,gCqFwBK,kBADA,UFsyFJ,CnF7zFD,kCqFgCK,aAAc,CADd,yBFkyFJ,CnFj0FD,gCqFgBK,SAAU,CADV,kBFszFJ,CnFr0FD,gCqFwBK,kBADA,UFkzFJ,CnFz0FD,kCqFgCK,aAAc,CADd,yBF8yFJ,CnF70FD,gCqFgBK,SAAU,CADV,SFk0FJ,CnFj1FD,gCqFwBK,SADA,UF8zFJ,CnFr1FD,kCqFgCK,aAAc,CADd,gBF0zFJ,CnFz1FD,gCqFgBK,SAAU,CADV,kBF80FJ,CnF71FD,gCqFwBK,kBADA,UF00FJ,CnFj2FD,kCqFgCK,aAAc,CADd,yBFs0FJ,CnFr2FD,gCqFgBK,SAAU,CADV,kBF01FJ,CnFz2FD,gCqFwBK,kBADA,UFs1FJ,CnF72FD,kCqFgCK,aAAc,CADd,yBFk1FJ,CnFj3FD,gCqFgBK,SAAU,CADV,WFs2FJ,CnFr3FD,gCqFwBK,WADA,UFk2FJ,CnFz3FD,kCqFgCK,aAAc,CADd,kBF81FJ,CnF73FD,gCqFgBK,SAAU,CADV,kBFk3FJ,CnFj4FD,gCqFwBK,kBADA,UF82FJ,CnFr4FD,kCqFgCK,aAAc,CADd,yBF02FJ,CnFz4FD,gCqFgBK,SAAU,CADV,kBF83FJ,CnF74FD,gCqFwBK,kBADA,UF03FJ,CnFj5FD,kCqFgCK,aAAc,CADd,yBFs3FJ,CnFr5FD,gCqFgBK,SAAU,CADV,UF04FJ,CnFz5FD,gCqFwBK,UADA,UFs4FJ,CnF75FD,kCqFgCK,aAAc,CADd,iBFk4FJ,CACF,CA5zFA,yBnFtGC,eoFUG,aAAc,CACd,cACA,cD45FF,CnFx6FD,oBoFeG,SD45FF,CnF36FD,oBoFkBG,UD45FF,CnF96FD,sBoFqBG,gBD45FF,CnFj7FD,qBoFwBG,QD45FF,CnFp7FD,eoFUG,aAAc,CACd,sBACA,sBD66FF,CnFz7FD,oBoFeG,iBD66FF,CnF57FD,oBoFkBG,kBD66FF,CnF/7FD,sBoFqBG,wBD66FF,CnFl8FD,qBoFwBG,QD66FF,CnFr8FD,eoFUG,aAAc,CACd,sBACA,sBD87FF,CnF18FD,oBoFeG,iBD87FF,CnF78FD,oBoFkBG,kBD87FF,CnFh9FD,sBoFqBG,wBD87FF,CnFn9FD,qBoFwBG,QD87FF,CnFt9FD,eoFUG,aAAc,CACd,eACA,eD+8FF,CnF39FD,oBoFeG,UD+8FF,CnF99FD,oBoFkBG,WD+8FF,CnFj+FD,sBoFqBG,iBD+8FF,CnFp+FD,qBoFwBG,QD+8FF,CnFv+FD,eoFUG,aAAc,CACd,sBACA,sBDg+FF,CnF5+FD,oBoFeG,iBDg+FF,CnF/+FD,oBoFkBG,kBDg+FF,CnFl/FD,sBoFqBG,wBDg+FF,CnFr/FD,qBoFwBG,QDg+FF,CnFx/FD,eoFUG,aAAc,CACd,sBACA,sBDi/FF,CnF7/FD,oBoFeG,iBDi/FF,CnFhgGD,oBoFkBG,kBDi/FF,CnFngGD,sBoFqBG,wBDi/FF,CnFtgGD,qBoFwBG,QDi/FF,CnFzgGD,eoFUG,aAAc,CACd,aACA,aDkgGF,CnF9gGD,oBoFeG,QDkgGF,CnFjhGD,oBoFkBG,SDkgGF,CnFphGD,sBoFqBG,eDkgGF,CnFvhGD,qBoFwBG,QDkgGF,CnF1hGD,eoFUG,aAAc,CACd,sBACA,sBDmhGF,CnF/hGD,oBoFeG,iBDmhGF,CnFliGD,oBoFkBG,kBDmhGF,CnFriGD,sBoFqBG,wBDmhGF,CnFxiGD,qBoFwBG,QDmhGF,CnF3iGD,eoFUG,aAAc,CACd,sBACA,sBDoiGF,CnFhjGD,oBoFeG,iBDoiGF,CnFnjGD,oBoFkBG,kBDoiGF,CnFtjGD,sBoFqBG,wBDoiGF,CnFzjGD,qBoFwBG,QDoiGF,CnF5jGD,eoFUG,aAAc,CACd,eACA,eDqjGF,CnFjkGD,oBoFeG,UDqjGF,CnFpkGD,oBoFkBG,WDqjGF,CnFvkGD,sBoFqBG,iBDqjGF,CnF1kGD,qBoFwBG,QDqjGF,CnF7kGD,eoFUG,aAAc,CACd,sBACA,sBDskGF,CnFllGD,oBoFeG,iBDskGF,CnFrlGD,oBoFkBG,kBDskGF,CnFxlGD,sBoFqBG,wBDskGF,CnF3lGD,qBoFwBG,QDskGF,CnF9lGD,eoFUG,aAAc,CACd,sBACA,sBDulGF,CnFnmGD,oBoFeG,iBDulGF,CnFtmGD,oBoFkBG,kBDulGF,CnFzmGD,sBoFqBG,wBDulGF,CnF5mGD,qBoFwBG,QDulGF,CnF/mGD,eoFUG,aAAc,CACd,aACA,aDwmGF,CnFpnGD,oBoFeG,QDwmGF,CnFvnGD,oBoFkBG,SDwmGF,CnF1nGD,sBoFqBG,eDwmGF,CnF7nGD,qBoFwBG,QDwmGF,CnFhoGD,eoFUG,aAAc,CACd,sBACA,sBDynGF,CnFroGD,oBoFeG,iBDynGF,CnFxoGD,oBoFkBG,kBDynGF,CnF3oGD,sBoFqBG,wBDynGF,CnF9oGD,qBoFwBG,QDynGF,CnFjpGD,eoFUG,aAAc,CACd,sBACA,sBD0oGF,CnFtpGD,oBoFeG,iBD0oGF,CnFzpGD,oBoFkBG,kBD0oGF,CnF5pGD,sBoFqBG,wBD0oGF,CnF/pGD,qBoFwBG,QD0oGF,CnFlqGD,coFUG,aAAc,CACd,eACA,eD2pGF,CnFvqGD,mBoFeG,UD2pGF,CnF1qGD,mBoFkBG,WD2pGF,CnF7qGD,qBoFqBG,iBD2pGF,CnFhrGD,oBoFwBG,OD2pGF,CnFnrGD,coFUG,aAAc,CACd,sBACA,sBD4qGF,CnFxrGD,mBoFeG,iBD4qGF,CnF3rGD,mBoFkBG,kBD4qGF,CnF9rGD,qBoFqBG,wBD4qGF,CnFjsGD,oBoFwBG,OD4qGF,CnFpsGD,coFUG,aAAc,CACd,sBACA,sBD6rGF,CnFzsGD,mBoFeG,iBD6rGF,CnF5sGD,mBoFkBG,kBD6rGF,CnF/sGD,qBoFqBG,wBD6rGF,CnFltGD,oBoFwBG,OD6rGF,CnFrtGD,coFUG,aAAc,CACd,aACA,aD8sGF,CnF1tGD,mBoFeG,QD8sGF,CnF7tGD,mBoFkBG,SD8sGF,CnFhuGD,qBoFqBG,eD8sGF,CnFnuGD,oBoFwBG,OD8sGF,CnFtuGD,coFUG,aAAc,CACd,sBACA,sBD+tGF,CnF3uGD,mBoFeG,iBD+tGF,CnF9uGD,mBoFkBG,kBD+tGF,CnFjvGD,qBoFqBG,wBD+tGF,CnFpvGD,oBoFwBG,OD+tGF,CnFvvGD,coFUG,aAAc,CACd,sBACA,sBDgvGF,CnF5vGD,mBoFeG,iBDgvGF,CnF/vGD,mBoFkBG,kBDgvGF,CnFlwGD,qBoFqBG,wBDgvGF,CnFrwGD,oBoFwBG,ODgvGF,CnFxwGD,coFUG,aAAc,CACd,eACA,eDiwGF,CnF7wGD,mBoFeG,UDiwGF,CnFhxGD,mBoFkBG,WDiwGF,CnFnxGD,qBoFqBG,iBDiwGF,CnFtxGD,oBoFwBG,ODiwGF,CnFzxGD,coFUG,aAAc,CACd,qBACA,qBDkxGF,CnF9xGD,mBoFeG,gBDkxGF,CnFjyGD,mBoFkBG,iBDkxGF,CnFpyGD,qBoFqBG,uBDkxGF,CnFvyGD,oBoFwBG,ODkxGF,CnF1yGD,coFUG,aAAc,CACd,qBACA,qBDmyGF,CnF/yGD,mBoFeG,gBDmyGF,CnFlzGD,mBoFkBG,iBDmyGF,CnFrzGD,qBoFqBG,uBDmyGF,CnFxzGD,oBoFwBG,ODmyGF,CnF3zGD,coF+BG,YD+xGF,CnF9zGD,gBoFkCG,SD+xGF,CnFj0GD,gBoFqCG,UD+xGF,CnFp0GD,mBoFwCG,SD+xGF,CnFv0GD,mBoF2CG,UD+xGF,CnF10GD,qBoF8CG,aD+xGF,CnF70GD,oBoFiDG,OD+xGF,CnFh1GD,4BqFyCK,UF0yGJ,CnFn1GD,4BqF+CK,SFuyGJ,CnFt1GD,+BqFqDK,UFoyGJ,CnFz1GD,+BqF2DK,SFiyGJ,CnF51GD,iCqFiEK,cF8xGJ,CnF/1GD,+BqFgBK,SAAU,CADV,iBFo1GJ,CnFn2GD,+BqFwBK,iBADA,UFg1GJ,CnFv2GD,iCqFgCK,aAAc,CADd,wBF40GJ,CnF32GD,+BqFgBK,SAAU,CADV,iBFg2GJ,CnF/2GD,+BqFwBK,iBADA,UF41GJ,CnFn3GD,iCqFgCK,aAAc,CADd,wBFw1GJ,CnFv3GD,+BqFgBK,SAAU,CADV,WF42GJ,CnF33GD,+BqFwBK,WADA,UFw2GJ,CnF/3GD,iCqFgCK,aAAc,CADd,kBFo2GJ,CnFn4GD,+BqFgBK,SAAU,CADV,kBFw3GJ,CnFv4GD,+BqFwBK,kBADA,UFo3GJ,CnF34GD,iCqFgCK,aAAc,CADd,yBFg3GJ,CnF/4GD,+BqFgBK,SAAU,CADV,kBFo4GJ,CnFn5GD,+BqFwBK,kBADA,UFg4GJ,CnFv5GD,iCqFgCK,aAAc,CADd,yBF43GJ,CnF35GD,+BqFgBK,SAAU,CADV,SFg5GJ,CnF/5GD,+BqFwBK,SADA,UF44GJ,CnFn6GD,iCqFgCK,aAAc,CADd,gBFw4GJ,CnFv6GD,+BqFgBK,SAAU,CADV,kBF45GJ,CnF36GD,+BqFwBK,kBADA,UFw5GJ,CnF/6GD,iCqFgCK,aAAc,CADd,yBFo5GJ,CnFn7GD,+BqFgBK,SAAU,CADV,kBFw6GJ,CnFv7GD,+BqFwBK,kBADA,UFo6GJ,CnF37GD,iCqFgCK,aAAc,CADd,yBFg6GJ,CnF/7GD,+BqFgBK,SAAU,CADV,WFo7GJ,CnFn8GD,+BqFwBK,WADA,UFg7GJ,CnFv8GD,iCqFgCK,aAAc,CADd,kBF46GJ,CnF38GD,gCqFgBK,SAAU,CADV,kBFg8GJ,CnF/8GD,gCqFwBK,kBADA,UF47GJ,CnFn9GD,kCqFgCK,aAAc,CADd,yBFw7GJ,CnFv9GD,gCqFgBK,SAAU,CADV,kBF48GJ,CnF39GD,gCqFwBK,kBADA,UFw8GJ,CnF/9GD,kCqFgCK,aAAc,CADd,yBFo8GJ,CnFn+GD,gCqFgBK,SAAU,CADV,SFw9GJ,CnFv+GD,gCqFwBK,SADA,UFo9GJ,CnF3+GD,kCqFgCK,aAAc,CADd,gBFg9GJ,CnF/+GD,gCqFgBK,SAAU,CADV,kBFo+GJ,CnFn/GD,gCqFwBK,kBADA,UFg+GJ,CnFv/GD,kCqFgCK,aAAc,CADd,yBF49GJ,CnF3/GD,gCqFgBK,SAAU,CADV,kBFg/GJ,CnF//GD,gCqFwBK,kBADA,UF4+GJ,CnFngHD,kCqFgCK,aAAc,CADd,yBFw+GJ,CnFvgHD,gCqFgBK,SAAU,CADV,WF4/GJ,CnF3gHD,gCqFwBK,WADA,UFw/GJ,CnF/gHD,kCqFgCK,aAAc,CADd,kBFo/GJ,CnFnhHD,gCqFgBK,SAAU,CADV,kBFwgHJ,CnFvhHD,gCqFwBK,kBADA,UFogHJ,CnF3hHD,kCqFgCK,aAAc,CADd,yBFggHJ,CnF/hHD,gCqFgBK,SAAU,CADV,kBFohHJ,CnFniHD,gCqFwBK,kBADA,UFghHJ,CnFviHD,kCqFgCK,aAAc,CADd,yBF4gHJ,CnF3iHD,gCqFgBK,SAAU,CADV,SFgiHJ,CnF/iHD,gCqFwBK,SADA,UF4hHJ,CnFnjHD,kCqFgCK,aAAc,CADd,gBFwhHJ,CnFvjHD,gCqFgBK,SAAU,CADV,kBF4iHJ,CnF3jHD,gCqFwBK,kBADA,UFwiHJ,CnF/jHD,kCqFgCK,aAAc,CADd,yBFoiHJ,CnFnkHD,gCqFgBK,SAAU,CADV,kBFwjHJ,CnFvkHD,gCqFwBK,kBADA,UFojHJ,CnF3kHD,kCqFgCK,aAAc,CADd,yBFgjHJ,CnF/kHD,gCqFgBK,SAAU,CADV,WFokHJ,CnFnlHD,gCqFwBK,WADA,UFgkHJ,CnFvlHD,kCqFgCK,aAAc,CADd,kBF4jHJ,CnF3lHD,gCqFgBK,SAAU,CADV,kBFglHJ,CnF/lHD,gCqFwBK,kBADA,UF4kHJ,CnFnmHD,kCqFgCK,aAAc,CADd,yBFwkHJ,CnFvmHD,gCqFgBK,SAAU,CADV,kBF4lHJ,CnF3mHD,gCqFwBK,kBADA,UFwlHJ,CnF/mHD,kCqFgCK,aAAc,CADd,yBFolHJ,CnFnnHD,gCqFgBK,SAAU,CADV,UFwmHJ,CnFvnHD,gCqFwBK,UADA,UFomHJ,CnF3nHD,kCqFgCK,aAAc,CADd,iBFgmHJ,CACF,CAlhHA,0BnF9GC,eoFUG,aAAc,CACd,cACA,cD0nHF,CnFtoHD,oBoFeG,SD0nHF,CnFzoHD,oBoFkBG,UD0nHF,CnF5oHD,sBoFqBG,gBD0nHF,CnF/oHD,qBoFwBG,QD0nHF,CnFlpHD,eoFUG,aAAc,CACd,sBACA,sBD2oHF,CnFvpHD,oBoFeG,iBD2oHF,CnF1pHD,oBoFkBG,kBD2oHF,CnF7pHD,sBoFqBG,wBD2oHF,CnFhqHD,qBoFwBG,QD2oHF,CnFnqHD,eoFUG,aAAc,CACd,sBACA,sBD4pHF,CnFxqHD,oBoFeG,iBD4pHF,CnF3qHD,oBoFkBG,kBD4pHF,CnF9qHD,sBoFqBG,wBD4pHF,CnFjrHD,qBoFwBG,QD4pHF,CnFprHD,eoFUG,aAAc,CACd,eACA,eD6qHF,CnFzrHD,oBoFeG,UD6qHF,CnF5rHD,oBoFkBG,WD6qHF,CnF/rHD,sBoFqBG,iBD6qHF,CnFlsHD,qBoFwBG,QD6qHF,CnFrsHD,eoFUG,aAAc,CACd,sBACA,sBD8rHF,CnF1sHD,oBoFeG,iBD8rHF,CnF7sHD,oBoFkBG,kBD8rHF,CnFhtHD,sBoFqBG,wBD8rHF,CnFntHD,qBoFwBG,QD8rHF,CnFttHD,eoFUG,aAAc,CACd,sBACA,sBD+sHF,CnF3tHD,oBoFeG,iBD+sHF,CnF9tHD,oBoFkBG,kBD+sHF,CnFjuHD,sBoFqBG,wBD+sHF,CnFpuHD,qBoFwBG,QD+sHF,CnFvuHD,eoFUG,aAAc,CACd,aACA,aDguHF,CnF5uHD,oBoFeG,QDguHF,CnF/uHD,oBoFkBG,SDguHF,CnFlvHD,sBoFqBG,eDguHF,CnFrvHD,qBoFwBG,QDguHF,CnFxvHD,eoFUG,aAAc,CACd,sBACA,sBDivHF,CnF7vHD,oBoFeG,iBDivHF,CnFhwHD,oBoFkBG,kBDivHF,CnFnwHD,sBoFqBG,wBDivHF,CnFtwHD,qBoFwBG,QDivHF,CnFzwHD,eoFUG,aAAc,CACd,sBACA,sBDkwHF,CnF9wHD,oBoFeG,iBDkwHF,CnFjxHD,oBoFkBG,kBDkwHF,CnFpxHD,sBoFqBG,wBDkwHF,CnFvxHD,qBoFwBG,QDkwHF,CnF1xHD,eoFUG,aAAc,CACd,eACA,eDmxHF,CnF/xHD,oBoFeG,UDmxHF,CnFlyHD,oBoFkBG,WDmxHF,CnFryHD,sBoFqBG,iBDmxHF,CnFxyHD,qBoFwBG,QDmxHF,CnF3yHD,eoFUG,aAAc,CACd,sBACA,sBDoyHF,CnFhzHD,oBoFeG,iBDoyHF,CnFnzHD,oBoFkBG,kBDoyHF,CnFtzHD,sBoFqBG,wBDoyHF,CnFzzHD,qBoFwBG,QDoyHF,CnF5zHD,eoFUG,aAAc,CACd,sBACA,sBDqzHF,CnFj0HD,oBoFeG,iBDqzHF,CnFp0HD,oBoFkBG,kBDqzHF,CnFv0HD,sBoFqBG,wBDqzHF,CnF10HD,qBoFwBG,QDqzHF,CnF70HD,eoFUG,aAAc,CACd,aACA,aDs0HF,CnFl1HD,oBoFeG,QDs0HF,CnFr1HD,oBoFkBG,SDs0HF,CnFx1HD,sBoFqBG,eDs0HF,CnF31HD,qBoFwBG,QDs0HF,CnF91HD,eoFUG,aAAc,CACd,sBACA,sBDu1HF,CnFn2HD,oBoFeG,iBDu1HF,CnFt2HD,oBoFkBG,kBDu1HF,CnFz2HD,sBoFqBG,wBDu1HF,CnF52HD,qBoFwBG,QDu1HF,CnF/2HD,eoFUG,aAAc,CACd,sBACA,sBDw2HF,CnFp3HD,oBoFeG,iBDw2HF,CnFv3HD,oBoFkBG,kBDw2HF,CnF13HD,sBoFqBG,wBDw2HF,CnF73HD,qBoFwBG,QDw2HF,CnFh4HD,coFUG,aAAc,CACd,eACA,eDy3HF,CnFr4HD,mBoFeG,UDy3HF,CnFx4HD,mBoFkBG,WDy3HF,CnF34HD,qBoFqBG,iBDy3HF,CnF94HD,oBoFwBG,ODy3HF,CnFj5HD,coFUG,aAAc,CACd,sBACA,sBD04HF,CnFt5HD,mBoFeG,iBD04HF,CnFz5HD,mBoFkBG,kBD04HF,CnF55HD,qBoFqBG,wBD04HF,CnF/5HD,oBoFwBG,OD04HF,CnFl6HD,coFUG,aAAc,CACd,sBACA,sBD25HF,CnFv6HD,mBoFeG,iBD25HF,CnF16HD,mBoFkBG,kBD25HF,CnF76HD,qBoFqBG,wBD25HF,CnFh7HD,oBoFwBG,OD25HF,CnFn7HD,coFUG,aAAc,CACd,aACA,aD46HF,CnFx7HD,mBoFeG,QD46HF,CnF37HD,mBoFkBG,SD46HF,CnF97HD,qBoFqBG,eD46HF,CnFj8HD,oBoFwBG,OD46HF,CnFp8HD,coFUG,aAAc,CACd,sBACA,sBD67HF,CnFz8HD,mBoFeG,iBD67HF,CnF58HD,mBoFkBG,kBD67HF,CnF/8HD,qBoFqBG,wBD67HF,CnFl9HD,oBoFwBG,OD67HF,CnFr9HD,coFUG,aAAc,CACd,sBACA,sBD88HF,CnF19HD,mBoFeG,iBD88HF,CnF79HD,mBoFkBG,kBD88HF,CnFh+HD,qBoFqBG,wBD88HF,CnFn+HD,oBoFwBG,OD88HF,CnFt+HD,coFUG,aAAc,CACd,eACA,eD+9HF,CnF3+HD,mBoFeG,UD+9HF,CnF9+HD,mBoFkBG,WD+9HF,CnFj/HD,qBoFqBG,iBD+9HF,CnFp/HD,oBoFwBG,OD+9HF,CnFv/HD,coFUG,aAAc,CACd,qBACA,qBDg/HF,CnF5/HD,mBoFeG,gBDg/HF,CnF//HD,mBoFkBG,iBDg/HF,CnFlgID,qBoFqBG,uBDg/HF,CnFrgID,oBoFwBG,ODg/HF,CnFxgID,coFUG,aAAc,CACd,qBACA,qBDigIF,CnF7gID,mBoFeG,gBDigIF,CnFhhID,mBoFkBG,iBDigIF,CnFnhID,qBoFqBG,uBDigIF,CnFthID,oBoFwBG,ODigIF,CnFzhID,coF+BG,YD6/HF,CnF5hID,gBoFkCG,SD6/HF,CnF/hID,gBoFqCG,UD6/HF,CnFliID,mBoFwCG,SD6/HF,CnFriID,mBoF2CG,UD6/HF,CnFxiID,qBoF8CG,aD6/HF,CnF3iID,oBoFiDG,OD6/HF,CnF9iID,4BqFyCK,UFwgIJ,CnFjjID,4BqF+CK,SFqgIJ,CnFpjID,+BqFqDK,UFkgIJ,CnFvjID,+BqF2DK,SF+/HJ,CnF1jID,iCqFiEK,cF4/HJ,CnF7jID,+BqFgBK,SAAU,CADV,iBFkjIJ,CnFjkID,+BqFwBK,iBADA,UF8iIJ,CnFrkID,iCqFgCK,aAAc,CADd,wBF0iIJ,CnFzkID,+BqFgBK,SAAU,CADV,iBF8jIJ,CnF7kID,+BqFwBK,iBADA,UF0jIJ,CnFjlID,iCqFgCK,aAAc,CADd,wBFsjIJ,CnFrlID,+BqFgBK,SAAU,CADV,WF0kIJ,CnFzlID,+BqFwBK,WADA,UFskIJ,CnF7lID,iCqFgCK,aAAc,CADd,kBFkkIJ,CnFjmID,+BqFgBK,SAAU,CADV,kBFslIJ,CnFrmID,+BqFwBK,kBADA,UFklIJ,CnFzmID,iCqFgCK,aAAc,CADd,yBF8kIJ,CnF7mID,+BqFgBK,SAAU,CADV,kBFkmIJ,CnFjnID,+BqFwBK,kBADA,UF8lIJ,CnFrnID,iCqFgCK,aAAc,CADd,yBF0lIJ,CnFznID,+BqFgBK,SAAU,CADV,SF8mIJ,CnF7nID,+BqFwBK,SADA,UF0mIJ,CnFjoID,iCqFgCK,aAAc,CADd,gBFsmIJ,CnFroID,+BqFgBK,SAAU,CADV,kBF0nIJ,CnFzoID,+BqFwBK,kBADA,UFsnIJ,CnF7oID,iCqFgCK,aAAc,CADd,yBFknIJ,CnFjpID,+BqFgBK,SAAU,CADV,kBFsoIJ,CnFrpID,+BqFwBK,kBADA,UFkoIJ,CnFzpID,iCqFgCK,aAAc,CADd,yBF8nIJ,CnF7pID,+BqFgBK,SAAU,CADV,WFkpIJ,CnFjqID,+BqFwBK,WADA,UF8oIJ,CnFrqID,iCqFgCK,aAAc,CADd,kBF0oIJ,CnFzqID,gCqFgBK,SAAU,CADV,kBF8pIJ,CnF7qID,gCqFwBK,kBADA,UF0pIJ,CnFjrID,kCqFgCK,aAAc,CADd,yBFspIJ,CnFrrID,gCqFgBK,SAAU,CADV,kBF0qIJ,CnFzrID,gCqFwBK,kBADA,UFsqIJ,CnF7rID,kCqFgCK,aAAc,CADd,yBFkqIJ,CnFjsID,gCqFgBK,SAAU,CADV,SFsrIJ,CnFrsID,gCqFwBK,SADA,UFkrIJ,CnFzsID,kCqFgCK,aAAc,CADd,gBF8qIJ,CnF7sID,gCqFgBK,SAAU,CADV,kBFksIJ,CnFjtID,gCqFwBK,kBADA,UF8rIJ,CnFrtID,kCqFgCK,aAAc,CADd,yBF0rIJ,CnFztID,gCqFgBK,SAAU,CADV,kBF8sIJ,CnF7tID,gCqFwBK,kBADA,UF0sIJ,CnFjuID,kCqFgCK,aAAc,CADd,yBFssIJ,CnFruID,gCqFgBK,SAAU,CADV,WF0tIJ,CnFzuID,gCqFwBK,WADA,UFstIJ,CnF7uID,kCqFgCK,aAAc,CADd,kBFktIJ,CnFjvID,gCqFgBK,SAAU,CADV,kBFsuIJ,CnFrvID,gCqFwBK,kBADA,UFkuIJ,CnFzvID,kCqFgCK,aAAc,CADd,yBF8tIJ,CnF7vID,gCqFgBK,SAAU,CADV,kBFkvIJ,CnFjwID,gCqFwBK,kBADA,UF8uIJ,CnFrwID,kCqFgCK,aAAc,CADd,yBF0uIJ,CnFzwID,gCqFgBK,SAAU,CADV,SF8vIJ,CnF7wID,gCqFwBK,SADA,UF0vIJ,CnFjxID,kCqFgCK,aAAc,CADd,gBFsvIJ,CnFrxID,gCqFgBK,SAAU,CADV,kBF0wIJ,CnFzxID,gCqFwBK,kBADA,UFswIJ,CnF7xID,kCqFgCK,aAAc,CADd,yBFkwIJ,CnFjyID,gCqFgBK,SAAU,CADV,kBFsxIJ,CnFryID,gCqFwBK,kBADA,UFkxIJ,CnFzyID,kCqFgCK,aAAc,CADd,yBF8wIJ,CnF7yID,gCqFgBK,SAAU,CADV,WFkyIJ,CnFjzID,gCqFwBK,WADA,UF8xIJ,CnFrzID,kCqFgCK,aAAc,CADd,kBF0xIJ,CnFzzID,gCqFgBK,SAAU,CADV,kBF8yIJ,CnF7zID,gCqFwBK,kBADA,UF0yIJ,CnFj0ID,kCqFgCK,aAAc,CADd,yBFsyIJ,CnFr0ID,gCqFgBK,SAAU,CADV,kBF0zIJ,CnFz0ID,gCqFwBK,kBADA,UFszIJ,CnF70ID,kCqFgCK,aAAc,CADd,yBFkzIJ,CnFj1ID,gCqFgBK,SAAU,CADV,UFs0IJ,CnFr1ID,gCqFwBK,UADA,UFk0IJ,CnFz1ID,kCqFgCK,aAAc,CADd,iBF8zIJ,CACF,CAxuIA,0BnFtHC,gBoFUG,aAAc,CACd,cACA,cDw1IF,CnFp2ID,qBoFeG,SDw1IF,CnFv2ID,qBoFkBG,UDw1IF,CnF12ID,uBoFqBG,gBDw1IF,CnF72ID,sBoFwBG,QDw1IF,CnFh3ID,gBoFUG,aAAc,CACd,sBACA,sBDy2IF,CnFr3ID,qBoFeG,iBDy2IF,CnFx3ID,qBoFkBG,kBDy2IF,CnF33ID,uBoFqBG,wBDy2IF,CnF93ID,sBoFwBG,QDy2IF,CnFj4ID,gBoFUG,aAAc,CACd,sBACA,sBD03IF,CnFt4ID,qBoFeG,iBD03IF,CnFz4ID,qBoFkBG,kBD03IF,CnF54ID,uBoFqBG,wBD03IF,CnF/4ID,sBoFwBG,QD03IF,CnFl5ID,gBoFUG,aAAc,CACd,eACA,eD24IF,CnFv5ID,qBoFeG,UD24IF,CnF15ID,qBoFkBG,WD24IF,CnF75ID,uBoFqBG,iBD24IF,CnFh6ID,sBoFwBG,QD24IF,CnFn6ID,gBoFUG,aAAc,CACd,sBACA,sBD45IF,CnFx6ID,qBoFeG,iBD45IF,CnF36ID,qBoFkBG,kBD45IF,CnF96ID,uBoFqBG,wBD45IF,CnFj7ID,sBoFwBG,QD45IF,CnFp7ID,gBoFUG,aAAc,CACd,sBACA,sBD66IF,CnFz7ID,qBoFeG,iBD66IF,CnF57ID,qBoFkBG,kBD66IF,CnF/7ID,uBoFqBG,wBD66IF,CnFl8ID,sBoFwBG,QD66IF,CnFr8ID,gBoFUG,aAAc,CACd,aACA,aD87IF,CnF18ID,qBoFeG,QD87IF,CnF78ID,qBoFkBG,SD87IF,CnFh9ID,uBoFqBG,eD87IF,CnFn9ID,sBoFwBG,QD87IF,CnFt9ID,gBoFUG,aAAc,CACd,sBACA,sBD+8IF,CnF39ID,qBoFeG,iBD+8IF,CnF99ID,qBoFkBG,kBD+8IF,CnFj+ID,uBoFqBG,wBD+8IF,CnFp+ID,sBoFwBG,QD+8IF,CnFv+ID,gBoFUG,aAAc,CACd,sBACA,sBDg+IF,CnF5+ID,qBoFeG,iBDg+IF,CnF/+ID,qBoFkBG,kBDg+IF,CnFl/ID,uBoFqBG,wBDg+IF,CnFr/ID,sBoFwBG,QDg+IF,CnFx/ID,gBoFUG,aAAc,CACd,eACA,eDi/IF,CnF7/ID,qBoFeG,UDi/IF,CnFhgJD,qBoFkBG,WDi/IF,CnFngJD,uBoFqBG,iBDi/IF,CnFtgJD,sBoFwBG,QDi/IF,CnFzgJD,gBoFUG,aAAc,CACd,sBACA,sBDkgJF,CnF9gJD,qBoFeG,iBDkgJF,CnFjhJD,qBoFkBG,kBDkgJF,CnFphJD,uBoFqBG,wBDkgJF,CnFvhJD,sBoFwBG,QDkgJF,CnF1hJD,gBoFUG,aAAc,CACd,sBACA,sBDmhJF,CnF/hJD,qBoFeG,iBDmhJF,CnFliJD,qBoFkBG,kBDmhJF,CnFriJD,uBoFqBG,wBDmhJF,CnFxiJD,sBoFwBG,QDmhJF,CnF3iJD,gBoFUG,aAAc,CACd,aACA,aDoiJF,CnFhjJD,qBoFeG,QDoiJF,CnFnjJD,qBoFkBG,SDoiJF,CnFtjJD,uBoFqBG,eDoiJF,CnFzjJD,sBoFwBG,QDoiJF,CnF5jJD,gBoFUG,aAAc,CACd,sBACA,sBDqjJF,CnFjkJD,qBoFeG,iBDqjJF,CnFpkJD,qBoFkBG,kBDqjJF,CnFvkJD,uBoFqBG,wBDqjJF,CnF1kJD,sBoFwBG,QDqjJF,CnF7kJD,gBoFUG,aAAc,CACd,sBACA,sBDskJF,CnFllJD,qBoFeG,iBDskJF,CnFrlJD,qBoFkBG,kBDskJF,CnFxlJD,uBoFqBG,wBDskJF,CnF3lJD,sBoFwBG,QDskJF,CnF9lJD,eoFUG,aAAc,CACd,eACA,eDulJF,CnFnmJD,oBoFeG,UDulJF,CnFtmJD,oBoFkBG,WDulJF,CnFzmJD,sBoFqBG,iBDulJF,CnF5mJD,qBoFwBG,ODulJF,CnF/mJD,eoFUG,aAAc,CACd,sBACA,sBDwmJF,CnFpnJD,oBoFeG,iBDwmJF,CnFvnJD,oBoFkBG,kBDwmJF,CnF1nJD,sBoFqBG,wBDwmJF,CnF7nJD,qBoFwBG,ODwmJF,CnFhoJD,eoFUG,aAAc,CACd,sBACA,sBDynJF,CnFroJD,oBoFeG,iBDynJF,CnFxoJD,oBoFkBG,kBDynJF,CnF3oJD,sBoFqBG,wBDynJF,CnF9oJD,qBoFwBG,ODynJF,CnFjpJD,eoFUG,aAAc,CACd,aACA,aD0oJF,CnFtpJD,oBoFeG,QD0oJF,CnFzpJD,oBoFkBG,SD0oJF,CnF5pJD,sBoFqBG,eD0oJF,CnF/pJD,qBoFwBG,OD0oJF,CnFlqJD,eoFUG,aAAc,CACd,sBACA,sBD2pJF,CnFvqJD,oBoFeG,iBD2pJF,CnF1qJD,oBoFkBG,kBD2pJF,CnF7qJD,sBoFqBG,wBD2pJF,CnFhrJD,qBoFwBG,OD2pJF,CnFnrJD,eoFUG,aAAc,CACd,sBACA,sBD4qJF,CnFxrJD,oBoFeG,iBD4qJF,CnF3rJD,oBoFkBG,kBD4qJF,CnF9rJD,sBoFqBG,wBD4qJF,CnFjsJD,qBoFwBG,OD4qJF,CnFpsJD,eoFUG,aAAc,CACd,eACA,eD6rJF,CnFzsJD,oBoFeG,UD6rJF,CnF5sJD,oBoFkBG,WD6rJF,CnF/sJD,sBoFqBG,iBD6rJF,CnFltJD,qBoFwBG,OD6rJF,CnFrtJD,eoFUG,aAAc,CACd,qBACA,qBD8sJF,CnF1tJD,oBoFeG,gBD8sJF,CnF7tJD,oBoFkBG,iBD8sJF,CnFhuJD,sBoFqBG,uBD8sJF,CnFnuJD,qBoFwBG,OD8sJF,CnFtuJD,eoFUG,aAAc,CACd,qBACA,qBD+tJF,CnF3uJD,oBoFeG,gBD+tJF,CnF9uJD,oBoFkBG,iBD+tJF,CnFjvJD,sBoFqBG,uBD+tJF,CnFpvJD,qBoFwBG,OD+tJF,CnFvvJD,eoF+BG,YD2tJF,CnF1vJD,gBoFkCG,SD2tJF,CnF7vJD,gBoFqCG,UD2tJF,CnFhwJD,oBoFwCG,SD2tJF,CnFnwJD,oBoF2CG,UD2tJF,CnFtwJD,sBoF8CG,aD2tJF,CnFzwJD,qBoFiDG,OD2tJF,CnF5wJD,4BqFyCK,UFsuJJ,CnF/wJD,4BqF+CK,SFmuJJ,CnFlxJD,gCqFqDK,UFguJJ,CnFrxJD,gCqF2DK,SF6tJJ,CnFxxJD,kCqFiEK,cF0tJJ,CnF3xJD,gCqFgBK,SAAU,CADV,iBFgxJJ,CnF/xJD,gCqFwBK,iBADA,UF4wJJ,CnFnyJD,kCqFgCK,aAAc,CADd,wBFwwJJ,CnFvyJD,gCqFgBK,SAAU,CADV,iBF4xJJ,CnF3yJD,gCqFwBK,iBADA,UFwxJJ,CnF/yJD,kCqFgCK,aAAc,CADd,wBFoxJJ,CnFnzJD,gCqFgBK,SAAU,CADV,WFwyJJ,CnFvzJD,gCqFwBK,WADA,UFoyJJ,CnF3zJD,kCqFgCK,aAAc,CADd,kBFgyJJ,CnF/zJD,gCqFgBK,SAAU,CADV,kBFozJJ,CnFn0JD,gCqFwBK,kBADA,UFgzJJ,CnFv0JD,kCqFgCK,aAAc,CADd,yBF4yJJ,CnF30JD,gCqFgBK,SAAU,CADV,kBFg0JJ,CnF/0JD,gCqFwBK,kBADA,UF4zJJ,CnFn1JD,kCqFgCK,aAAc,CADd,yBFwzJJ,CnFv1JD,gCqFgBK,SAAU,CADV,SF40JJ,CnF31JD,gCqFwBK,SADA,UFw0JJ,CnF/1JD,kCqFgCK,aAAc,CADd,gBFo0JJ,CnFn2JD,gCqFgBK,SAAU,CADV,kBFw1JJ,CnFv2JD,gCqFwBK,kBADA,UFo1JJ,CnF32JD,kCqFgCK,aAAc,CADd,yBFg1JJ,CnF/2JD,gCqFgBK,SAAU,CADV,kBFo2JJ,CnFn3JD,gCqFwBK,kBADA,UFg2JJ,CnFv3JD,kCqFgCK,aAAc,CADd,yBF41JJ,CnF33JD,gCqFgBK,SAAU,CADV,WFg3JJ,CnF/3JD,gCqFwBK,WADA,UF42JJ,CnFn4JD,kCqFgCK,aAAc,CADd,kBFw2JJ,CnFv4JD,iCqFgBK,SAAU,CADV,kBF43JJ,CnF34JD,iCqFwBK,kBADA,UFw3JJ,CnF/4JD,mCqFgCK,aAAc,CADd,yBFo3JJ,CnFn5JD,iCqFgBK,SAAU,CADV,kBFw4JJ,CnFv5JD,iCqFwBK,kBADA,UFo4JJ,CnF35JD,mCqFgCK,aAAc,CADd,yBFg4JJ,CnF/5JD,iCqFgBK,SAAU,CADV,SFo5JJ,CnFn6JD,iCqFwBK,SADA,UFg5JJ,CnFv6JD,mCqFgCK,aAAc,CADd,gBF44JJ,CnF36JD,iCqFgBK,SAAU,CADV,kBFg6JJ,CnF/6JD,iCqFwBK,kBADA,UF45JJ,CnFn7JD,mCqFgCK,aAAc,CADd,yBFw5JJ,CnFv7JD,iCqFgBK,SAAU,CADV,kBF46JJ,CnF37JD,iCqFwBK,kBADA,UFw6JJ,CnF/7JD,mCqFgCK,aAAc,CADd,yBFo6JJ,CnFn8JD,iCqFgBK,SAAU,CADV,WFw7JJ,CnFv8JD,iCqFwBK,WADA,UFo7JJ,CnF38JD,mCqFgCK,aAAc,CADd,kBFg7JJ,CnF/8JD,iCqFgBK,SAAU,CADV,kBFo8JJ,CnFn9JD,iCqFwBK,kBADA,UFg8JJ,CnFv9JD,mCqFgCK,aAAc,CADd,yBF47JJ,CnF39JD,iCqFgBK,SAAU,CADV,kBFg9JJ,CnF/9JD,iCqFwBK,kBADA,UF48JJ,CnFn+JD,mCqFgCK,aAAc,CADd,yBFw8JJ,CnFv+JD,iCqFgBK,SAAU,CADV,SF49JJ,CnF3+JD,iCqFwBK,SADA,UFw9JJ,CnF/+JD,mCqFgCK,aAAc,CADd,gBFo9JJ,CnFn/JD,iCqFgBK,SAAU,CADV,kBFw+JJ,CnFv/JD,iCqFwBK,kBADA,UFo+JJ,CnF3/JD,mCqFgCK,aAAc,CADd,yBFg+JJ,CnF//JD,iCqFgBK,SAAU,CADV,kBFo/JJ,CnFngKD,iCqFwBK,kBADA,UFg/JJ,CnFvgKD,mCqFgCK,aAAc,CADd,yBF4+JJ,CnF3gKD,iCqFgBK,SAAU,CADV,WFggKJ,CnF/gKD,iCqFwBK,WADA,UF4/JJ,CnFnhKD,mCqFgCK,aAAc,CADd,kBFw/JJ,CnFvhKD,iCqFgBK,SAAU,CADV,kBF4gKJ,CnF3hKD,iCqFwBK,kBADA,UFwgKJ,CnF/hKD,mCqFgCK,aAAc,CADd,yBFogKJ,CnFniKD,iCqFgBK,SAAU,CADV,kBFwhKJ,CnFviKD,iCqFwBK,kBADA,UFohKJ,CnF3iKD,mCqFgCK,aAAc,CADd,yBFghKJ,CnF/iKD,iCqFgBK,SAAU,CADV,UFoiKJ,CnFnjKD,iCqFwBK,UADA,UFgiKJ,CnFvjKD,mCqFgCK,aAAc,CADd,iBF4hKJ,CACF,CEvjKE,aACE,aFyjKJ,C/D/jKC,cNSC,oCwEDA,yBACA,yBACA,eAAgB,CAChB,kBxEVA,qBAAsB,CAGtB,gBACA,eACA,0BACA,mBACA,eAAgB,CANhB,QAAS,CACT,SwEeF,CALE,iCACE,+BAOJ,ClErBC,6GkEmBO,yBAMR,CAZE,sDAcI,sBAAuB,CAEvB,gBAEA,cAAe,CANf,YAAa,CACb,gBAAiB,CAIjB,mBAFA,kBAJA,iBAAkB,CAQlB,gCAIN,CAvBE,0EAsBM,oBAAqB,CAErB,eADA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,oBDDN,C/EjCC,0CiFOG,WF6BJ,C/EpCC,4CiFUG,QAAS,CAGT,WF2BJ,C/ExCC,+JiFmBG,cFyBJ,C/E5CC,kCkF0CG,qBHKJ,CGHI,8CACE,WHKN,C/ElDC,yDkFiDK,UHIN,C/ErDC,2GkFWC,mBADA,gBAGA,eAAgB,CADhB,kBHiDF,C/E7DC,6HkFgBG,QHkDJ,CGhDI,+IACE,YHoDN,C/EvEC,kJmFyMG,gBJ7HJ,CGfA,yBlF7DC,oCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBHuEA,C/EnFD,0CkFgBG,QHsEF,CGpEE,gDACE,YHsEJ,C/EzFD,iDmFyMG,gBJ7GF,C/E5FD,yBkF8BK,cHiEJ,C/E/FD,8FkFiCO,aAAc,CACd,cHkEN,C/EpGD,mCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBH8FA,C/E1GD,yCkFgBG,QH6FF,CG3FE,+CACE,YH6FJ,C/EhHD,gDmFyMG,gBJtFF,CACF,CGhDA,yBlFpEC,mCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBH+GA,C/E3HD,yCkFgBG,QH8GF,CG5GE,+CACE,YH8GJ,C/EjID,gDmFyMG,gBJrEF,CACF,CG3DA,yBlF1EC,mCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBHgIA,C/E5ID,yCkFgBG,QH+HF,CG7HE,+CACE,YH+HJ,C/ElJD,gDmFyMG,gBJpDF,CACF,CGtEA,0BlFhFC,mCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBHiJA,C/E7JD,yCkFgBG,QHgJF,CG9IE,+CACE,YHgJJ,C/EnKD,gDmFyMG,gBJnCF,CACF,CGjFA,0BlFtFC,mCkFWC,mBADA,gBAGA,eAAgB,CADhB,kBHkKA,C/E9KD,yCkFgBG,QHiKF,CG/JE,+CACE,YHiKJ,C/EpLD,gDmFyMG,gBJlBF,CACF,CKxKI,6BACE,aL8KN,CK3KI,+BACE,aL6KN,CKzKE,wCAGI,gBLyKN,CKpKE,gDCvBE,aN8LJ,CKlKE,8CC5BE,aNiMJ,C/E3MC,UNSC,oCARA,qBAAsB,CAGtB,gBACA,eACA,0BACA,mBACA,eAAgB,CANhB,QAAS,CACT,SqFmNF,C/EtNC,iBqF0BG,QAAS,CACT,gCAJA,gBAJA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X,QAAS,CAIT,iBAAkB,CANlB,iBAAkB,CAOlB,iBAAkB,CANlB,QAAS,CAOT,wBAAyB,CAJzB,SNsdN,ClKzkBC,kNwKmIG,iBN4cJ,CO9kBE,eACE,aPglBJ,ClKllBC,8CyKUK,eAAgB,CADhB,cP6kBN,ClKtlBC,oCyKiBK,SAAU,CADV,OP0kBN,ClK1lBC,qCyKwBK,iBAAkB,CADlB,ePukBN,ClK9lBC,8DyK6BO,UAAW,CAEX,aAAc,CADd,gBPqkBR,ClKnmBC,2CyKsCO,SAAU,CADV,UPkkBR,ClKvmBC,mFyKgDK,cAAe,CADf,kBP4jBN,ClK3mBC,+FyKqDO,ePyjBR,ClK9mBC,oHyK2DO,cPsjBR,ClKjnBC,2EyKuEO,SAAU,CADV,UP+iBR,ClKrnBC,8EyKoFS,aAAc,CADd,kBPsiBV,ClKznBC,8DyK8FO,aAAc,CADd,kBAAmB,CAEnB,gBP+hBR,ClK9nBC,oFyKoGS,cP6hBV,ClKjoBC,0DyK4GO,SAAU,CAEV,aAAc,CADd,iBAAkB,CAFlB,UAAW,CAIX,wBPyhBR,ClKxoBC,mGyK2HK,cAAe,CADf,kBPkhBN,ClK5oBC,+GyKgIO,eP+gBR,ClK/oBC,qDyKwIK,iBAAkB,CADlB,eP4gBN,ClKnpBC,uEyKkJO,WAAY,CAEZ,iBADA,cPqgBR,ClKxpBC,iGyK8JK,SAAU,CADV,UP+fN,ClK5pBC,iGyKsKO,SAAU,CADV,UP2fR,ClKhqBC,8DyKiLO,cPkfR,ClKnqBC,oHyK6LO,iBP0eR,ClKvqBC,gIyKmMS,aAAc,CADd,iBP0eV,ClK5qBC,0KyK2MO,SAAU,CADV,SPueR,ClKjrBC,oHyKkNO,aAAc,CADd,iBPqeR,ClKtrBC,4JyKuNS,WPueV,ClK9rBC,wKyK8NW,SAAU,CADV,WPseZ,ClKnsBC,qEyK0OK,gBAAiB,CADjB,cP8dN,ClKvsBC,+GyKkPK,SAAU,CADV,UP0dN,ClK3sBC,gGyKyPK,SAAU,CADV,OPudN,ClK/sBC,4FyKgQK,SAAU,CADV,UPodN,ClKntBC,mHyKyQG,cAAe,CADf,iBP+cJ,ClKvtBC,yIyK2QK,iBP+cN,ClK1tBC,yC0KIG,eRytBJ,ClK7tBC,8D0K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ACE,yBFktBJ,CGlvBE,sCACE,aHuvBJ,C9KtwBC,wCiLoBK,gBHqvBN,C9KzwBC,0EiL8BW,iBH8uBZ,C9K5wBC,2JiLqCW,MAAO,CADP,UH4uBZ,C9KhxBC,8CiL0CS,gBHyuBV,CGluBE,2EAKQ,6BHguBV,C9KtxBC,oEiLgEO,wBHytBR,C9KzxBC,qEiLsEO,0BHstBR,C9K5xBC,gDiLmFK,aAAc,CADd,gBH8sBN,C9KhyBC,sDiL0FK,4BHysBN,C9KnyBC,kGiLiGO,mBHqsBR,C9KtyBC,iDiLwGK,yBHisBN,C9KzyBC,wUiLqHS,cAAe,CADf,iBH4rBV,C9KhzBC,4CiL8HK,iBHqrBN,C9KnzBC,+FiL2IK,WH8qBN,C9KzzBC,wEiLiJO,gBADA,cH6qBR,C9K7zBC,wDiLuJO,wBHyqBR,C9Kh0BC,mEiL6JO,wBHsqBR,C9Kn0BC,kEiLmKO,sBHmqBR,C1Jt0BC,gD8JOG,iBCiBJ,CDdI,uDAIE,UAAW,CAGX,UAAW,CAFX,MAAO,CAGP,mBAAoB,CAPpB,iBAAkB,CAElB,OAAQ,CADR,KAAM,CAIN,+BCkBN,CDZM,6DACE,kBCcR,C/JrCC,kD8J6BK,SCWN,C/JxCC,mE8JkCK,oBCSN,C/J3CC,+E8JuCK,eAAgB,CAChB,oFCON,CDLM,qFACE,gBCOR,C/JlDC,sG8JgDO,gBAAuB,CADvB,UCOR,CDAM,sIAEE,kBCER,CDLI,4EAQI,UCAR,CDRI,wFAcI,gBAAuB,CADvB,UCDR,C/JjEC,mBNSC,oCARA,qBAAsB,CAGtB,gBgESE,cAAe,ChERjB,eACA,0BACA,mBgEGE,aAAc,ChEFhB,eAAgB,CANhB,QAAS,CgEUP,YAAa,ChETf,SAAU,CgEKR,iBAAkB,CAClB,QAAU,CAEV,kBqGuEJ,C/JlFC,oK0DkBK,oBqGqEN,CrGlEI,iCASE,4CAA8C,CAC9C,6BAA8B,CAJ9B,yBACA,kBAIA,UAAW,CANX,WAAY,CAFZ,MAAO,CAFP,iBAAkB,CAClB,KAAM,CAMN,iBAAkB,CAJlB,UqG2EN,C/JpGC,yF0DqCK,kBqGmEN,CrGhEI,yBAQE,sBACA,yBAIA,uBAAyB,CAHzB,kBAHA,aAAc,CAHd,aAAc,C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","sources":["index.css","App.css","../node_modules/antd/dist/antd.css","../antd/components/style/core/base.less","../antd/components/style/index.less","../antd/components/style/color/tinyColor.less","../antd/components/style/mixins/size.less","../antd/components/style/core/global.less","../antd/components/style/mixins/clearfix.less","../antd/components/style/mixins/iconfont.less","../antd/components/style/core/iconfont.less","../antd/components/style/mixins/motion.less","../antd/components/style/core/motion/fade.less","../antd/components/style/core/motion/move.less","../antd/components/style/core/motion/other.less","../antd/components/style/core/motion/slide.less","../antd/components/style/core/motion/zoom.less","../antd/components/style/core/motion.less","../antd/components/affix/style/index.less","../antd/components/style/mixins/reset.less","../antd/components/alert/style/index.less","../antd/components/alert/style/rtl.less","../antd/components/anchor/style/index.less","../antd/components/anchor/style/rtl.less","../antd/components/auto-complete/style/index.less","../antd/components/style/color/bezierEasing.less","../antd/components/select/style/single.less","../antd/components/select/style/index.less","../antd/components/select/style/multiple.less","../antd/components/select/style/status.less","../antd/components/input/style/mixin.less","../antd/components/select/style/rtl.less","../antd/components/empty/style/index.less","../antd/components/empty/style/rtl.less","../antd/components/avatar/style/index.less","../antd/components/avatar/style/group.less","../antd/components/avatar/style/rtl.less","../antd/components/popover/style/index.less","../antd/components/style/mixins/rounded-arrow.less","../antd/components/popover/style/rtl.less","../antd/components/back-top/style/index.less","../antd/components/back-top/style/responsive.less","../antd/components/badge/style/index.less","../antd/components/badge/style/ribbon.less","../antd/components/badge/style/rtl.less","../antd/components/breadcrumb/style/index.less","../antd/components/breadcrumb/style/rtl.less","../antd/components/dropdown/style/status.less","../antd/components/dropdown/style/index.less","../antd/components/dropdown/style/rtl.less","../antd/components/button/style/mixin.less","../antd/components/button/style/index.less","../antd/components/button/style/rtl.less","../antd/components/menu/style/status.less","../antd/components/menu/style/index.less","../antd/components/menu/style/light.less","../antd/components/menu/style/dark.less","../antd/components/menu/style/rtl.less","../antd/components/tooltip/style/index.less","../antd/components/tooltip/style/rtl.less","../antd/components/calendar/style/index.less","../antd/components/calendar/style/rtl.less","../antd/components/date-picker/style/status.less","../antd/components/date-picker/style/index.less","../antd/components/style/mixins/compatibility.less","../antd/components/date-picker/style/panel.less","../antd/components/date-picker/style/rtl.less","../antd/components/tag/style/index.less","../antd/components/tag/style/rtl.less","../antd/components/radio/style/index.less","../antd/components/radio/style/rtl.less","../antd/components/card/style/index.less","../antd/components/card/style/size.less","../antd/components/skeleton/style/index.less","../antd/components/skeleton/style/rtl.less","../antd/components/tabs/style/size.less","../antd/components/tabs/style/index.less","../antd/components/tabs/style/rtl.less","../antd/components/tabs/style/position.less","../antd/components/tabs/style/dropdown.less","../antd/components/tabs/style/card.less","../antd/components/carousel/style/index.less","../antd/components/carousel/style/rtl.less","../antd/components/checkbox/style/mixin.less","../antd/components/cascader/style/index.less","../antd/components/cascader/style/rtl.less","../antd/components/checkbox/style/index.less","../antd/components/checkbox/style/rtl.less","../antd/components/grid/style/index.less","../antd/components/grid/style/mixin.less","../antd/components/grid/style/rtl.less","../antd/components/collapse/style/index.less","../antd/components/collapse/style/rtl.less","../antd/components/comment/style/index.less","../antd/components/comment/style/rtl.less","../antd/components/descriptions/style/index.less","../antd/components/descriptions/style/rtl.less","../antd/components/divider/style/index.less","../antd/components/divider/style/rtl.less","../antd/components/drawer/style/drawer.less","../antd/components/drawer/style/index.less","../antd/components/drawer/style/motion.less","../antd/components/drawer/style/rtl.less","../antd/components/form/style/components.less","../antd/components/form/style/index.less","../antd/components/form/style/inline.less","../antd/components/form/style/horizontal.less","../antd/components/form/style/vertical.less","../antd/components/form/style/rtl.less","../antd/components/form/style/status.less","../antd/components/form/style/mixin.less","../antd/components/image/style/index.less","../antd/components/style/mixins/box.less","../antd/components/style/mixins/modal-mask.less","../antd/components/input-number/style/affix.less","../antd/components/input-number/style/index.less","../antd/components/input-number/style/status.less","../antd/components/input-number/style/rtl.less","../antd/components/input/style/affix.less","../antd/components/input/style/index.less","../antd/components/input/style/rtl.less","../antd/components/input/style/allow-clear.less","../antd/components/input/style/status.less","../antd/components/input/style/search-input.less","../antd/components/input/style/IE11.less","../antd/components/layout/style/index.less","../antd/components/layout/style/light.less","../antd/components/layout/style/rtl.less","../antd/components/list/style/index.less","../antd/components/list/style/bordered.less","../antd/components/list/style/responsive.less","../antd/components/list/style/rtl.less","../antd/components/pagination/style/index.less","../antd/components/pagination/style/rtl.less","../antd/components/spin/style/index.less","../antd/components/spin/style/rtl.less","../antd/components/mentions/style/index.less","../antd/components/mentions/style/status.less","../antd/components/mentions/style/rtl.less","../antd/components/message/style/index.less","../antd/components/message/style/rtl.less","../antd/components/modal/style/modal.less","../antd/components/modal/style/index.less","../antd/components/modal/style/confirm.less","../antd/components/modal/style/rtl.less","../antd/components/notification/style/index.less","../antd/components/notification/style/rtl.less","../antd/components/notification/style/placement.less","../antd/components/page-header/style/index.less","../antd/components/style/mixins/operation-unit.less","../antd/components/page-header/style/rtl.less","../antd/components/space/style/index.less","../antd/components/space/style/rtl.less","../antd/components/popconfirm/style/index.less","../antd/components/progress/style/index.less","../antd/components/progress/style/rtl.less","../antd/components/rate/style/index.less","../antd/components/rate/style/rtl.less","../antd/components/result/style/index.less","../antd/components/result/style/rtl.less","../antd/components/segmented/style/mixins.less","../antd/components/segmented/style/index.less","../antd/components/segmented/style/rtl.less","../antd/components/slider/style/index.less","../antd/components/slider/style/rtl.less","../antd/components/statistic/style/index.less","../antd/components/statistic/style/rtl.less","../antd/components/steps/style/index.less","../antd/components/steps/style/custom-icon.less","../antd/components/steps/style/small.less","../antd/components/steps/style/vertical.less","../antd/components/steps/style/label-placement.less","../antd/components/steps/style/progress-dot.less","../antd/components/steps/style/nav.less","../antd/components/steps/style/rtl.less","../antd/components/steps/style/progress.less","../antd/components/switch/style/index.less","../antd/components/switch/style/rtl.less","../antd/components/table/style/size.less","../antd/components/table/style/index.less","../antd/components/table/style/bordered.less","../antd/components/table/style/radius.less","../antd/components/table/style/rtl.less","../antd/components/tree/style/directory.less","../antd/components/tree/style/index.less","../antd/components/tree/style/mixin.less","../antd/components/tree/style/rtl.less","../antd/components/timeline/style/index.less","../antd/components/timeline/style/rtl.less","../antd/components/transfer/style/customize.less","../antd/components/transfer/style/index.less","../antd/components/transfer/style/status.less","../antd/components/transfer/style/rtl.less","../antd/components/tree-select/style/index.less","../antd/components/typography/style/index.less","../antd/components/style/mixins/typography.less","../antd/components/typography/style/rtl.less","../antd/components/upload/style/index.less","../antd/components/upload/style/rtl.less","../node_modules/cytoscape-context-menus/cytoscape-context-menus.css","features/cy/style.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}","body,\nhtml,\n#root {\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-family: sans-serif;\n overflow: hidden;\n}\n\n.react-flow__attribution {\n display: none;\n}","/*!\n * \n * antd v4.22.1\n * \n * Copyright 2015-present, Alipay, Inc.\n * All rights reserved.\n * \n */\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n[class^=ant-]::-ms-clear,\n[class*= ant-]::-ms-clear,\n[class^=ant-] input::-ms-clear,\n[class*= ant-] input::-ms-clear,\n[class^=ant-] input::-ms-reveal,\n[class*= ant-] input::-ms-reveal {\n display: none;\n}\n/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */\nhtml,\nbody {\n width: 100%;\n height: 100%;\n}\ninput::-ms-clear,\ninput::-ms-reveal {\n display: none;\n}\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n@-ms-viewport {\n width: device-width;\n}\nbody {\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n font-variant: tabular-nums;\n line-height: 1.5715;\n background-color: #fff;\n font-feature-settings: 'tnum';\n}\n[tabindex='-1']:focus {\n outline: none !important;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n}\np {\n margin-top: 0;\n margin-bottom: 1em;\n}\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n border-bottom: 0;\n cursor: help;\n}\naddress {\n margin-bottom: 1em;\n font-style: normal;\n line-height: inherit;\n}\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n -webkit-appearance: none;\n}\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1em;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\ndt {\n font-weight: 500;\n}\ndd {\n margin-bottom: 0.5em;\n margin-left: 0;\n}\nblockquote {\n margin: 0 0 1em;\n}\ndfn {\n font-style: italic;\n}\nb,\nstrong {\n font-weight: bolder;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\na {\n color: #1890ff;\n text-decoration: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n -webkit-text-decoration-skip: objects;\n}\na:hover {\n color: #40a9ff;\n}\na:active {\n color: #096dd9;\n}\na:active,\na:hover {\n text-decoration: none;\n outline: 0;\n}\na:focus {\n text-decoration: none;\n outline: 0;\n}\na[disabled] {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\npre,\ncode,\nkbd,\nsamp {\n font-size: 1em;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n}\npre {\n margin-top: 0;\n margin-bottom: 1em;\n overflow: auto;\n}\nfigure {\n margin: 0 0 1em;\n}\nimg {\n vertical-align: middle;\n border-style: none;\n}\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\ntable {\n border-collapse: collapse;\n}\ncaption {\n padding-top: 0.75em;\n padding-bottom: 0.3em;\n color: rgba(0, 0, 0, 0.45);\n text-align: left;\n caption-side: bottom;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\nbutton,\ninput {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\ninput[type='radio'],\ninput[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n -webkit-appearance: listbox;\n}\ntextarea {\n overflow: auto;\n resize: vertical;\n}\nfieldset {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: 0.5em;\n padding: 0;\n color: inherit;\n font-size: 1.5em;\n line-height: inherit;\n white-space: normal;\n}\nprogress {\n vertical-align: baseline;\n}\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n[type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\noutput {\n display: inline-block;\n}\nsummary {\n display: list-item;\n}\ntemplate {\n display: none;\n}\n[hidden] {\n display: none !important;\n}\nmark {\n padding: 0.2em;\n background-color: #feffe6;\n}\n::-moz-selection {\n color: #fff;\n background: #1890ff;\n}\n::selection {\n color: #fff;\n background: #1890ff;\n}\n.clearfix::before {\n display: table;\n content: '';\n}\n.clearfix::after {\n display: table;\n clear: both;\n content: '';\n}\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.anticon > * {\n line-height: 1;\n}\n.anticon svg {\n display: inline-block;\n}\n.anticon::before {\n display: none;\n}\n.anticon .anticon-icon {\n display: block;\n}\n.anticon > .anticon {\n line-height: 0;\n vertical-align: 0;\n}\n.anticon[tabindex] {\n cursor: pointer;\n}\n.anticon-spin,\n.anticon-spin::before {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-fade-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-fade-enter.ant-fade-enter-active,\n.ant-fade-appear.ant-fade-appear-active {\n -webkit-animation-name: antFadeIn;\n animation-name: antFadeIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-fade-leave.ant-fade-leave-active {\n -webkit-animation-name: antFadeOut;\n animation-name: antFadeOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n opacity: 0;\n -webkit-animation-timing-function: linear;\n animation-timing-function: linear;\n}\n.ant-fade-leave {\n -webkit-animation-timing-function: linear;\n animation-timing-function: linear;\n}\n@-webkit-keyframes antFadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes antFadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@-webkit-keyframes antFadeOut {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes antFadeOut {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-up-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-up-enter.ant-move-up-enter-active,\n.ant-move-up-appear.ant-move-up-appear-active {\n -webkit-animation-name: antMoveUpIn;\n animation-name: antMoveUpIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-move-up-leave.ant-move-up-leave-active {\n -webkit-animation-name: antMoveUpOut;\n animation-name: antMoveUpOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-up-leave {\n -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-down-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-down-enter.ant-move-down-enter-active,\n.ant-move-down-appear.ant-move-down-appear-active {\n -webkit-animation-name: antMoveDownIn;\n animation-name: antMoveDownIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-move-down-leave.ant-move-down-leave-active {\n -webkit-animation-name: antMoveDownOut;\n animation-name: antMoveDownOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-down-leave {\n -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-left-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-left-enter.ant-move-left-enter-active,\n.ant-move-left-appear.ant-move-left-appear-active {\n -webkit-animation-name: antMoveLeftIn;\n animation-name: antMoveLeftIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-move-left-leave.ant-move-left-leave-active {\n -webkit-animation-name: antMoveLeftOut;\n animation-name: antMoveLeftOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-left-leave {\n -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-right-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-move-right-enter.ant-move-right-enter-active,\n.ant-move-right-appear.ant-move-right-appear-active {\n -webkit-animation-name: antMoveRightIn;\n animation-name: antMoveRightIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-move-right-leave.ant-move-right-leave-active {\n -webkit-animation-name: antMoveRightOut;\n animation-name: antMoveRightOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-right-leave {\n -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n@-webkit-keyframes antMoveDownIn {\n 0% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveDownIn {\n 0% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes antMoveDownOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveDownOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@-webkit-keyframes antMoveLeftIn {\n 0% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveLeftIn {\n 0% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes antMoveLeftOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveLeftOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@-webkit-keyframes antMoveRightIn {\n 0% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveRightIn {\n 0% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes antMoveRightOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveRightOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@-webkit-keyframes antMoveUpIn {\n 0% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveUpIn {\n 0% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes antMoveUpOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveUpOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@-webkit-keyframes loadingCircle {\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes loadingCircle {\n 100% {\n transform: rotate(360deg);\n }\n}\n[ant-click-animating='true'],\n[ant-click-animating-without-extra-node='true'] {\n position: relative;\n}\nhtml {\n --antd-wave-shadow-color: #1890ff;\n --scroll-bar: 0;\n}\n[ant-click-animating-without-extra-node='true']::after,\n.ant-click-animating-node {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n border-radius: inherit;\n box-shadow: 0 0 0 0 #1890ff;\n box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);\n opacity: 0.2;\n -webkit-animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);\n animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);\n -webkit-animation-fill-mode: forwards;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n@-webkit-keyframes waveEffect {\n 100% {\n box-shadow: 0 0 0 #1890ff;\n box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);\n }\n}\n@keyframes waveEffect {\n 100% {\n box-shadow: 0 0 0 #1890ff;\n box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);\n }\n}\n@-webkit-keyframes fadeEffect {\n 100% {\n opacity: 0;\n }\n}\n@keyframes fadeEffect {\n 100% {\n opacity: 0;\n }\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-up-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-up-enter.ant-slide-up-enter-active,\n.ant-slide-up-appear.ant-slide-up-appear-active {\n -webkit-animation-name: antSlideUpIn;\n animation-name: antSlideUpIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-slide-up-leave.ant-slide-up-leave-active {\n -webkit-animation-name: antSlideUpOut;\n animation-name: antSlideUpOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-up-leave {\n -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-down-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-down-enter.ant-slide-down-enter-active,\n.ant-slide-down-appear.ant-slide-down-appear-active {\n -webkit-animation-name: antSlideDownIn;\n animation-name: antSlideDownIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-slide-down-leave.ant-slide-down-leave-active {\n -webkit-animation-name: antSlideDownOut;\n animation-name: antSlideDownOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-down-leave {\n -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-left-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-left-enter.ant-slide-left-enter-active,\n.ant-slide-left-appear.ant-slide-left-appear-active {\n -webkit-animation-name: antSlideLeftIn;\n animation-name: antSlideLeftIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-slide-left-leave.ant-slide-left-leave-active {\n -webkit-animation-name: antSlideLeftOut;\n animation-name: antSlideLeftOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-left-leave {\n -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-right-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-slide-right-enter.ant-slide-right-enter-active,\n.ant-slide-right-appear.ant-slide-right-appear-active {\n -webkit-animation-name: antSlideRightIn;\n animation-name: antSlideRightIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-slide-right-leave.ant-slide-right-leave-active {\n -webkit-animation-name: antSlideRightOut;\n animation-name: antSlideRightOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-right-leave {\n -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n@-webkit-keyframes antSlideUpIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideUpIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@-webkit-keyframes antSlideUpOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@keyframes antSlideUpOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antSlideDownIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n}\n@keyframes antSlideDownIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n}\n@-webkit-keyframes antSlideDownOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n}\n@keyframes antSlideDownOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antSlideLeftIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideLeftIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@-webkit-keyframes antSlideLeftOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@keyframes antSlideLeftOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antSlideRightIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideRightIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n}\n@-webkit-keyframes antSlideRightOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n}\n@keyframes antSlideRightOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-enter.ant-zoom-enter-active,\n.ant-zoom-appear.ant-zoom-appear-active {\n -webkit-animation-name: antZoomIn;\n animation-name: antZoomIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-leave.ant-zoom-leave-active {\n -webkit-animation-name: antZoomOut;\n animation-name: antZoomOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-enter-prepare,\n.ant-zoom-appear-prepare {\n transform: none;\n}\n.ant-zoom-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-big-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-big-enter.ant-zoom-big-enter-active,\n.ant-zoom-big-appear.ant-zoom-big-appear-active {\n -webkit-animation-name: antZoomBigIn;\n animation-name: antZoomBigIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-big-leave.ant-zoom-big-leave-active {\n -webkit-animation-name: antZoomBigOut;\n animation-name: antZoomBigOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-enter-prepare,\n.ant-zoom-big-appear-prepare {\n transform: none;\n}\n.ant-zoom-big-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-big-fast-leave {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,\n.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {\n -webkit-animation-name: antZoomBigIn;\n animation-name: antZoomBigIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {\n -webkit-animation-name: antZoomBigOut;\n animation-name: antZoomBigOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-fast-enter-prepare,\n.ant-zoom-big-fast-appear-prepare {\n transform: none;\n}\n.ant-zoom-big-fast-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-up-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-up-enter.ant-zoom-up-enter-active,\n.ant-zoom-up-appear.ant-zoom-up-appear-active {\n -webkit-animation-name: antZoomUpIn;\n animation-name: antZoomUpIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-up-leave.ant-zoom-up-leave-active {\n -webkit-animation-name: antZoomUpOut;\n animation-name: antZoomUpOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-up-enter-prepare,\n.ant-zoom-up-appear-prepare {\n transform: none;\n}\n.ant-zoom-up-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-down-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-down-enter.ant-zoom-down-enter-active,\n.ant-zoom-down-appear.ant-zoom-down-appear-active {\n -webkit-animation-name: antZoomDownIn;\n animation-name: antZoomDownIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-down-leave.ant-zoom-down-leave-active {\n -webkit-animation-name: antZoomDownOut;\n animation-name: antZoomDownOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-down-enter-prepare,\n.ant-zoom-down-appear-prepare {\n transform: none;\n}\n.ant-zoom-down-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-left-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-left-enter.ant-zoom-left-enter-active,\n.ant-zoom-left-appear.ant-zoom-left-appear-active {\n -webkit-animation-name: antZoomLeftIn;\n animation-name: antZoomLeftIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-left-leave.ant-zoom-left-leave-active {\n -webkit-animation-name: antZoomLeftOut;\n animation-name: antZoomLeftOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-left-enter-prepare,\n.ant-zoom-left-appear-prepare {\n transform: none;\n}\n.ant-zoom-left-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-right-leave {\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-zoom-right-enter.ant-zoom-right-enter-active,\n.ant-zoom-right-appear.ant-zoom-right-appear-active {\n -webkit-animation-name: antZoomRightIn;\n animation-name: antZoomRightIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-zoom-right-leave.ant-zoom-right-leave-active {\n -webkit-animation-name: antZoomRightOut;\n animation-name: antZoomRightOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n transform: scale(0);\n opacity: 0;\n -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-right-enter-prepare,\n.ant-zoom-right-appear-prepare {\n transform: none;\n}\n.ant-zoom-right-leave {\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n@-webkit-keyframes antZoomIn {\n 0% {\n transform: scale(0.2);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes antZoomIn {\n 0% {\n transform: scale(0.2);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@-webkit-keyframes antZoomOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.2);\n opacity: 0;\n }\n}\n@keyframes antZoomOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.2);\n opacity: 0;\n }\n}\n@-webkit-keyframes antZoomBigIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes antZoomBigIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@-webkit-keyframes antZoomBigOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.8);\n opacity: 0;\n }\n}\n@keyframes antZoomBigOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.8);\n opacity: 0;\n }\n}\n@-webkit-keyframes antZoomUpIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n}\n@keyframes antZoomUpIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n}\n@-webkit-keyframes antZoomUpOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n}\n@keyframes antZoomUpOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antZoomLeftIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n}\n@keyframes antZoomLeftIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n}\n@-webkit-keyframes antZoomLeftOut {\n 0% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n}\n@keyframes antZoomLeftOut {\n 0% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antZoomRightIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n}\n@keyframes antZoomRightIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n}\n@-webkit-keyframes antZoomRightOut {\n 0% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n}\n@keyframes antZoomRightOut {\n 0% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n}\n@-webkit-keyframes antZoomDownIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n}\n@keyframes antZoomDownIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n}\n@-webkit-keyframes antZoomDownOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n}\n@keyframes antZoomDownOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n}\n.ant-motion-collapse-legacy {\n overflow: hidden;\n}\n.ant-motion-collapse-legacy-active {\n transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-motion-collapse {\n overflow: hidden;\n transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-affix {\n position: fixed;\n z-index: 10;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-alert {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: flex;\n align-items: center;\n padding: 8px 15px;\n word-wrap: break-word;\n border-radius: 2px;\n}\n.ant-alert-content {\n flex: 1;\n min-width: 0;\n}\n.ant-alert-icon {\n margin-right: 8px;\n}\n.ant-alert-description {\n display: none;\n font-size: 14px;\n line-height: 22px;\n}\n.ant-alert-success {\n background-color: #f6ffed;\n border: 1px solid #b7eb8f;\n}\n.ant-alert-success .ant-alert-icon {\n color: #52c41a;\n}\n.ant-alert-info {\n background-color: #e6f7ff;\n border: 1px solid #91d5ff;\n}\n.ant-alert-info .ant-alert-icon {\n color: #1890ff;\n}\n.ant-alert-warning {\n background-color: #fffbe6;\n border: 1px solid #ffe58f;\n}\n.ant-alert-warning .ant-alert-icon {\n color: #faad14;\n}\n.ant-alert-error {\n background-color: #fff2f0;\n border: 1px solid #ffccc7;\n}\n.ant-alert-error .ant-alert-icon {\n color: #ff4d4f;\n}\n.ant-alert-error .ant-alert-description > pre {\n margin: 0;\n padding: 0;\n}\n.ant-alert-action {\n margin-left: 8px;\n}\n.ant-alert-close-icon {\n margin-left: 8px;\n padding: 0;\n overflow: hidden;\n font-size: 12px;\n line-height: 12px;\n background-color: transparent;\n border: none;\n outline: none;\n cursor: pointer;\n}\n.ant-alert-close-icon .anticon-close {\n color: rgba(0, 0, 0, 0.45);\n transition: color 0.3s;\n}\n.ant-alert-close-icon .anticon-close:hover {\n color: rgba(0, 0, 0, 0.75);\n}\n.ant-alert-close-text {\n color: rgba(0, 0, 0, 0.45);\n transition: color 0.3s;\n}\n.ant-alert-close-text:hover {\n color: rgba(0, 0, 0, 0.75);\n}\n.ant-alert-with-description {\n align-items: flex-start;\n padding: 15px 15px 15px 24px;\n}\n.ant-alert-with-description.ant-alert-no-icon {\n padding: 15px 15px;\n}\n.ant-alert-with-description .ant-alert-icon {\n margin-right: 15px;\n font-size: 24px;\n}\n.ant-alert-with-description .ant-alert-message {\n display: block;\n margin-bottom: 4px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 16px;\n}\n.ant-alert-message {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-alert-with-description .ant-alert-description {\n display: block;\n}\n.ant-alert.ant-alert-motion-leave {\n overflow: hidden;\n opacity: 1;\n transition: max-height 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), opacity 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), padding-top 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), padding-bottom 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), margin-bottom 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-alert.ant-alert-motion-leave-active {\n max-height: 0;\n margin-bottom: 0 !important;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n}\n.ant-alert-banner {\n margin-bottom: 0;\n border: 0;\n border-radius: 0;\n}\n.ant-alert.ant-alert-rtl {\n direction: rtl;\n}\n.ant-alert-rtl .ant-alert-icon {\n margin-right: auto;\n margin-left: 8px;\n}\n.ant-alert-rtl .ant-alert-action {\n margin-right: 8px;\n margin-left: auto;\n}\n.ant-alert-rtl .ant-alert-close-icon {\n margin-right: 8px;\n margin-left: auto;\n}\n.ant-alert-rtl.ant-alert-with-description {\n padding-right: 24px;\n padding-left: 15px;\n}\n.ant-alert-rtl.ant-alert-with-description .ant-alert-icon {\n margin-right: auto;\n margin-left: 15px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-anchor {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n padding-left: 2px;\n}\n.ant-anchor-wrapper {\n margin-left: -4px;\n padding-left: 4px;\n overflow: auto;\n background-color: transparent;\n}\n.ant-anchor-ink {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n}\n.ant-anchor-ink::before {\n position: relative;\n display: block;\n width: 2px;\n height: 100%;\n margin: 0 auto;\n background-color: #f0f0f0;\n content: ' ';\n}\n.ant-anchor-ink-ball {\n position: absolute;\n left: 50%;\n display: none;\n width: 8px;\n height: 8px;\n background-color: #fff;\n border: 2px solid #1890ff;\n border-radius: 8px;\n transform: translateX(-50%);\n transition: top 0.3s ease-in-out;\n}\n.ant-anchor-ink-ball.visible {\n display: inline-block;\n}\n.ant-anchor-fixed .ant-anchor-ink .ant-anchor-ink-ball {\n display: none;\n}\n.ant-anchor-link {\n padding: 4px 0 4px 16px;\n}\n.ant-anchor-link-title {\n position: relative;\n display: block;\n margin-bottom: 3px;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n white-space: nowrap;\n text-overflow: ellipsis;\n transition: all 0.3s;\n}\n.ant-anchor-link-title:only-child {\n margin-bottom: 0;\n}\n.ant-anchor-link-active > .ant-anchor-link-title {\n color: #1890ff;\n}\n.ant-anchor-link .ant-anchor-link {\n padding-top: 2px;\n padding-bottom: 2px;\n}\n.ant-anchor-rtl {\n direction: rtl;\n}\n.ant-anchor-rtl.ant-anchor-wrapper {\n margin-right: -4px;\n margin-left: 0;\n padding-right: 4px;\n padding-left: 0;\n}\n.ant-anchor-rtl .ant-anchor-ink {\n right: 0;\n left: auto;\n}\n.ant-anchor-rtl .ant-anchor-ink-ball {\n right: 50%;\n left: 0;\n transform: translateX(50%);\n}\n.ant-anchor-rtl .ant-anchor-link {\n padding: 4px 16px 4px 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-select-auto-complete {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n}\n.ant-select-auto-complete .ant-select-clear {\n right: 13px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-select-single .ant-select-selector {\n display: flex;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-search {\n position: absolute;\n top: 0;\n right: 11px;\n bottom: 0;\n left: 11px;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-search-input {\n width: 100%;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-item,\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n padding: 0;\n line-height: 30px;\n transition: all 0.3s;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-item {\n position: relative;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n transition: none;\n pointer-events: none;\n}\n.ant-select-single .ant-select-selector::after,\n.ant-select-single .ant-select-selector .ant-select-selection-item::after,\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder::after {\n display: inline-block;\n width: 0;\n visibility: hidden;\n content: '\\a0';\n}\n.ant-select-single.ant-select-show-arrow .ant-select-selection-search {\n right: 25px;\n}\n.ant-select-single.ant-select-show-arrow .ant-select-selection-item,\n.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder {\n padding-right: 18px;\n}\n.ant-select-single.ant-select-open .ant-select-selection-item {\n color: #bfbfbf;\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n width: 100%;\n height: 32px;\n padding: 0 11px;\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input {\n height: 30px;\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector::after {\n line-height: 30px;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector::after {\n display: none;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search {\n position: static;\n width: 100%;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder {\n position: absolute;\n right: 0;\n left: 0;\n padding: 0 11px;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder::after {\n display: none;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector {\n height: 40px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector::after,\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder {\n line-height: 38px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input {\n height: 38px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector {\n height: 24px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector::after,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder {\n line-height: 22px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input {\n height: 22px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search {\n right: 7px;\n left: 7px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector {\n padding: 0 7px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search {\n right: 28px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder {\n padding-right: 21px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector {\n padding: 0 11px;\n}\n/**\n * Do not merge `height` & `line-height` under style with `selection` & `search`,\n * since chrome may update to redesign with its align logic.\n */\n.ant-select-selection-overflow {\n position: relative;\n display: flex;\n flex: auto;\n flex-wrap: wrap;\n max-width: 100%;\n}\n.ant-select-selection-overflow-item {\n flex: none;\n align-self: center;\n max-width: 100%;\n}\n.ant-select-multiple .ant-select-selector {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n padding: 1px 4px;\n}\n.ant-select-show-search.ant-select-multiple .ant-select-selector {\n cursor: text;\n}\n.ant-select-disabled.ant-select-multiple .ant-select-selector {\n background: #f5f5f5;\n cursor: not-allowed;\n}\n.ant-select-multiple .ant-select-selector::after {\n display: inline-block;\n width: 0;\n margin: 2px 0;\n line-height: 24px;\n content: '\\a0';\n}\n.ant-select-multiple.ant-select-show-arrow .ant-select-selector,\n.ant-select-multiple.ant-select-allow-clear .ant-select-selector {\n padding-right: 24px;\n}\n.ant-select-multiple .ant-select-selection-item {\n position: relative;\n display: flex;\n flex: none;\n box-sizing: border-box;\n max-width: 100%;\n height: 24px;\n margin-top: 2px;\n margin-bottom: 2px;\n line-height: 22px;\n background: #f5f5f5;\n border: 1px solid #f0f0f0;\n border-radius: 2px;\n cursor: default;\n transition: font-size 0.3s, line-height 0.3s, height 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-margin-end: 4px;\n margin-inline-end: 4px;\n -webkit-padding-start: 8px;\n padding-inline-start: 8px;\n -webkit-padding-end: 4px;\n padding-inline-end: 4px;\n}\n.ant-select-disabled.ant-select-multiple .ant-select-selection-item {\n color: #bfbfbf;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-select-multiple .ant-select-selection-item-content {\n display: inline-block;\n margin-right: 4px;\n overflow: hidden;\n white-space: pre;\n text-overflow: ellipsis;\n}\n.ant-select-multiple .ant-select-selection-item-remove {\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: inline-block;\n color: rgba(0, 0, 0, 0.45);\n font-weight: bold;\n font-size: 10px;\n line-height: inherit;\n cursor: pointer;\n}\n.ant-select-multiple .ant-select-selection-item-remove > * {\n line-height: 1;\n}\n.ant-select-multiple .ant-select-selection-item-remove svg {\n display: inline-block;\n}\n.ant-select-multiple .ant-select-selection-item-remove::before {\n display: none;\n}\n.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon {\n display: block;\n}\n.ant-select-multiple .ant-select-selection-item-remove > .anticon {\n vertical-align: middle;\n}\n.ant-select-multiple .ant-select-selection-item-remove:hover {\n color: rgba(0, 0, 0, 0.75);\n}\n.ant-select-multiple .ant-select-selection-overflow-item + .ant-select-selection-overflow-item .ant-select-selection-search {\n -webkit-margin-start: 0;\n margin-inline-start: 0;\n}\n.ant-select-multiple .ant-select-selection-search {\n position: relative;\n max-width: 100%;\n -webkit-margin-start: 7px;\n margin-inline-start: 7px;\n}\n.ant-select-multiple .ant-select-selection-search-input,\n.ant-select-multiple .ant-select-selection-search-mirror {\n height: 24px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n line-height: 24px;\n transition: all 0.3s;\n}\n.ant-select-multiple .ant-select-selection-search-input {\n width: 100%;\n min-width: 4.1px;\n}\n.ant-select-multiple .ant-select-selection-search-mirror {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 999;\n white-space: pre;\n visibility: hidden;\n}\n.ant-select-multiple .ant-select-selection-placeholder {\n position: absolute;\n top: 50%;\n right: 11px;\n left: 11px;\n transform: translateY(-50%);\n transition: all 0.3s;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selector::after {\n line-height: 32px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-item {\n height: 32px;\n line-height: 30px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-search {\n height: 32px;\n line-height: 32px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,\n.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror {\n height: 32px;\n line-height: 30px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selector::after {\n line-height: 16px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-item {\n height: 16px;\n line-height: 14px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search {\n height: 16px;\n line-height: 16px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,\n.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror {\n height: 16px;\n line-height: 14px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder {\n left: 7px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search {\n -webkit-margin-start: 3px;\n margin-inline-start: 3px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-item {\n height: 32px;\n line-height: 32px;\n}\n.ant-select-disabled .ant-select-selection-item-remove {\n display: none;\n}\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input) .ant-select-selector {\n background-color: #fff;\n border-color: #ff4d4f !important;\n}\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-open .ant-select-selector,\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-focused .ant-select-selector {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input) .ant-select-selector {\n background-color: #fff;\n border-color: #faad14 !important;\n}\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-open .ant-select-selector,\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input).ant-select-focused .ant-select-selector {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-select-status-error.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-warning.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-success.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-validating.ant-select-has-feedback .ant-select-clear {\n right: 32px;\n}\n.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value {\n padding-right: 42px;\n}\n/* Reset search input style */\n.ant-select {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-block;\n cursor: pointer;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n position: relative;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n cursor: pointer;\n}\n.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n cursor: text;\n}\n.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n cursor: auto;\n}\n.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n color: rgba(0, 0, 0, 0.25);\n background: #f5f5f5;\n cursor: not-allowed;\n}\n.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n background: #f5f5f5;\n}\n.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n cursor: not-allowed;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input {\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button {\n display: none;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-appearance: none;\n}\n.ant-select:not(.ant-select-disabled):hover .ant-select-selector {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-select-selection-item {\n flex: 1;\n overflow: hidden;\n font-weight: normal;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n@media all and (-ms-high-contrast: none) {\n .ant-select-selection-item *::-ms-backdrop,\n .ant-select-selection-item {\n flex: auto;\n }\n}\n.ant-select-selection-placeholder {\n flex: 1;\n overflow: hidden;\n color: #bfbfbf;\n white-space: nowrap;\n text-overflow: ellipsis;\n pointer-events: none;\n}\n@media all and (-ms-high-contrast: none) {\n .ant-select-selection-placeholder *::-ms-backdrop,\n .ant-select-selection-placeholder {\n flex: auto;\n }\n}\n.ant-select-arrow {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n position: absolute;\n top: 50%;\n right: 11px;\n display: flex;\n align-items: center;\n height: 12px;\n margin-top: -6px;\n color: rgba(0, 0, 0, 0.25);\n font-size: 12px;\n line-height: 1;\n text-align: center;\n pointer-events: none;\n}\n.ant-select-arrow > * {\n line-height: 1;\n}\n.ant-select-arrow svg {\n display: inline-block;\n}\n.ant-select-arrow::before {\n display: none;\n}\n.ant-select-arrow .ant-select-arrow-icon {\n display: block;\n}\n.ant-select-arrow .anticon {\n vertical-align: top;\n transition: transform 0.3s;\n}\n.ant-select-arrow .anticon > svg {\n vertical-align: top;\n}\n.ant-select-arrow .anticon:not(.ant-select-suffix) {\n pointer-events: auto;\n}\n.ant-select-disabled .ant-select-arrow {\n cursor: not-allowed;\n}\n.ant-select-arrow > *:not(:last-child) {\n -webkit-margin-end: 8px;\n margin-inline-end: 8px;\n}\n.ant-select-clear {\n position: absolute;\n top: 50%;\n right: 11px;\n z-index: 1;\n display: inline-block;\n width: 12px;\n height: 12px;\n margin-top: -6px;\n color: rgba(0, 0, 0, 0.25);\n font-size: 12px;\n font-style: normal;\n line-height: 1;\n text-align: center;\n text-transform: none;\n background: #fff;\n cursor: pointer;\n opacity: 0;\n transition: color 0.3s ease, opacity 0.15s ease;\n text-rendering: auto;\n}\n.ant-select-clear::before {\n display: block;\n}\n.ant-select-clear:hover {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-select:hover .ant-select-clear {\n opacity: 1;\n}\n.ant-select-dropdown {\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: 1050;\n box-sizing: border-box;\n padding: 4px 0;\n overflow: hidden;\n font-size: 14px;\n font-variant: initial;\n background-color: #fff;\n border-radius: 2px;\n outline: none;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft,\n.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft {\n -webkit-animation-name: antSlideUpIn;\n animation-name: antSlideUpIn;\n}\n.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft,\n.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft {\n -webkit-animation-name: antSlideDownIn;\n animation-name: antSlideDownIn;\n}\n.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft {\n -webkit-animation-name: antSlideUpOut;\n animation-name: antSlideUpOut;\n}\n.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft {\n -webkit-animation-name: antSlideDownOut;\n animation-name: antSlideDownOut;\n}\n.ant-select-dropdown-hidden {\n display: none;\n}\n.ant-select-dropdown-empty {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-select-item-empty {\n position: relative;\n display: block;\n min-height: 32px;\n padding: 5px 12px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n line-height: 22px;\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-select-item {\n position: relative;\n display: block;\n min-height: 32px;\n padding: 5px 12px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n line-height: 22px;\n cursor: pointer;\n transition: background 0.3s ease;\n}\n.ant-select-item-group {\n color: rgba(0, 0, 0, 0.45);\n font-size: 12px;\n cursor: default;\n}\n.ant-select-item-option {\n display: flex;\n}\n.ant-select-item-option-content {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-select-item-option-state {\n flex: none;\n}\n.ant-select-item-option-active:not(.ant-select-item-option-disabled) {\n background-color: #f5f5f5;\n}\n.ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n background-color: #e6f7ff;\n}\n.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state {\n color: #1890ff;\n}\n.ant-select-item-option-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-select-item-option-disabled.ant-select-item-option-selected {\n background-color: #f5f5f5;\n}\n.ant-select-item-option-grouped {\n padding-left: 24px;\n}\n.ant-select-lg {\n font-size: 16px;\n}\n.ant-select-borderless .ant-select-selector {\n background-color: transparent !important;\n border-color: transparent !important;\n box-shadow: none !important;\n}\n.ant-select.ant-select-in-form-item {\n width: 100%;\n}\n.ant-select-rtl {\n direction: rtl;\n}\n.ant-select-rtl .ant-select-arrow {\n right: initial;\n left: 11px;\n}\n.ant-select-rtl .ant-select-clear {\n right: initial;\n left: 11px;\n}\n.ant-select-dropdown-rtl {\n direction: rtl;\n}\n.ant-select-dropdown-rtl .ant-select-item-option-grouped {\n padding-right: 24px;\n padding-left: 12px;\n}\n.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector,\n.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector {\n padding-right: 4px;\n padding-left: 24px;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-item {\n text-align: right;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content {\n margin-right: 0;\n margin-left: 4px;\n text-align: right;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror {\n right: 0;\n left: auto;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder {\n right: 11px;\n left: auto;\n}\n.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder {\n right: 7px;\n}\n.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,\n.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n right: 0;\n left: 9px;\n text-align: right;\n}\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search {\n right: 11px;\n left: 25px;\n}\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder {\n padding-right: 0;\n padding-left: 18px;\n}\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search {\n right: 6px;\n}\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder {\n padding-right: 0;\n padding-left: 21px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-empty {\n margin: 0 8px;\n font-size: 14px;\n line-height: 1.5715;\n text-align: center;\n}\n.ant-empty-image {\n height: 100px;\n margin-bottom: 8px;\n}\n.ant-empty-image img {\n height: 100%;\n}\n.ant-empty-image svg {\n height: 100%;\n margin: auto;\n}\n.ant-empty-footer {\n margin-top: 16px;\n}\n.ant-empty-normal {\n margin: 32px 0;\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-empty-normal .ant-empty-image {\n height: 40px;\n}\n.ant-empty-small {\n margin: 8px 0;\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-empty-small .ant-empty-image {\n height: 35px;\n}\n.ant-empty-img-default-ellipse {\n fill: #f5f5f5;\n fill-opacity: 0.8;\n}\n.ant-empty-img-default-path-1 {\n fill: #aeb8c2;\n}\n.ant-empty-img-default-path-2 {\n fill: url('#linearGradient-1');\n}\n.ant-empty-img-default-path-3 {\n fill: #f5f5f7;\n}\n.ant-empty-img-default-path-4 {\n fill: #dce0e6;\n}\n.ant-empty-img-default-path-5 {\n fill: #dce0e6;\n}\n.ant-empty-img-default-g {\n fill: #fff;\n}\n.ant-empty-img-simple-ellipse {\n fill: #f5f5f5;\n}\n.ant-empty-img-simple-g {\n stroke: #d9d9d9;\n}\n.ant-empty-img-simple-path {\n fill: #fafafa;\n}\n.ant-empty-rtl {\n direction: rtl;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-avatar {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-block;\n overflow: hidden;\n color: #fff;\n white-space: nowrap;\n text-align: center;\n vertical-align: middle;\n background: #ccc;\n width: 32px;\n height: 32px;\n line-height: 32px;\n border-radius: 50%;\n}\n.ant-avatar-image {\n background: transparent;\n}\n.ant-avatar .ant-image-img {\n display: block;\n}\n.ant-avatar-string {\n position: absolute;\n left: 50%;\n transform-origin: 0 center;\n}\n.ant-avatar.ant-avatar-icon {\n font-size: 18px;\n}\n.ant-avatar.ant-avatar-icon > .anticon {\n margin: 0;\n}\n.ant-avatar-lg {\n width: 40px;\n height: 40px;\n line-height: 40px;\n border-radius: 50%;\n}\n.ant-avatar-lg-string {\n position: absolute;\n left: 50%;\n transform-origin: 0 center;\n}\n.ant-avatar-lg.ant-avatar-icon {\n font-size: 24px;\n}\n.ant-avatar-lg.ant-avatar-icon > .anticon {\n margin: 0;\n}\n.ant-avatar-sm {\n width: 24px;\n height: 24px;\n line-height: 24px;\n border-radius: 50%;\n}\n.ant-avatar-sm-string {\n position: absolute;\n left: 50%;\n transform-origin: 0 center;\n}\n.ant-avatar-sm.ant-avatar-icon {\n font-size: 14px;\n}\n.ant-avatar-sm.ant-avatar-icon > .anticon {\n margin: 0;\n}\n.ant-avatar-square {\n border-radius: 2px;\n}\n.ant-avatar > img {\n display: block;\n width: 100%;\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.ant-avatar-group {\n display: inline-flex;\n}\n.ant-avatar-group .ant-avatar {\n border: 1px solid #fff;\n}\n.ant-avatar-group .ant-avatar:not(:first-child) {\n margin-left: -8px;\n}\n.ant-avatar-group-popover .ant-avatar + .ant-avatar {\n margin-left: 3px;\n}\n.ant-avatar-group-rtl .ant-avatar:not(:first-child) {\n margin-right: -8px;\n margin-left: 0;\n}\n.ant-avatar-group-popover.ant-popover-rtl .ant-avatar + .ant-avatar {\n margin-right: 3px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-popover {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1030;\n font-weight: normal;\n white-space: normal;\n text-align: left;\n cursor: auto;\n -webkit-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n.ant-popover-content {\n position: relative;\n}\n.ant-popover::after {\n position: absolute;\n background: rgba(255, 255, 255, 0.01);\n content: '';\n}\n.ant-popover-hidden {\n display: none;\n}\n.ant-popover-placement-top,\n.ant-popover-placement-topLeft,\n.ant-popover-placement-topRight {\n padding-bottom: 15.3137085px;\n}\n.ant-popover-placement-right,\n.ant-popover-placement-rightTop,\n.ant-popover-placement-rightBottom {\n padding-left: 15.3137085px;\n}\n.ant-popover-placement-bottom,\n.ant-popover-placement-bottomLeft,\n.ant-popover-placement-bottomRight {\n padding-top: 15.3137085px;\n}\n.ant-popover-placement-left,\n.ant-popover-placement-leftTop,\n.ant-popover-placement-leftBottom {\n padding-right: 15.3137085px;\n}\n.ant-popover-inner {\n background-color: #fff;\n background-clip: padding-box;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n box-shadow: 0 0 8px rgba(0, 0, 0, 0.15) \\9;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .ant-popover {\n /* IE10+ */\n }\n .ant-popover-inner {\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n }\n}\n.ant-popover-title {\n min-width: 177px;\n min-height: 32px;\n margin: 0;\n padding: 5px 16px 4px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-popover-inner-content {\n padding: 12px 16px;\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-popover-message {\n position: relative;\n padding: 4px 0 12px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-popover-message > .anticon {\n position: absolute;\n top: 8.0005px;\n color: #faad14;\n font-size: 14px;\n}\n.ant-popover-message-title {\n padding-left: 22px;\n}\n.ant-popover-buttons {\n margin-bottom: 4px;\n text-align: right;\n}\n.ant-popover-buttons button {\n margin-left: 8px;\n}\n.ant-popover-arrow {\n position: absolute;\n display: block;\n width: 22px;\n height: 22px;\n overflow: hidden;\n background: transparent;\n pointer-events: none;\n}\n.ant-popover-arrow-content {\n --antd-arrow-background-color: #fff;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n width: 11.3137085px;\n height: 11.3137085px;\n margin: auto;\n content: '';\n pointer-events: auto;\n border-radius: 0 0 2px;\n pointer-events: none;\n}\n.ant-popover-arrow-content::before {\n position: absolute;\n top: -11.3137085px;\n left: -11.3137085px;\n width: 33.9411255px;\n height: 33.9411255px;\n background: var(--antd-arrow-background-color);\n background-repeat: no-repeat;\n background-position: -10px -10px;\n content: '';\n -webkit-clip-path: inset(33% 33%);\n clip-path: inset(33% 33%);\n -webkit-clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-popover-placement-top .ant-popover-arrow,\n.ant-popover-placement-topLeft .ant-popover-arrow,\n.ant-popover-placement-topRight .ant-popover-arrow {\n bottom: 0;\n transform: translateY(100%);\n}\n.ant-popover-placement-top .ant-popover-arrow-content,\n.ant-popover-placement-topLeft .ant-popover-arrow-content,\n.ant-popover-placement-topRight .ant-popover-arrow-content {\n box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n transform: translateY(-11px) rotate(45deg);\n}\n.ant-popover-placement-top .ant-popover-arrow {\n left: 50%;\n transform: translateY(100%) translateX(-50%);\n}\n.ant-popover-placement-topLeft .ant-popover-arrow {\n left: 16px;\n}\n.ant-popover-placement-topRight .ant-popover-arrow {\n right: 16px;\n}\n.ant-popover-placement-right .ant-popover-arrow,\n.ant-popover-placement-rightTop .ant-popover-arrow,\n.ant-popover-placement-rightBottom .ant-popover-arrow {\n left: 0;\n transform: translateX(-100%);\n}\n.ant-popover-placement-right .ant-popover-arrow-content,\n.ant-popover-placement-rightTop .ant-popover-arrow-content,\n.ant-popover-placement-rightBottom .ant-popover-arrow-content {\n box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n transform: translateX(11px) rotate(135deg);\n}\n.ant-popover-placement-right .ant-popover-arrow {\n top: 50%;\n transform: translateX(-100%) translateY(-50%);\n}\n.ant-popover-placement-rightTop .ant-popover-arrow {\n top: 12px;\n}\n.ant-popover-placement-rightBottom .ant-popover-arrow {\n bottom: 12px;\n}\n.ant-popover-placement-bottom .ant-popover-arrow,\n.ant-popover-placement-bottomLeft .ant-popover-arrow,\n.ant-popover-placement-bottomRight .ant-popover-arrow {\n top: 0;\n transform: translateY(-100%);\n}\n.ant-popover-placement-bottom .ant-popover-arrow-content,\n.ant-popover-placement-bottomLeft .ant-popover-arrow-content,\n.ant-popover-placement-bottomRight .ant-popover-arrow-content {\n box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.06);\n transform: translateY(11px) rotate(-135deg);\n}\n.ant-popover-placement-bottom .ant-popover-arrow {\n left: 50%;\n transform: translateY(-100%) translateX(-50%);\n}\n.ant-popover-placement-bottomLeft .ant-popover-arrow {\n left: 16px;\n}\n.ant-popover-placement-bottomRight .ant-popover-arrow {\n right: 16px;\n}\n.ant-popover-placement-left .ant-popover-arrow,\n.ant-popover-placement-leftTop .ant-popover-arrow,\n.ant-popover-placement-leftBottom .ant-popover-arrow {\n right: 0;\n transform: translateX(100%);\n}\n.ant-popover-placement-left .ant-popover-arrow-content,\n.ant-popover-placement-leftTop .ant-popover-arrow-content,\n.ant-popover-placement-leftBottom .ant-popover-arrow-content {\n box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n transform: translateX(-11px) rotate(-45deg);\n}\n.ant-popover-placement-left .ant-popover-arrow {\n top: 50%;\n transform: translateX(100%) translateY(-50%);\n}\n.ant-popover-placement-leftTop .ant-popover-arrow {\n top: 12px;\n}\n.ant-popover-placement-leftBottom .ant-popover-arrow {\n bottom: 12px;\n}\n.ant-popover-pink .ant-popover-inner {\n background-color: #eb2f96;\n}\n.ant-popover-pink .ant-popover-arrow-content {\n background-color: #eb2f96;\n}\n.ant-popover-magenta .ant-popover-inner {\n background-color: #eb2f96;\n}\n.ant-popover-magenta .ant-popover-arrow-content {\n background-color: #eb2f96;\n}\n.ant-popover-red .ant-popover-inner {\n background-color: #f5222d;\n}\n.ant-popover-red .ant-popover-arrow-content {\n background-color: #f5222d;\n}\n.ant-popover-volcano .ant-popover-inner {\n background-color: #fa541c;\n}\n.ant-popover-volcano .ant-popover-arrow-content {\n background-color: #fa541c;\n}\n.ant-popover-orange .ant-popover-inner {\n background-color: #fa8c16;\n}\n.ant-popover-orange .ant-popover-arrow-content {\n background-color: #fa8c16;\n}\n.ant-popover-yellow .ant-popover-inner {\n background-color: #fadb14;\n}\n.ant-popover-yellow .ant-popover-arrow-content {\n background-color: #fadb14;\n}\n.ant-popover-gold .ant-popover-inner {\n background-color: #faad14;\n}\n.ant-popover-gold .ant-popover-arrow-content {\n background-color: #faad14;\n}\n.ant-popover-cyan .ant-popover-inner {\n background-color: #13c2c2;\n}\n.ant-popover-cyan .ant-popover-arrow-content {\n background-color: #13c2c2;\n}\n.ant-popover-lime .ant-popover-inner {\n background-color: #a0d911;\n}\n.ant-popover-lime .ant-popover-arrow-content {\n background-color: #a0d911;\n}\n.ant-popover-green .ant-popover-inner {\n background-color: #52c41a;\n}\n.ant-popover-green .ant-popover-arrow-content {\n background-color: #52c41a;\n}\n.ant-popover-blue .ant-popover-inner {\n background-color: #1890ff;\n}\n.ant-popover-blue .ant-popover-arrow-content {\n background-color: #1890ff;\n}\n.ant-popover-geekblue .ant-popover-inner {\n background-color: #2f54eb;\n}\n.ant-popover-geekblue .ant-popover-arrow-content {\n background-color: #2f54eb;\n}\n.ant-popover-purple .ant-popover-inner {\n background-color: #722ed1;\n}\n.ant-popover-purple .ant-popover-arrow-content {\n background-color: #722ed1;\n}\n.ant-popover-rtl {\n direction: rtl;\n text-align: right;\n}\n.ant-popover-rtl .ant-popover-message-title {\n padding-right: 22px;\n padding-left: 16px;\n}\n.ant-popover-rtl .ant-popover-buttons {\n text-align: left;\n}\n.ant-popover-rtl .ant-popover-buttons button {\n margin-right: 8px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-back-top {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: fixed;\n right: 100px;\n bottom: 50px;\n z-index: 10;\n width: 40px;\n height: 40px;\n cursor: pointer;\n}\n.ant-back-top:empty {\n display: none;\n}\n.ant-back-top-rtl {\n right: auto;\n left: 100px;\n direction: rtl;\n}\n.ant-back-top-content {\n width: 40px;\n height: 40px;\n overflow: hidden;\n color: #fff;\n text-align: center;\n background-color: rgba(0, 0, 0, 0.45);\n border-radius: 20px;\n transition: all 0.3s;\n}\n.ant-back-top-content:hover {\n background-color: rgba(0, 0, 0, 0.85);\n transition: all 0.3s;\n}\n.ant-back-top-icon {\n font-size: 24px;\n line-height: 40px;\n}\n@media screen and (max-width: 768px) {\n .ant-back-top {\n right: 60px;\n }\n .ant-back-top-rtl {\n right: auto;\n left: 60px;\n }\n}\n@media screen and (max-width: 480px) {\n .ant-back-top {\n right: 20px;\n }\n .ant-back-top-rtl {\n right: auto;\n left: 20px;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-badge {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-block;\n line-height: 1;\n}\n.ant-badge-count {\n z-index: auto;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n color: #fff;\n font-weight: normal;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n text-align: center;\n background: #ff4d4f;\n border-radius: 10px;\n box-shadow: 0 0 0 1px #fff;\n}\n.ant-badge-count a,\n.ant-badge-count a:hover {\n color: #fff;\n}\n.ant-badge-count-sm {\n min-width: 14px;\n height: 14px;\n padding: 0;\n font-size: 12px;\n line-height: 14px;\n border-radius: 7px;\n}\n.ant-badge-multiple-words {\n padding: 0 8px;\n}\n.ant-badge-dot {\n z-index: auto;\n width: 6px;\n min-width: 6px;\n height: 6px;\n background: #ff4d4f;\n border-radius: 100%;\n box-shadow: 0 0 0 1px #fff;\n}\n.ant-badge-dot.ant-scroll-number {\n transition: background 1.5s;\n}\n.ant-badge-count,\n.ant-badge-dot,\n.ant-badge .ant-scroll-number-custom-component {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n transform-origin: 100% 0%;\n}\n.ant-badge-count.anticon-spin,\n.ant-badge-dot.anticon-spin,\n.ant-badge .ant-scroll-number-custom-component.anticon-spin {\n -webkit-animation: antBadgeLoadingCircle 1s infinite linear;\n animation: antBadgeLoadingCircle 1s infinite linear;\n}\n.ant-badge-status {\n line-height: inherit;\n vertical-align: baseline;\n}\n.ant-badge-status-dot {\n position: relative;\n top: -1px;\n display: inline-block;\n width: 6px;\n height: 6px;\n vertical-align: middle;\n border-radius: 50%;\n}\n.ant-badge-status-success {\n background-color: #52c41a;\n}\n.ant-badge-status-processing {\n position: relative;\n background-color: #1890ff;\n}\n.ant-badge-status-processing::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 50%;\n -webkit-animation: antStatusProcessing 1.2s infinite ease-in-out;\n animation: antStatusProcessing 1.2s infinite ease-in-out;\n content: '';\n}\n.ant-badge-status-default {\n background-color: #d9d9d9;\n}\n.ant-badge-status-error {\n background-color: #ff4d4f;\n}\n.ant-badge-status-warning {\n background-color: #faad14;\n}\n.ant-badge-status-pink {\n background: #eb2f96;\n}\n.ant-badge-status-magenta {\n background: #eb2f96;\n}\n.ant-badge-status-red {\n background: #f5222d;\n}\n.ant-badge-status-volcano {\n background: #fa541c;\n}\n.ant-badge-status-orange {\n background: #fa8c16;\n}\n.ant-badge-status-yellow {\n background: #fadb14;\n}\n.ant-badge-status-gold {\n background: #faad14;\n}\n.ant-badge-status-cyan {\n background: #13c2c2;\n}\n.ant-badge-status-lime {\n background: #a0d911;\n}\n.ant-badge-status-green {\n background: #52c41a;\n}\n.ant-badge-status-blue {\n background: #1890ff;\n}\n.ant-badge-status-geekblue {\n background: #2f54eb;\n}\n.ant-badge-status-purple {\n background: #722ed1;\n}\n.ant-badge-status-text {\n margin-left: 8px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-badge-zoom-appear,\n.ant-badge-zoom-enter {\n -webkit-animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n.ant-badge-zoom-leave {\n -webkit-animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n.ant-badge-not-a-wrapper .ant-badge-zoom-appear,\n.ant-badge-not-a-wrapper .ant-badge-zoom-enter {\n -webkit-animation: antNoWrapperZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n animation: antNoWrapperZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n}\n.ant-badge-not-a-wrapper .ant-badge-zoom-leave {\n -webkit-animation: antNoWrapperZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n animation: antNoWrapperZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n}\n.ant-badge-not-a-wrapper:not(.ant-badge-status) {\n vertical-align: middle;\n}\n.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,\n.ant-badge-not-a-wrapper .ant-badge-count {\n transform: none;\n}\n.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,\n.ant-badge-not-a-wrapper .ant-scroll-number {\n position: relative;\n top: auto;\n display: block;\n transform-origin: 50% 50%;\n}\n@-webkit-keyframes antStatusProcessing {\n 0% {\n transform: scale(0.8);\n opacity: 0.5;\n }\n 100% {\n transform: scale(2.4);\n opacity: 0;\n }\n}\n@keyframes antStatusProcessing {\n 0% {\n transform: scale(0.8);\n opacity: 0.5;\n }\n 100% {\n transform: scale(2.4);\n opacity: 0;\n }\n}\n.ant-scroll-number {\n overflow: hidden;\n direction: ltr;\n}\n.ant-scroll-number-only {\n position: relative;\n display: inline-block;\n height: 20px;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n /* stylelint-disable property-no-vendor-prefix */\n -webkit-transform-style: preserve-3d;\n -webkit-backface-visibility: hidden;\n /* stylelint-enable property-no-vendor-prefix */\n}\n.ant-scroll-number-only > p.ant-scroll-number-only-unit {\n height: 20px;\n margin: 0;\n /* stylelint-disable property-no-vendor-prefix */\n -webkit-transform-style: preserve-3d;\n -webkit-backface-visibility: hidden;\n /* stylelint-enable property-no-vendor-prefix */\n}\n.ant-scroll-number-symbol {\n vertical-align: top;\n}\n@-webkit-keyframes antZoomBadgeIn {\n 0% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n 100% {\n transform: scale(1) translate(50%, -50%);\n }\n}\n@keyframes antZoomBadgeIn {\n 0% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n 100% {\n transform: scale(1) translate(50%, -50%);\n }\n}\n@-webkit-keyframes antZoomBadgeOut {\n 0% {\n transform: scale(1) translate(50%, -50%);\n }\n 100% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n}\n@keyframes antZoomBadgeOut {\n 0% {\n transform: scale(1) translate(50%, -50%);\n }\n 100% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n}\n@-webkit-keyframes antNoWrapperZoomBadgeIn {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes antNoWrapperZoomBadgeIn {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n }\n}\n@-webkit-keyframes antNoWrapperZoomBadgeOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n opacity: 0;\n }\n}\n@keyframes antNoWrapperZoomBadgeOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n opacity: 0;\n }\n}\n@-webkit-keyframes antBadgeLoadingCircle {\n 0% {\n transform-origin: 50%;\n }\n 100% {\n transform: translate(50%, -50%) rotate(360deg);\n transform-origin: 50%;\n }\n}\n@keyframes antBadgeLoadingCircle {\n 0% {\n transform-origin: 50%;\n }\n 100% {\n transform: translate(50%, -50%) rotate(360deg);\n transform-origin: 50%;\n }\n}\n.ant-ribbon-wrapper {\n position: relative;\n}\n.ant-ribbon {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: 8px;\n height: 22px;\n padding: 0 8px;\n color: #fff;\n line-height: 22px;\n white-space: nowrap;\n background-color: #1890ff;\n border-radius: 2px;\n}\n.ant-ribbon-text {\n color: #fff;\n}\n.ant-ribbon-corner {\n position: absolute;\n top: 100%;\n width: 8px;\n height: 8px;\n color: currentcolor;\n border: 4px solid;\n transform: scaleY(0.75);\n transform-origin: top;\n}\n.ant-ribbon-corner::after {\n position: absolute;\n top: -4px;\n left: -4px;\n width: inherit;\n height: inherit;\n color: rgba(0, 0, 0, 0.25);\n border: inherit;\n content: '';\n}\n.ant-ribbon-color-pink {\n color: #eb2f96;\n background: #eb2f96;\n}\n.ant-ribbon-color-magenta {\n color: #eb2f96;\n background: #eb2f96;\n}\n.ant-ribbon-color-red {\n color: #f5222d;\n background: #f5222d;\n}\n.ant-ribbon-color-volcano {\n color: #fa541c;\n background: #fa541c;\n}\n.ant-ribbon-color-orange {\n color: #fa8c16;\n background: #fa8c16;\n}\n.ant-ribbon-color-yellow {\n color: #fadb14;\n background: #fadb14;\n}\n.ant-ribbon-color-gold {\n color: #faad14;\n background: #faad14;\n}\n.ant-ribbon-color-cyan {\n color: #13c2c2;\n background: #13c2c2;\n}\n.ant-ribbon-color-lime {\n color: #a0d911;\n background: #a0d911;\n}\n.ant-ribbon-color-green {\n color: #52c41a;\n background: #52c41a;\n}\n.ant-ribbon-color-blue {\n color: #1890ff;\n background: #1890ff;\n}\n.ant-ribbon-color-geekblue {\n color: #2f54eb;\n background: #2f54eb;\n}\n.ant-ribbon-color-purple {\n color: #722ed1;\n background: #722ed1;\n}\n.ant-ribbon.ant-ribbon-placement-end {\n right: -8px;\n border-bottom-right-radius: 0;\n}\n.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner {\n right: 0;\n border-color: currentcolor transparent transparent currentcolor;\n}\n.ant-ribbon.ant-ribbon-placement-start {\n left: -8px;\n border-bottom-left-radius: 0;\n}\n.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner {\n left: 0;\n border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-badge-rtl {\n direction: rtl;\n}\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component {\n right: auto;\n left: 0;\n direction: ltr;\n transform: translate(-50%, -50%);\n transform-origin: 0% 0%;\n}\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component {\n right: auto;\n left: 0;\n transform: translate(-50%, -50%);\n transform-origin: 0% 0%;\n}\n.ant-badge-rtl .ant-badge-status-text {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter {\n -webkit-animation-name: antZoomBadgeInRtl;\n animation-name: antZoomBadgeInRtl;\n}\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave {\n -webkit-animation-name: antZoomBadgeOutRtl;\n animation-name: antZoomBadgeOutRtl;\n}\n.ant-ribbon-rtl {\n direction: rtl;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end {\n right: unset;\n left: -8px;\n border-bottom-right-radius: 2px;\n border-bottom-left-radius: 0;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner {\n right: unset;\n left: 0;\n border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner::after {\n border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start {\n right: -8px;\n left: unset;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 2px;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner {\n right: 0;\n left: unset;\n border-color: currentcolor transparent transparent currentcolor;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner::after {\n border-color: currentcolor transparent transparent currentcolor;\n}\n@-webkit-keyframes antZoomBadgeInRtl {\n 0% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n 100% {\n transform: scale(1) translate(-50%, -50%);\n }\n}\n@keyframes antZoomBadgeInRtl {\n 0% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n 100% {\n transform: scale(1) translate(-50%, -50%);\n }\n}\n@-webkit-keyframes antZoomBadgeOutRtl {\n 0% {\n transform: scale(1) translate(-50%, -50%);\n }\n 100% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n}\n@keyframes antZoomBadgeOutRtl {\n 0% {\n transform: scale(1) translate(-50%, -50%);\n }\n 100% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-breadcrumb {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-breadcrumb .anticon {\n font-size: 14px;\n}\n.ant-breadcrumb ol {\n display: flex;\n flex-wrap: wrap;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.ant-breadcrumb a {\n color: rgba(0, 0, 0, 0.45);\n transition: color 0.3s;\n}\n.ant-breadcrumb a:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-breadcrumb li:last-child {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-breadcrumb li:last-child a {\n color: rgba(0, 0, 0, 0.85);\n}\nli:last-child > .ant-breadcrumb-separator {\n display: none;\n}\n.ant-breadcrumb-separator {\n margin: 0 8px;\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-breadcrumb-link > .anticon + span,\n.ant-breadcrumb-link > .anticon + a {\n margin-left: 4px;\n}\n.ant-breadcrumb-overlay-link > .anticon {\n margin-left: 4px;\n}\n.ant-breadcrumb-rtl {\n direction: rtl;\n}\n.ant-breadcrumb-rtl::before {\n display: table;\n content: '';\n}\n.ant-breadcrumb-rtl::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-breadcrumb-rtl > span {\n float: right;\n}\n.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + span,\n.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + a {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link > .anticon {\n margin-right: 4px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-dropdown-menu-item.ant-dropdown-menu-item-danger {\n color: #ff4d4f;\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover {\n color: #fff;\n background-color: #ff4d4f;\n}\n.ant-dropdown {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: 1050;\n display: block;\n}\n.ant-dropdown::before {\n position: absolute;\n top: -4px;\n right: 0;\n bottom: -4px;\n left: -7px;\n z-index: -9999;\n opacity: 0.0001;\n content: ' ';\n}\n.ant-dropdown-wrap {\n position: relative;\n}\n.ant-dropdown-wrap .ant-btn > .anticon-down {\n font-size: 10px;\n}\n.ant-dropdown-wrap .anticon-down::before {\n transition: transform 0.2s;\n}\n.ant-dropdown-wrap-open .anticon-down::before {\n transform: rotate(180deg);\n}\n.ant-dropdown-hidden,\n.ant-dropdown-menu-hidden,\n.ant-dropdown-menu-submenu-hidden {\n display: none;\n}\n.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,\n.ant-dropdown-show-arrow.ant-dropdown-placement-top,\n.ant-dropdown-show-arrow.ant-dropdown-placement-topRight {\n padding-bottom: 15.3137085px;\n}\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight {\n padding-top: 15.3137085px;\n}\n.ant-dropdown-arrow {\n position: absolute;\n z-index: 1;\n display: block;\n width: 11.3137085px;\n height: 11.3137085px;\n border-radius: 0 0 2px;\n pointer-events: none;\n}\n.ant-dropdown-arrow::before {\n position: absolute;\n top: -11.3137085px;\n left: -11.3137085px;\n width: 33.9411255px;\n height: 33.9411255px;\n background: #fff;\n background-repeat: no-repeat;\n background-position: -10px -10px;\n content: '';\n -webkit-clip-path: inset(33% 33%);\n clip-path: inset(33% 33%);\n -webkit-clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-dropdown-placement-top > .ant-dropdown-arrow,\n.ant-dropdown-placement-topLeft > .ant-dropdown-arrow,\n.ant-dropdown-placement-topRight > .ant-dropdown-arrow {\n bottom: 10px;\n box-shadow: 3px 3px 7px -3px rgba(0, 0, 0, 0.1);\n transform: rotate(45deg);\n}\n.ant-dropdown-placement-top > .ant-dropdown-arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n.ant-dropdown-placement-topLeft > .ant-dropdown-arrow {\n left: 16px;\n}\n.ant-dropdown-placement-topRight > .ant-dropdown-arrow {\n right: 16px;\n}\n.ant-dropdown-placement-bottom > .ant-dropdown-arrow,\n.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow,\n.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow {\n top: 9.41421356px;\n box-shadow: 2px 2px 5px -2px rgba(0, 0, 0, 0.1);\n transform: rotate(-135deg) translateY(-0.5px);\n}\n.ant-dropdown-placement-bottom > .ant-dropdown-arrow {\n left: 50%;\n transform: translateX(-50%) rotate(-135deg) translateY(-0.5px);\n}\n.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow {\n left: 16px;\n}\n.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow {\n right: 16px;\n}\n.ant-dropdown-menu {\n position: relative;\n margin: 0;\n padding: 4px 0;\n text-align: left;\n list-style-type: none;\n background-color: #fff;\n background-clip: padding-box;\n border-radius: 2px;\n outline: none;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-dropdown-menu-item-group-title {\n padding: 5px 12px;\n color: rgba(0, 0, 0, 0.45);\n transition: all 0.3s;\n}\n.ant-dropdown-menu-submenu-popup {\n position: absolute;\n z-index: 1050;\n background: transparent;\n box-shadow: none;\n transform-origin: 0 0;\n}\n.ant-dropdown-menu-submenu-popup ul,\n.ant-dropdown-menu-submenu-popup li {\n list-style: none;\n}\n.ant-dropdown-menu-submenu-popup ul {\n margin-right: 0.3em;\n margin-left: 0.3em;\n}\n.ant-dropdown-menu-item {\n position: relative;\n display: flex;\n align-items: center;\n}\n.ant-dropdown-menu-item-icon {\n min-width: 12px;\n margin-right: 8px;\n font-size: 12px;\n}\n.ant-dropdown-menu-title-content {\n flex: auto;\n}\n.ant-dropdown-menu-title-content > a {\n color: inherit;\n transition: all 0.3s;\n}\n.ant-dropdown-menu-title-content > a:hover {\n color: inherit;\n}\n.ant-dropdown-menu-title-content > a::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n content: '';\n}\n.ant-dropdown-menu-item,\n.ant-dropdown-menu-submenu-title {\n clear: both;\n margin: 0;\n padding: 5px 12px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n line-height: 22px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-dropdown-menu-item-selected,\n.ant-dropdown-menu-submenu-title-selected {\n color: #1890ff;\n background-color: #e6f7ff;\n}\n.ant-dropdown-menu-item:hover,\n.ant-dropdown-menu-submenu-title:hover,\n.ant-dropdown-menu-item.ant-dropdown-menu-item-active,\n.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active {\n background-color: #f5f5f5;\n}\n.ant-dropdown-menu-item-disabled,\n.ant-dropdown-menu-submenu-title-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-dropdown-menu-item-disabled:hover,\n.ant-dropdown-menu-submenu-title-disabled:hover {\n color: rgba(0, 0, 0, 0.25);\n background-color: #fff;\n cursor: not-allowed;\n}\n.ant-dropdown-menu-item-disabled a,\n.ant-dropdown-menu-submenu-title-disabled a {\n pointer-events: none;\n}\n.ant-dropdown-menu-item-divider,\n.ant-dropdown-menu-submenu-title-divider {\n height: 1px;\n margin: 4px 0;\n overflow: hidden;\n line-height: 0;\n background-color: #f0f0f0;\n}\n.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,\n.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon {\n position: absolute;\n right: 8px;\n}\n.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,\n.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon {\n margin-right: 0 !important;\n color: rgba(0, 0, 0, 0.45);\n font-size: 10px;\n font-style: normal;\n}\n.ant-dropdown-menu-item-group-list {\n margin: 0 8px;\n padding: 0;\n list-style: none;\n}\n.ant-dropdown-menu-submenu-title {\n padding-right: 24px;\n}\n.ant-dropdown-menu-submenu-vertical {\n position: relative;\n}\n.ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu {\n position: absolute;\n top: 0;\n left: 100%;\n min-width: 100%;\n margin-left: 4px;\n transform-origin: 0 0;\n}\n.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,\n.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon {\n color: rgba(0, 0, 0, 0.25);\n background-color: #fff;\n cursor: not-allowed;\n}\n.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title {\n color: #1890ff;\n}\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight {\n -webkit-animation-name: antSlideUpIn;\n animation-name: antSlideUpIn;\n}\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight {\n -webkit-animation-name: antSlideDownIn;\n animation-name: antSlideDownIn;\n}\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight {\n -webkit-animation-name: antSlideUpOut;\n animation-name: antSlideUpOut;\n}\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight {\n -webkit-animation-name: antSlideDownOut;\n animation-name: antSlideDownOut;\n}\n.ant-dropdown-trigger > .anticon.anticon-down,\n.ant-dropdown-link > .anticon.anticon-down,\n.ant-dropdown-button > .anticon.anticon-down {\n font-size: 10px;\n vertical-align: baseline;\n}\n.ant-dropdown-button {\n white-space: nowrap;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading,\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading + .ant-btn {\n cursor: default;\n pointer-events: none;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading + .ant-btn::before {\n display: block;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only) {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-dropdown-menu-dark,\n.ant-dropdown-menu-dark .ant-dropdown-menu {\n background: #001529;\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a {\n color: rgba(255, 255, 255, 0.65);\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a .ant-dropdown-menu-submenu-arrow::after {\n color: rgba(255, 255, 255, 0.65);\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a:hover {\n color: #fff;\n background: transparent;\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a {\n color: #fff;\n background: #1890ff;\n}\n.ant-dropdown-rtl {\n direction: rtl;\n}\n.ant-dropdown-rtl.ant-dropdown::before {\n right: -7px;\n left: 0;\n}\n.ant-dropdown-menu.ant-dropdown-menu-rtl {\n direction: rtl;\n text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item-group-title,\n.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title {\n direction: rtl;\n text-align: right;\n}\n.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl {\n transform-origin: 100% 0;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li {\n text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title {\n text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-item > span > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > span > .anticon:first-child {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon {\n right: auto;\n left: 8px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon {\n margin-left: 0 !important;\n transform: scaleX(-1);\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title {\n padding-right: 12px;\n padding-left: 24px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu {\n right: 100%;\n left: 0;\n margin-right: 4px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-btn {\n line-height: 1.5715;\n position: relative;\n display: inline-block;\n font-weight: 400;\n white-space: nowrap;\n text-align: center;\n background-image: none;\n border: 1px solid transparent;\n box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n touch-action: manipulation;\n height: 32px;\n padding: 4px 15px;\n font-size: 14px;\n border-radius: 2px;\n color: rgba(0, 0, 0, 0.85);\n border-color: #d9d9d9;\n background: #fff;\n}\n.ant-btn > .anticon {\n line-height: 1;\n}\n.ant-btn,\n.ant-btn:active,\n.ant-btn:focus {\n outline: 0;\n}\n.ant-btn:not([disabled]):hover {\n text-decoration: none;\n}\n.ant-btn:not([disabled]):active {\n outline: 0;\n box-shadow: none;\n}\n.ant-btn[disabled] {\n cursor: not-allowed;\n}\n.ant-btn[disabled] > * {\n pointer-events: none;\n}\n.ant-btn-lg {\n height: 40px;\n padding: 6.4px 15px;\n font-size: 16px;\n border-radius: 2px;\n}\n.ant-btn-sm {\n height: 24px;\n padding: 0px 7px;\n font-size: 14px;\n border-radius: 2px;\n}\n.ant-btn > a:only-child {\n color: currentcolor;\n}\n.ant-btn > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn:hover,\n.ant-btn:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: #fff;\n}\n.ant-btn:hover > a:only-child,\n.ant-btn:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn:hover > a:only-child::after,\n.ant-btn:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn:active {\n color: #096dd9;\n border-color: #096dd9;\n background: #fff;\n}\n.ant-btn:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn[disabled],\n.ant-btn[disabled]:hover,\n.ant-btn[disabled]:focus,\n.ant-btn[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn[disabled] > a:only-child,\n.ant-btn[disabled]:hover > a:only-child,\n.ant-btn[disabled]:focus > a:only-child,\n.ant-btn[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn[disabled] > a:only-child::after,\n.ant-btn[disabled]:hover > a:only-child::after,\n.ant-btn[disabled]:focus > a:only-child::after,\n.ant-btn[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn:hover,\n.ant-btn:focus,\n.ant-btn:active {\n text-decoration: none;\n background: #fff;\n}\n.ant-btn > span {\n display: inline-block;\n}\n.ant-btn-primary {\n color: #fff;\n border-color: #1890ff;\n background: #1890ff;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-primary > a:only-child {\n color: currentcolor;\n}\n.ant-btn-primary > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-primary:hover,\n.ant-btn-primary:focus {\n color: #fff;\n border-color: #40a9ff;\n background: #40a9ff;\n}\n.ant-btn-primary:hover > a:only-child,\n.ant-btn-primary:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-primary:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-primary:active {\n color: #fff;\n border-color: #096dd9;\n background: #096dd9;\n}\n.ant-btn-primary:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-primary:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-primary[disabled],\n.ant-btn-primary[disabled]:hover,\n.ant-btn-primary[disabled]:focus,\n.ant-btn-primary[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-primary[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-primary[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) {\n border-right-color: #40a9ff;\n border-left-color: #40a9ff;\n}\n.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled {\n border-color: #d9d9d9;\n}\n.ant-btn-group .ant-btn-primary:first-child:not(:last-child) {\n border-right-color: #40a9ff;\n}\n.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] {\n border-right-color: #d9d9d9;\n}\n.ant-btn-group .ant-btn-primary:last-child:not(:first-child),\n.ant-btn-group .ant-btn-primary + .ant-btn-primary {\n border-left-color: #40a9ff;\n}\n.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],\n.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {\n border-left-color: #d9d9d9;\n}\n.ant-btn-ghost {\n color: rgba(0, 0, 0, 0.85);\n border-color: #d9d9d9;\n background: transparent;\n}\n.ant-btn-ghost > a:only-child {\n color: currentcolor;\n}\n.ant-btn-ghost > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-ghost:hover,\n.ant-btn-ghost:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: transparent;\n}\n.ant-btn-ghost:hover > a:only-child,\n.ant-btn-ghost:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-ghost:hover > a:only-child::after,\n.ant-btn-ghost:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-ghost:active {\n color: #096dd9;\n border-color: #096dd9;\n background: transparent;\n}\n.ant-btn-ghost:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-ghost:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-ghost[disabled],\n.ant-btn-ghost[disabled]:hover,\n.ant-btn-ghost[disabled]:focus,\n.ant-btn-ghost[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-ghost[disabled] > a:only-child,\n.ant-btn-ghost[disabled]:hover > a:only-child,\n.ant-btn-ghost[disabled]:focus > a:only-child,\n.ant-btn-ghost[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-ghost[disabled] > a:only-child::after,\n.ant-btn-ghost[disabled]:hover > a:only-child::after,\n.ant-btn-ghost[disabled]:focus > a:only-child::after,\n.ant-btn-ghost[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dashed {\n color: rgba(0, 0, 0, 0.85);\n border-color: #d9d9d9;\n background: #fff;\n border-style: dashed;\n}\n.ant-btn-dashed > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dashed > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dashed:hover,\n.ant-btn-dashed:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: #fff;\n}\n.ant-btn-dashed:hover > a:only-child,\n.ant-btn-dashed:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dashed:hover > a:only-child::after,\n.ant-btn-dashed:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dashed:active {\n color: #096dd9;\n border-color: #096dd9;\n background: #fff;\n}\n.ant-btn-dashed:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dashed:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dashed[disabled],\n.ant-btn-dashed[disabled]:hover,\n.ant-btn-dashed[disabled]:focus,\n.ant-btn-dashed[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dashed[disabled] > a:only-child,\n.ant-btn-dashed[disabled]:hover > a:only-child,\n.ant-btn-dashed[disabled]:focus > a:only-child,\n.ant-btn-dashed[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dashed[disabled] > a:only-child::after,\n.ant-btn-dashed[disabled]:hover > a:only-child::after,\n.ant-btn-dashed[disabled]:focus > a:only-child::after,\n.ant-btn-dashed[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-danger {\n color: #fff;\n border-color: #ff4d4f;\n background: #ff4d4f;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-danger > a:only-child {\n color: currentcolor;\n}\n.ant-btn-danger > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-danger:hover,\n.ant-btn-danger:focus {\n color: #fff;\n border-color: #ff7875;\n background: #ff7875;\n}\n.ant-btn-danger:hover > a:only-child,\n.ant-btn-danger:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-danger:hover > a:only-child::after,\n.ant-btn-danger:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-danger:active {\n color: #fff;\n border-color: #d9363e;\n background: #d9363e;\n}\n.ant-btn-danger:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-danger:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-danger[disabled],\n.ant-btn-danger[disabled]:hover,\n.ant-btn-danger[disabled]:focus,\n.ant-btn-danger[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-danger[disabled] > a:only-child,\n.ant-btn-danger[disabled]:hover > a:only-child,\n.ant-btn-danger[disabled]:focus > a:only-child,\n.ant-btn-danger[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-danger[disabled] > a:only-child::after,\n.ant-btn-danger[disabled]:hover > a:only-child::after,\n.ant-btn-danger[disabled]:focus > a:only-child::after,\n.ant-btn-danger[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-link {\n color: #1890ff;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n}\n.ant-btn-link > a:only-child {\n color: currentcolor;\n}\n.ant-btn-link > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-link:hover,\n.ant-btn-link:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: transparent;\n}\n.ant-btn-link:hover > a:only-child,\n.ant-btn-link:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-link:hover > a:only-child::after,\n.ant-btn-link:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-link:active {\n color: #096dd9;\n border-color: #096dd9;\n background: transparent;\n}\n.ant-btn-link:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-link:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-link[disabled],\n.ant-btn-link[disabled]:hover,\n.ant-btn-link[disabled]:focus,\n.ant-btn-link[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-link[disabled] > a:only-child,\n.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-link[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-link[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-link:hover {\n background: transparent;\n}\n.ant-btn-link:hover,\n.ant-btn-link:focus,\n.ant-btn-link:active {\n border-color: transparent;\n}\n.ant-btn-link[disabled],\n.ant-btn-link[disabled]:hover,\n.ant-btn-link[disabled]:focus,\n.ant-btn-link[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: transparent;\n background: transparent;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-link[disabled] > a:only-child,\n.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-link[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-link[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-text {\n color: rgba(0, 0, 0, 0.85);\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n}\n.ant-btn-text > a:only-child {\n color: currentcolor;\n}\n.ant-btn-text > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-text:hover,\n.ant-btn-text:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: transparent;\n}\n.ant-btn-text:hover > a:only-child,\n.ant-btn-text:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-text:hover > a:only-child::after,\n.ant-btn-text:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-text:active {\n color: #096dd9;\n border-color: #096dd9;\n background: transparent;\n}\n.ant-btn-text:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-text:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-text[disabled],\n.ant-btn-text[disabled]:hover,\n.ant-btn-text[disabled]:focus,\n.ant-btn-text[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-text[disabled] > a:only-child,\n.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-text[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-text[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-text:hover,\n.ant-btn-text:focus {\n color: rgba(0, 0, 0, 0.85);\n background: rgba(0, 0, 0, 0.018);\n border-color: transparent;\n}\n.ant-btn-text:active {\n color: rgba(0, 0, 0, 0.85);\n background: rgba(0, 0, 0, 0.028);\n border-color: transparent;\n}\n.ant-btn-text[disabled],\n.ant-btn-text[disabled]:hover,\n.ant-btn-text[disabled]:focus,\n.ant-btn-text[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: transparent;\n background: transparent;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-text[disabled] > a:only-child,\n.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-text[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-text[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous {\n color: #ff4d4f;\n border-color: #ff4d4f;\n background: #fff;\n}\n.ant-btn-dangerous > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous:hover,\n.ant-btn-dangerous:focus {\n color: #ff7875;\n border-color: #ff7875;\n background: #fff;\n}\n.ant-btn-dangerous:hover > a:only-child,\n.ant-btn-dangerous:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous:hover > a:only-child::after,\n.ant-btn-dangerous:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous:active {\n color: #d9363e;\n border-color: #d9363e;\n background: #fff;\n}\n.ant-btn-dangerous:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous[disabled],\n.ant-btn-dangerous[disabled]:hover,\n.ant-btn-dangerous[disabled]:focus,\n.ant-btn-dangerous[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous[disabled] > a:only-child,\n.ant-btn-dangerous[disabled]:hover > a:only-child,\n.ant-btn-dangerous[disabled]:focus > a:only-child,\n.ant-btn-dangerous[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous[disabled] > a:only-child::after,\n.ant-btn-dangerous[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-primary {\n color: #fff;\n border-color: #ff4d4f;\n background: #ff4d4f;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-dangerous.ant-btn-primary > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-primary:hover,\n.ant-btn-dangerous.ant-btn-primary:focus {\n color: #fff;\n border-color: #ff7875;\n background: #ff7875;\n}\n.ant-btn-dangerous.ant-btn-primary:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-primary:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-primary:active {\n color: #fff;\n border-color: #d9363e;\n background: #d9363e;\n}\n.ant-btn-dangerous.ant-btn-primary:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-primary[disabled],\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link {\n color: #ff4d4f;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-dangerous.ant-btn-link:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link:active {\n color: #096dd9;\n border-color: #096dd9;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-dangerous.ant-btn-link[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-dangerous.ant-btn-link:focus {\n color: #ff7875;\n border-color: transparent;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link:active {\n color: #d9363e;\n border-color: transparent;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-dangerous.ant-btn-link[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: transparent;\n background: transparent;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text {\n color: #ff4d4f;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text:hover,\n.ant-btn-dangerous.ant-btn-text:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text:active {\n color: #096dd9;\n border-color: #096dd9;\n background: transparent;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text[disabled],\n.ant-btn-dangerous.ant-btn-text[disabled]:hover,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus,\n.ant-btn-dangerous.ant-btn-text[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text:hover,\n.ant-btn-dangerous.ant-btn-text:focus {\n color: #ff7875;\n border-color: transparent;\n background: rgba(0, 0, 0, 0.018);\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text:active {\n color: #d9363e;\n border-color: transparent;\n background: rgba(0, 0, 0, 0.028);\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-dangerous.ant-btn-text[disabled],\n.ant-btn-dangerous.ant-btn-text[disabled]:hover,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus,\n.ant-btn-dangerous.ant-btn-text[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: transparent;\n background: transparent;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-icon-only {\n width: 32px;\n height: 32px;\n padding: 2.4px 0;\n font-size: 16px;\n border-radius: 2px;\n vertical-align: -3px;\n}\n.ant-btn-icon-only > * {\n font-size: 16px;\n}\n.ant-btn-icon-only.ant-btn-lg {\n width: 40px;\n height: 40px;\n padding: 4.9px 0;\n font-size: 18px;\n border-radius: 2px;\n}\n.ant-btn-icon-only.ant-btn-lg > * {\n font-size: 18px;\n}\n.ant-btn-icon-only.ant-btn-sm {\n width: 24px;\n height: 24px;\n padding: 0px 0;\n font-size: 14px;\n border-radius: 2px;\n}\n.ant-btn-icon-only.ant-btn-sm > * {\n font-size: 14px;\n}\n.ant-btn-icon-only > .anticon {\n display: flex;\n justify-content: center;\n}\n.ant-btn-icon-only .anticon-loading {\n padding: 0 !important;\n}\na.ant-btn-icon-only {\n vertical-align: -1px;\n}\na.ant-btn-icon-only > .anticon {\n display: inline;\n}\n.ant-btn-round {\n height: 32px;\n padding: 4px 16px;\n font-size: 14px;\n border-radius: 32px;\n}\n.ant-btn-round.ant-btn-lg {\n height: 40px;\n padding: 6.4px 20px;\n font-size: 16px;\n border-radius: 40px;\n}\n.ant-btn-round.ant-btn-sm {\n height: 24px;\n padding: 0px 12px;\n font-size: 14px;\n border-radius: 24px;\n}\n.ant-btn-round.ant-btn-icon-only {\n width: auto;\n}\n.ant-btn-circle {\n min-width: 32px;\n padding-right: 0;\n padding-left: 0;\n text-align: center;\n border-radius: 50%;\n}\n.ant-btn-circle.ant-btn-lg {\n min-width: 40px;\n border-radius: 50%;\n}\n.ant-btn-circle.ant-btn-sm {\n min-width: 24px;\n border-radius: 50%;\n}\n.ant-btn::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n left: -1px;\n z-index: 1;\n display: none;\n background: #fff;\n border-radius: inherit;\n opacity: 0.35;\n transition: opacity 0.2s;\n content: '';\n pointer-events: none;\n}\n.ant-btn .anticon {\n transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-btn .anticon.anticon-plus > svg,\n.ant-btn .anticon.anticon-minus > svg {\n shape-rendering: optimizespeed;\n}\n.ant-btn.ant-btn-loading {\n position: relative;\n cursor: default;\n}\n.ant-btn.ant-btn-loading::before {\n display: block;\n}\n.ant-btn > .ant-btn-loading-icon {\n transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-btn > .ant-btn-loading-icon .anticon {\n padding-right: 8px;\n -webkit-animation: none;\n animation: none;\n}\n.ant-btn > .ant-btn-loading-icon .anticon svg {\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n.ant-btn-group {\n position: relative;\n display: inline-flex;\n}\n.ant-btn-group > .ant-btn,\n.ant-btn-group > span > .ant-btn {\n position: relative;\n}\n.ant-btn-group > .ant-btn:hover,\n.ant-btn-group > span > .ant-btn:hover,\n.ant-btn-group > .ant-btn:focus,\n.ant-btn-group > span > .ant-btn:focus,\n.ant-btn-group > .ant-btn:active,\n.ant-btn-group > span > .ant-btn:active {\n z-index: 2;\n}\n.ant-btn-group > .ant-btn[disabled],\n.ant-btn-group > span > .ant-btn[disabled] {\n z-index: 0;\n}\n.ant-btn-group .ant-btn-icon-only {\n font-size: 14px;\n}\n.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn + .ant-btn-group,\n.ant-btn-group span + .ant-btn,\n.ant-btn-group .ant-btn + span,\n.ant-btn-group > span + span,\n.ant-btn-group + .ant-btn,\n.ant-btn-group + .ant-btn-group {\n margin-left: -1px;\n}\n.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) {\n border-left-color: transparent;\n}\n.ant-btn-group .ant-btn {\n border-radius: 0;\n}\n.ant-btn-group > .ant-btn:first-child,\n.ant-btn-group > span:first-child > .ant-btn {\n margin-left: 0;\n}\n.ant-btn-group > .ant-btn:only-child {\n border-radius: 2px;\n}\n.ant-btn-group > span:only-child > .ant-btn {\n border-radius: 2px;\n}\n.ant-btn-group > .ant-btn:first-child:not(:last-child),\n.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-btn-group > .ant-btn:last-child:not(:first-child),\n.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {\n border-top-right-radius: 2px;\n border-bottom-right-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:only-child {\n border-radius: 2px;\n}\n.ant-btn-group-sm > span:only-child > .ant-btn {\n border-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn {\n border-top-right-radius: 2px;\n border-bottom-right-radius: 2px;\n}\n.ant-btn-group > .ant-btn-group {\n float: left;\n}\n.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn {\n border-radius: 0;\n}\n.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child {\n padding-right: 8px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child {\n padding-left: 8px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-btn-rtl.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn-rtl.ant-btn + .ant-btn-group,\n.ant-btn-rtl.ant-btn-group span + .ant-btn,\n.ant-btn-rtl.ant-btn-group .ant-btn + span,\n.ant-btn-rtl.ant-btn-group > span + span,\n.ant-btn-rtl.ant-btn-group + .ant-btn,\n.ant-btn-rtl.ant-btn-group + .ant-btn-group,\n.ant-btn-group-rtl.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn-group-rtl.ant-btn + .ant-btn-group,\n.ant-btn-group-rtl.ant-btn-group span + .ant-btn,\n.ant-btn-group-rtl.ant-btn-group .ant-btn + span,\n.ant-btn-group-rtl.ant-btn-group > span + span,\n.ant-btn-group-rtl.ant-btn-group + .ant-btn,\n.ant-btn-group-rtl.ant-btn-group + .ant-btn-group {\n margin-right: -1px;\n margin-left: auto;\n}\n.ant-btn-group.ant-btn-group-rtl {\n direction: rtl;\n}\n.ant-btn-group-rtl.ant-btn-group > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-rtl.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {\n border-radius: 0 2px 2px 0;\n}\n.ant-btn-group-rtl.ant-btn-group > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {\n border-radius: 2px 0 0 2px;\n}\n.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-rtl.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn {\n border-radius: 0 2px 2px 0;\n}\n.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn {\n border-radius: 2px 0 0 2px;\n}\n.ant-btn:focus > span,\n.ant-btn:active > span {\n position: relative;\n}\n.ant-btn > .anticon + span,\n.ant-btn > span + .anticon {\n margin-left: 8px;\n}\n.ant-btn.ant-btn-background-ghost {\n color: #fff;\n border-color: #fff;\n}\n.ant-btn.ant-btn-background-ghost,\n.ant-btn.ant-btn-background-ghost:hover,\n.ant-btn.ant-btn-background-ghost:active,\n.ant-btn.ant-btn-background-ghost:focus {\n background: transparent;\n}\n.ant-btn.ant-btn-background-ghost:hover,\n.ant-btn.ant-btn-background-ghost:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n}\n.ant-btn.ant-btn-background-ghost:active {\n color: #096dd9;\n border-color: #096dd9;\n}\n.ant-btn.ant-btn-background-ghost[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background: transparent;\n border-color: #d9d9d9;\n}\n.ant-btn-background-ghost.ant-btn-primary {\n color: #1890ff;\n border-color: #1890ff;\n text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-primary > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary:hover,\n.ant-btn-background-ghost.ant-btn-primary:focus {\n color: #40a9ff;\n border-color: #40a9ff;\n}\n.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary:active {\n color: #096dd9;\n border-color: #096dd9;\n}\n.ant-btn-background-ghost.ant-btn-primary:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled],\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger {\n color: #ff4d4f;\n border-color: #ff4d4f;\n text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-danger > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger:hover,\n.ant-btn-background-ghost.ant-btn-danger:focus {\n color: #ff7875;\n border-color: #ff7875;\n}\n.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger:active {\n color: #d9363e;\n border-color: #d9363e;\n}\n.ant-btn-background-ghost.ant-btn-danger:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled],\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous {\n color: #ff4d4f;\n border-color: #ff4d4f;\n text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover,\n.ant-btn-background-ghost.ant-btn-dangerous:focus {\n color: #ff7875;\n border-color: #ff7875;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active {\n color: #d9363e;\n border-color: #d9363e;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled],\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link {\n color: #ff4d4f;\n border-color: transparent;\n text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus {\n color: #ff7875;\n border-color: transparent;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active {\n color: #d9363e;\n border-color: transparent;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n background: #f5f5f5;\n text-shadow: none;\n box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\n.ant-btn-two-chinese-chars::first-letter {\n letter-spacing: 0.34em;\n}\n.ant-btn-two-chinese-chars > *:not(.anticon) {\n margin-right: -0.34em;\n letter-spacing: 0.34em;\n}\n.ant-btn.ant-btn-block {\n width: 100%;\n}\n.ant-btn:empty {\n display: inline-block;\n width: 0;\n visibility: hidden;\n content: '\\a0';\n}\na.ant-btn {\n padding-top: 0.01px !important;\n line-height: 30px;\n}\na.ant-btn-disabled {\n cursor: not-allowed;\n}\na.ant-btn-disabled > * {\n pointer-events: none;\n}\na.ant-btn-disabled,\na.ant-btn-disabled:hover,\na.ant-btn-disabled:focus,\na.ant-btn-disabled:active {\n color: rgba(0, 0, 0, 0.25);\n border-color: transparent;\n background: transparent;\n text-shadow: none;\n box-shadow: none;\n}\na.ant-btn-disabled > a:only-child,\na.ant-btn-disabled:hover > a:only-child,\na.ant-btn-disabled:focus > a:only-child,\na.ant-btn-disabled:active > a:only-child {\n color: currentcolor;\n}\na.ant-btn-disabled > a:only-child::after,\na.ant-btn-disabled:hover > a:only-child::after,\na.ant-btn-disabled:focus > a:only-child::after,\na.ant-btn-disabled:active > a:only-child::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n}\na.ant-btn-lg {\n line-height: 38px;\n}\na.ant-btn-sm {\n line-height: 22px;\n}\n.ant-btn-rtl {\n direction: rtl;\n}\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary {\n border-right-color: #40a9ff;\n border-left-color: #d9d9d9;\n}\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {\n border-right-color: #d9d9d9;\n border-left-color: #40a9ff;\n}\n.ant-btn-rtl.ant-btn > .ant-btn-loading-icon .anticon {\n padding-right: 0;\n padding-left: 8px;\n}\n.ant-btn-rtl.ant-btn > .anticon + span,\n.ant-btn-rtl.ant-btn > span + .anticon {\n margin-right: 8px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-menu-item-danger.ant-menu-item {\n color: #ff4d4f;\n}\n.ant-menu-item-danger.ant-menu-item:hover,\n.ant-menu-item-danger.ant-menu-item-active {\n color: #ff4d4f;\n}\n.ant-menu-item-danger.ant-menu-item:active {\n background: #fff1f0;\n}\n.ant-menu-item-danger.ant-menu-item-selected {\n color: #ff4d4f;\n}\n.ant-menu-item-danger.ant-menu-item-selected > a,\n.ant-menu-item-danger.ant-menu-item-selected > a:hover {\n color: #ff4d4f;\n}\n.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {\n background-color: #fff1f0;\n}\n.ant-menu-inline .ant-menu-item-danger.ant-menu-item::after {\n border-right-color: #ff4d4f;\n}\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item,\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item > a {\n color: #ff4d4f;\n}\n.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {\n color: #fff;\n background-color: #ff4d4f;\n}\n.ant-menu {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n font-variant: tabular-nums;\n line-height: 1.5715;\n font-feature-settings: 'tnum';\n margin-bottom: 0;\n padding-left: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 0;\n text-align: left;\n list-style: none;\n background: #fff;\n outline: none;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n transition: background 0.3s, width 0.3s cubic-bezier(0.2, 0, 0, 1) 0s;\n}\n.ant-menu::before {\n display: table;\n content: '';\n}\n.ant-menu::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-menu.ant-menu-root:focus-visible {\n box-shadow: 0 0 0 2px #bae7ff;\n}\n.ant-menu ul,\n.ant-menu ol {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.ant-menu-overflow {\n display: flex;\n}\n.ant-menu-overflow-item {\n flex: none;\n}\n.ant-menu-hidden,\n.ant-menu-submenu-hidden {\n display: none;\n}\n.ant-menu-item-group-title {\n height: 1.5715;\n padding: 8px 16px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.5715;\n transition: all 0.3s;\n}\n.ant-menu-horizontal .ant-menu-submenu {\n transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu,\n.ant-menu-submenu-inline {\n transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-selected {\n color: #1890ff;\n}\n.ant-menu-item:active,\n.ant-menu-submenu-title:active {\n background: #e6f7ff;\n}\n.ant-menu-submenu .ant-menu-sub {\n cursor: initial;\n transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-title-content {\n transition: color 0.3s;\n}\n.ant-menu-item a {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-menu-item a:hover {\n color: #1890ff;\n}\n.ant-menu-item a::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: transparent;\n content: '';\n}\n.ant-menu-item > .ant-badge a {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-menu-item > .ant-badge a:hover {\n color: #1890ff;\n}\n.ant-menu-item-divider {\n overflow: hidden;\n line-height: 0;\n border-color: #f0f0f0;\n border-style: solid;\n border-width: 1px 0 0;\n}\n.ant-menu-item-divider-dashed {\n border-style: dashed;\n}\n.ant-menu-horizontal .ant-menu-item,\n.ant-menu-horizontal .ant-menu-submenu {\n margin-top: -1px;\n}\n.ant-menu-horizontal > .ant-menu-item:hover,\n.ant-menu-horizontal > .ant-menu-item-active,\n.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover {\n background-color: transparent;\n}\n.ant-menu-item-selected {\n color: #1890ff;\n}\n.ant-menu-item-selected a,\n.ant-menu-item-selected a:hover {\n color: #1890ff;\n}\n.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {\n background-color: #e6f7ff;\n}\n.ant-menu-inline,\n.ant-menu-vertical,\n.ant-menu-vertical-left {\n border-right: 1px solid #f0f0f0;\n}\n.ant-menu-vertical-right {\n border-left: 1px solid #f0f0f0;\n}\n.ant-menu-vertical.ant-menu-sub,\n.ant-menu-vertical-left.ant-menu-sub,\n.ant-menu-vertical-right.ant-menu-sub {\n min-width: 160px;\n max-height: calc(100vh - 100px);\n padding: 0;\n overflow: hidden;\n border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub:not([class*='-active']),\n.ant-menu-vertical-left.ant-menu-sub:not([class*='-active']),\n.ant-menu-vertical-right.ant-menu-sub:not([class*='-active']) {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.ant-menu-vertical.ant-menu-sub .ant-menu-item,\n.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,\n.ant-menu-vertical-right.ant-menu-sub .ant-menu-item {\n left: 0;\n margin-left: 0;\n border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub .ant-menu-item::after,\n.ant-menu-vertical-left.ant-menu-sub .ant-menu-item::after,\n.ant-menu-vertical-right.ant-menu-sub .ant-menu-item::after {\n border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu {\n transform-origin: 0 0;\n}\n.ant-menu-horizontal.ant-menu-sub {\n min-width: 114px;\n}\n.ant-menu-horizontal .ant-menu-item,\n.ant-menu-horizontal .ant-menu-submenu-title {\n transition: border-color 0.3s, background 0.3s;\n}\n.ant-menu-item,\n.ant-menu-submenu-title {\n position: relative;\n display: block;\n margin: 0;\n padding: 0 20px;\n white-space: nowrap;\n cursor: pointer;\n transition: border-color 0.3s, background 0.3s, padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-item .ant-menu-item-icon,\n.ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu-item .anticon,\n.ant-menu-submenu-title .anticon {\n min-width: 14px;\n font-size: 14px;\n transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s;\n}\n.ant-menu-item .ant-menu-item-icon + span,\n.ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu-item .anticon + span,\n.ant-menu-submenu-title .anticon + span {\n margin-left: 10px;\n opacity: 1;\n transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), margin 0.3s, color 0.3s;\n}\n.ant-menu-item .ant-menu-item-icon.svg,\n.ant-menu-submenu-title .ant-menu-item-icon.svg {\n vertical-align: -0.125em;\n}\n.ant-menu-item.ant-menu-item-only-child > .anticon,\n.ant-menu-submenu-title.ant-menu-item-only-child > .anticon,\n.ant-menu-item.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-submenu-title.ant-menu-item-only-child > .ant-menu-item-icon {\n margin-right: 0;\n}\n.ant-menu-item:focus-visible,\n.ant-menu-submenu-title:focus-visible {\n box-shadow: 0 0 0 2px #bae7ff;\n}\n.ant-menu > .ant-menu-item-divider {\n margin: 1px 0;\n padding: 0;\n}\n.ant-menu-submenu-popup {\n position: absolute;\n z-index: 1050;\n background: transparent;\n border-radius: 2px;\n box-shadow: none;\n transform-origin: 0 0;\n}\n.ant-menu-submenu-popup::before {\n position: absolute;\n top: -7px;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n width: 100%;\n height: 100%;\n opacity: 0.0001;\n content: ' ';\n}\n.ant-menu-submenu-placement-rightTop::before {\n top: 0;\n left: -7px;\n}\n.ant-menu-submenu > .ant-menu {\n background-color: #fff;\n border-radius: 2px;\n}\n.ant-menu-submenu > .ant-menu-submenu-title::after {\n transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-popup > .ant-menu {\n background-color: #fff;\n}\n.ant-menu-submenu-expand-icon,\n.ant-menu-submenu-arrow {\n position: absolute;\n top: 50%;\n right: 16px;\n width: 10px;\n color: rgba(0, 0, 0, 0.85);\n transform: translateY(-50%);\n transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-arrow::before,\n.ant-menu-submenu-arrow::after {\n position: absolute;\n width: 6px;\n height: 1.5px;\n background-color: currentcolor;\n border-radius: 2px;\n transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n content: '';\n}\n.ant-menu-submenu-arrow::before {\n transform: rotate(45deg) translateY(-2.5px);\n}\n.ant-menu-submenu-arrow::after {\n transform: rotate(-45deg) translateY(2.5px);\n}\n.ant-menu-submenu:hover > .ant-menu-submenu-title > .ant-menu-submenu-expand-icon,\n.ant-menu-submenu:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n color: #1890ff;\n}\n.ant-menu-inline-collapsed .ant-menu-submenu-arrow::before,\n.ant-menu-submenu-inline .ant-menu-submenu-arrow::before {\n transform: rotate(-45deg) translateX(2.5px);\n}\n.ant-menu-inline-collapsed .ant-menu-submenu-arrow::after,\n.ant-menu-submenu-inline .ant-menu-submenu-arrow::after {\n transform: rotate(45deg) translateX(-2.5px);\n}\n.ant-menu-submenu-horizontal .ant-menu-submenu-arrow {\n display: none;\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n transform: translateY(-2px);\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n transform: rotate(-45deg) translateX(-2.5px);\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before {\n transform: rotate(45deg) translateX(2.5px);\n}\n.ant-menu-vertical .ant-menu-submenu-selected,\n.ant-menu-vertical-left .ant-menu-submenu-selected,\n.ant-menu-vertical-right .ant-menu-submenu-selected {\n color: #1890ff;\n}\n.ant-menu-horizontal {\n line-height: 46px;\n border: 0;\n border-bottom: 1px solid #f0f0f0;\n box-shadow: none;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu {\n margin-top: -1px;\n margin-bottom: 0;\n padding: 0 20px;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-active,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-active,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-open,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-open,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-selected,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected {\n color: #1890ff;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-active::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-active::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-open::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-open::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-selected::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected::after {\n border-bottom: 2px solid #1890ff;\n}\n.ant-menu-horizontal > .ant-menu-item,\n.ant-menu-horizontal > .ant-menu-submenu {\n position: relative;\n top: 1px;\n display: inline-block;\n vertical-align: bottom;\n}\n.ant-menu-horizontal > .ant-menu-item::after,\n.ant-menu-horizontal > .ant-menu-submenu::after {\n position: absolute;\n right: 20px;\n bottom: 0;\n left: 20px;\n border-bottom: 2px solid transparent;\n transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n content: '';\n}\n.ant-menu-horizontal > .ant-menu-submenu > .ant-menu-submenu-title {\n padding: 0;\n}\n.ant-menu-horizontal > .ant-menu-item a {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-menu-horizontal > .ant-menu-item a:hover {\n color: #1890ff;\n}\n.ant-menu-horizontal > .ant-menu-item a::before {\n bottom: -2px;\n}\n.ant-menu-horizontal > .ant-menu-item-selected a {\n color: #1890ff;\n}\n.ant-menu-horizontal::after {\n display: block;\n clear: both;\n height: 0;\n content: '\\20';\n}\n.ant-menu-vertical .ant-menu-item,\n.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-inline .ant-menu-item {\n position: relative;\n}\n.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-vertical-right .ant-menu-item::after,\n.ant-menu-inline .ant-menu-item::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n border-right: 3px solid #1890ff;\n transform: scaleY(0.0001);\n opacity: 0;\n transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1);\n content: '';\n}\n.ant-menu-vertical .ant-menu-item,\n.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-inline .ant-menu-item,\n.ant-menu-vertical .ant-menu-submenu-title,\n.ant-menu-vertical-left .ant-menu-submenu-title,\n.ant-menu-vertical-right .ant-menu-submenu-title,\n.ant-menu-inline .ant-menu-submenu-title {\n height: 40px;\n margin-top: 4px;\n margin-bottom: 4px;\n padding: 0 16px;\n overflow: hidden;\n line-height: 40px;\n text-overflow: ellipsis;\n}\n.ant-menu-vertical .ant-menu-submenu,\n.ant-menu-vertical-left .ant-menu-submenu,\n.ant-menu-vertical-right .ant-menu-submenu,\n.ant-menu-inline .ant-menu-submenu {\n padding-bottom: 0.02px;\n}\n.ant-menu-vertical .ant-menu-item:not(:last-child),\n.ant-menu-vertical-left .ant-menu-item:not(:last-child),\n.ant-menu-vertical-right .ant-menu-item:not(:last-child),\n.ant-menu-inline .ant-menu-item:not(:last-child) {\n margin-bottom: 8px;\n}\n.ant-menu-vertical > .ant-menu-item,\n.ant-menu-vertical-left > .ant-menu-item,\n.ant-menu-vertical-right > .ant-menu-item,\n.ant-menu-inline > .ant-menu-item,\n.ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-vertical-left > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-vertical-right > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {\n height: 40px;\n line-height: 40px;\n}\n.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,\n.ant-menu-vertical .ant-menu-submenu-title {\n padding-right: 34px;\n}\n.ant-menu-inline {\n width: 100%;\n}\n.ant-menu-inline .ant-menu-selected::after,\n.ant-menu-inline .ant-menu-item-selected::after {\n transform: scaleY(1);\n opacity: 1;\n transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-inline .ant-menu-item,\n.ant-menu-inline .ant-menu-submenu-title {\n width: calc(100% + 1px);\n}\n.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,\n.ant-menu-inline .ant-menu-submenu-title {\n padding-right: 34px;\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title {\n display: flex;\n align-items: center;\n transition: border-color 0.3s, background 0.3s, padding 0.1s cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item > .ant-menu-title-content,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title > .ant-menu-title-content {\n flex: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item > *,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title > * {\n flex: none;\n}\n.ant-menu.ant-menu-inline-collapsed {\n width: 80px;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {\n left: 0;\n padding: 0 calc(50% - 16px / 2);\n text-overflow: clip;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow {\n opacity: 0;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon {\n margin: 0;\n font-size: 16px;\n line-height: 40px;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span {\n display: inline-block;\n opacity: 0;\n}\n.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed .anticon {\n display: inline-block;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip {\n pointer-events: none;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed-tooltip .anticon {\n display: none;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip a {\n color: rgba(255, 255, 255, 0.85);\n}\n.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title {\n padding-right: 4px;\n padding-left: 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-menu-item-group-list {\n margin: 0;\n padding: 0;\n}\n.ant-menu-item-group-list .ant-menu-item,\n.ant-menu-item-group-list .ant-menu-submenu-title {\n padding: 0 16px 0 28px;\n}\n.ant-menu-root.ant-menu-vertical,\n.ant-menu-root.ant-menu-vertical-left,\n.ant-menu-root.ant-menu-vertical-right,\n.ant-menu-root.ant-menu-inline {\n box-shadow: none;\n}\n.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item > .ant-menu-inline-collapsed-noicon,\n.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title > .ant-menu-inline-collapsed-noicon {\n font-size: 16px;\n text-align: center;\n}\n.ant-menu-sub.ant-menu-inline {\n padding: 0;\n background: #fafafa;\n border: 0;\n border-radius: 0;\n box-shadow: none;\n}\n.ant-menu-sub.ant-menu-inline > .ant-menu-item,\n.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {\n height: 40px;\n line-height: 40px;\n list-style-position: inside;\n list-style-type: disc;\n}\n.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title {\n padding-left: 32px;\n}\n.ant-menu-item-disabled,\n.ant-menu-submenu-disabled {\n color: rgba(0, 0, 0, 0.25) !important;\n background: none;\n cursor: not-allowed;\n}\n.ant-menu-item-disabled::after,\n.ant-menu-submenu-disabled::after {\n border-color: transparent !important;\n}\n.ant-menu-item-disabled a,\n.ant-menu-submenu-disabled a {\n color: rgba(0, 0, 0, 0.25) !important;\n pointer-events: none;\n}\n.ant-menu-item-disabled > .ant-menu-submenu-title,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title {\n color: rgba(0, 0, 0, 0.25) !important;\n cursor: not-allowed;\n}\n.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n background: rgba(0, 0, 0, 0.25) !important;\n}\n.ant-layout-header .ant-menu {\n line-height: inherit;\n}\n.ant-menu-inline-collapsed-tooltip a,\n.ant-menu-inline-collapsed-tooltip a:hover {\n color: #fff;\n}\n.ant-menu-light .ant-menu-item:hover,\n.ant-menu-light .ant-menu-item-active,\n.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,\n.ant-menu-light .ant-menu-submenu-active,\n.ant-menu-light .ant-menu-submenu-title:hover {\n color: #1890ff;\n}\n.ant-menu.ant-menu-root:focus-visible {\n box-shadow: 0 0 0 2px #096dd9;\n}\n.ant-menu-dark .ant-menu-item:focus-visible,\n.ant-menu-dark .ant-menu-submenu-title:focus-visible {\n box-shadow: 0 0 0 2px #096dd9;\n}\n.ant-menu.ant-menu-dark,\n.ant-menu-dark .ant-menu-sub,\n.ant-menu.ant-menu-dark .ant-menu-sub {\n color: rgba(255, 255, 255, 0.65);\n background: #001529;\n}\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow {\n opacity: 0.45;\n transition: all 0.3s;\n}\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before {\n background: #fff;\n}\n.ant-menu-dark.ant-menu-submenu-popup {\n background: transparent;\n}\n.ant-menu-dark .ant-menu-inline.ant-menu-sub {\n background: #000c17;\n}\n.ant-menu-dark.ant-menu-horizontal {\n border-bottom: 0;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item,\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu {\n top: 0;\n margin-top: 0;\n padding: 0 20px;\n border-color: #001529;\n border-bottom: 0;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item:hover {\n background-color: #1890ff;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item > a::before {\n bottom: 0;\n}\n.ant-menu-dark .ant-menu-item,\n.ant-menu-dark .ant-menu-item-group-title,\n.ant-menu-dark .ant-menu-item > a,\n.ant-menu-dark .ant-menu-item > span > a {\n color: rgba(255, 255, 255, 0.65);\n}\n.ant-menu-dark.ant-menu-inline,\n.ant-menu-dark.ant-menu-vertical,\n.ant-menu-dark.ant-menu-vertical-left,\n.ant-menu-dark.ant-menu-vertical-right {\n border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical-right .ant-menu-item {\n left: 0;\n margin-left: 0;\n border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical-right .ant-menu-item::after {\n border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item,\n.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title {\n width: 100%;\n}\n.ant-menu-dark .ant-menu-item:hover,\n.ant-menu-dark .ant-menu-item-active,\n.ant-menu-dark .ant-menu-submenu-active,\n.ant-menu-dark .ant-menu-submenu-open,\n.ant-menu-dark .ant-menu-submenu-selected,\n.ant-menu-dark .ant-menu-submenu-title:hover {\n color: #fff;\n background-color: transparent;\n}\n.ant-menu-dark .ant-menu-item:hover > a,\n.ant-menu-dark .ant-menu-item-active > a,\n.ant-menu-dark .ant-menu-submenu-active > a,\n.ant-menu-dark .ant-menu-submenu-open > a,\n.ant-menu-dark .ant-menu-submenu-selected > a,\n.ant-menu-dark .ant-menu-submenu-title:hover > a,\n.ant-menu-dark .ant-menu-item:hover > span > a,\n.ant-menu-dark .ant-menu-item-active > span > a,\n.ant-menu-dark .ant-menu-submenu-active > span > a,\n.ant-menu-dark .ant-menu-submenu-open > span > a,\n.ant-menu-dark .ant-menu-submenu-selected > span > a,\n.ant-menu-dark .ant-menu-submenu-title:hover > span > a {\n color: #fff;\n}\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n opacity: 1;\n}\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before {\n background: #fff;\n}\n.ant-menu-dark .ant-menu-item:hover {\n background-color: transparent;\n}\n.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected {\n background-color: #1890ff;\n}\n.ant-menu-dark .ant-menu-item-selected {\n color: #fff;\n border-right: 0;\n}\n.ant-menu-dark .ant-menu-item-selected::after {\n border-right: 0;\n}\n.ant-menu-dark .ant-menu-item-selected > a,\n.ant-menu-dark .ant-menu-item-selected > span > a,\n.ant-menu-dark .ant-menu-item-selected > a:hover,\n.ant-menu-dark .ant-menu-item-selected > span > a:hover {\n color: #fff;\n}\n.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,\n.ant-menu-dark .ant-menu-item-selected .anticon {\n color: #fff;\n}\n.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon + span,\n.ant-menu-dark .ant-menu-item-selected .anticon + span {\n color: #fff;\n}\n.ant-menu.ant-menu-dark .ant-menu-item-selected,\n.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected {\n background-color: #1890ff;\n}\n.ant-menu-dark .ant-menu-item-disabled,\n.ant-menu-dark .ant-menu-submenu-disabled,\n.ant-menu-dark .ant-menu-item-disabled > a,\n.ant-menu-dark .ant-menu-submenu-disabled > a,\n.ant-menu-dark .ant-menu-item-disabled > span > a,\n.ant-menu-dark .ant-menu-submenu-disabled > span > a {\n color: rgba(255, 255, 255, 0.35) !important;\n opacity: 0.8;\n}\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title {\n color: rgba(255, 255, 255, 0.35) !important;\n}\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n background: rgba(255, 255, 255, 0.35) !important;\n}\n.ant-menu.ant-menu-rtl {\n direction: rtl;\n text-align: right;\n}\n.ant-menu-rtl .ant-menu-item-group-title {\n text-align: right;\n}\n.ant-menu-rtl.ant-menu-inline,\n.ant-menu-rtl.ant-menu-vertical {\n border-right: none;\n border-left: 1px solid #f0f0f0;\n}\n.ant-menu-rtl.ant-menu-dark.ant-menu-inline,\n.ant-menu-rtl.ant-menu-dark.ant-menu-vertical {\n border-left: none;\n}\n.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu {\n transform-origin: top right;\n}\n.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-item .anticon,\n.ant-menu-rtl .ant-menu-submenu-title .anticon {\n margin-right: auto;\n margin-left: 10px;\n}\n.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child > .anticon,\n.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child > .anticon {\n margin-left: 0;\n}\n.ant-menu-submenu-rtl.ant-menu-submenu-popup {\n transform-origin: 100% 0;\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow {\n right: auto;\n left: 16px;\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before {\n transform: rotate(-45deg) translateY(-2px);\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after {\n transform: rotate(45deg) translateY(2px);\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-inline .ant-menu-item::after {\n right: auto;\n left: 0;\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-rtl.ant-menu-inline .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title {\n text-align: right;\n}\n.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title {\n padding-right: 0;\n padding-left: 34px;\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title {\n padding-right: 16px;\n padding-left: 34px;\n}\n.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title {\n padding: 0 calc(50% - 16px / 2);\n}\n.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,\n.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title {\n padding: 0 28px 0 16px;\n}\n.ant-menu-sub.ant-menu-inline {\n border: 0;\n}\n.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title {\n padding-right: 32px;\n padding-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-tooltip {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n z-index: 1070;\n display: block;\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n width: intrinsic;\n max-width: 250px;\n visibility: visible;\n}\n.ant-tooltip-content {\n position: relative;\n}\n.ant-tooltip-hidden {\n display: none;\n}\n.ant-tooltip-placement-top,\n.ant-tooltip-placement-topLeft,\n.ant-tooltip-placement-topRight {\n padding-bottom: 14.3137085px;\n}\n.ant-tooltip-placement-right,\n.ant-tooltip-placement-rightTop,\n.ant-tooltip-placement-rightBottom {\n padding-left: 14.3137085px;\n}\n.ant-tooltip-placement-bottom,\n.ant-tooltip-placement-bottomLeft,\n.ant-tooltip-placement-bottomRight {\n padding-top: 14.3137085px;\n}\n.ant-tooltip-placement-left,\n.ant-tooltip-placement-leftTop,\n.ant-tooltip-placement-leftBottom {\n padding-right: 14.3137085px;\n}\n.ant-tooltip-inner {\n min-width: 30px;\n min-height: 32px;\n padding: 6px 8px;\n color: #fff;\n text-align: left;\n text-decoration: none;\n word-wrap: break-word;\n background-color: rgba(0, 0, 0, 0.75);\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-tooltip-arrow {\n position: absolute;\n z-index: 2;\n display: block;\n width: 22px;\n height: 22px;\n overflow: hidden;\n background: transparent;\n pointer-events: none;\n}\n.ant-tooltip-arrow-content {\n --antd-arrow-background-color: linear-gradient(to right bottom, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.75));\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n width: 11.3137085px;\n height: 11.3137085px;\n margin: auto;\n content: '';\n pointer-events: auto;\n border-radius: 0 0 2px;\n pointer-events: none;\n}\n.ant-tooltip-arrow-content::before {\n position: absolute;\n top: -11.3137085px;\n left: -11.3137085px;\n width: 33.9411255px;\n height: 33.9411255px;\n background: var(--antd-arrow-background-color);\n background-repeat: no-repeat;\n background-position: -10px -10px;\n content: '';\n -webkit-clip-path: inset(33% 33%);\n clip-path: inset(33% 33%);\n -webkit-clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow,\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow,\n.ant-tooltip-placement-topRight .ant-tooltip-arrow {\n bottom: 0;\n transform: translateY(100%);\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow-content,\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,\n.ant-tooltip-placement-topRight .ant-tooltip-arrow-content {\n box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n transform: translateY(-11px) rotate(45deg);\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow {\n left: 50%;\n transform: translateY(100%) translateX(-50%);\n}\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow {\n left: 13px;\n}\n.ant-tooltip-placement-topRight .ant-tooltip-arrow {\n right: 13px;\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow,\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow,\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {\n left: 0;\n transform: translateX(-100%);\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow-content,\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content,\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content {\n box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07);\n transform: translateX(11px) rotate(135deg);\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow {\n top: 50%;\n transform: translateX(-100%) translateY(-50%);\n}\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow {\n top: 5px;\n}\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {\n bottom: 5px;\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow,\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow,\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {\n right: 0;\n transform: translateX(100%);\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow-content,\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content,\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content {\n box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07);\n transform: translateX(-11px) rotate(315deg);\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow {\n top: 50%;\n transform: translateX(100%) translateY(-50%);\n}\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow {\n top: 5px;\n}\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {\n bottom: 5px;\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow,\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {\n top: 0;\n transform: translateY(-100%);\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content {\n box-shadow: -3px -3px 7px rgba(0, 0, 0, 0.07);\n transform: translateY(11px) rotate(225deg);\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow {\n left: 50%;\n transform: translateY(-100%) translateX(-50%);\n}\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow {\n left: 13px;\n}\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {\n right: 13px;\n}\n.ant-tooltip-pink .ant-tooltip-inner {\n background-color: #eb2f96;\n}\n.ant-tooltip-pink .ant-tooltip-arrow-content::before {\n background: #eb2f96;\n}\n.ant-tooltip-magenta .ant-tooltip-inner {\n background-color: #eb2f96;\n}\n.ant-tooltip-magenta .ant-tooltip-arrow-content::before {\n background: #eb2f96;\n}\n.ant-tooltip-red .ant-tooltip-inner {\n background-color: #f5222d;\n}\n.ant-tooltip-red .ant-tooltip-arrow-content::before {\n background: #f5222d;\n}\n.ant-tooltip-volcano .ant-tooltip-inner {\n background-color: #fa541c;\n}\n.ant-tooltip-volcano .ant-tooltip-arrow-content::before {\n background: #fa541c;\n}\n.ant-tooltip-orange .ant-tooltip-inner {\n background-color: #fa8c16;\n}\n.ant-tooltip-orange .ant-tooltip-arrow-content::before {\n background: #fa8c16;\n}\n.ant-tooltip-yellow .ant-tooltip-inner {\n background-color: #fadb14;\n}\n.ant-tooltip-yellow .ant-tooltip-arrow-content::before {\n background: #fadb14;\n}\n.ant-tooltip-gold .ant-tooltip-inner {\n background-color: #faad14;\n}\n.ant-tooltip-gold .ant-tooltip-arrow-content::before {\n background: #faad14;\n}\n.ant-tooltip-cyan .ant-tooltip-inner {\n background-color: #13c2c2;\n}\n.ant-tooltip-cyan .ant-tooltip-arrow-content::before {\n background: #13c2c2;\n}\n.ant-tooltip-lime .ant-tooltip-inner {\n background-color: #a0d911;\n}\n.ant-tooltip-lime .ant-tooltip-arrow-content::before {\n background: #a0d911;\n}\n.ant-tooltip-green .ant-tooltip-inner {\n background-color: #52c41a;\n}\n.ant-tooltip-green .ant-tooltip-arrow-content::before {\n background: #52c41a;\n}\n.ant-tooltip-blue .ant-tooltip-inner {\n background-color: #1890ff;\n}\n.ant-tooltip-blue .ant-tooltip-arrow-content::before {\n background: #1890ff;\n}\n.ant-tooltip-geekblue .ant-tooltip-inner {\n background-color: #2f54eb;\n}\n.ant-tooltip-geekblue .ant-tooltip-arrow-content::before {\n background: #2f54eb;\n}\n.ant-tooltip-purple .ant-tooltip-inner {\n background-color: #722ed1;\n}\n.ant-tooltip-purple .ant-tooltip-arrow-content::before {\n background: #722ed1;\n}\n.ant-tooltip-rtl {\n direction: rtl;\n}\n.ant-tooltip-rtl .ant-tooltip-inner {\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-picker-calendar {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n background: #fff;\n}\n.ant-picker-calendar-header {\n display: flex;\n justify-content: flex-end;\n padding: 12px 0;\n}\n.ant-picker-calendar-header .ant-picker-calendar-year-select {\n min-width: 80px;\n}\n.ant-picker-calendar-header .ant-picker-calendar-month-select {\n min-width: 70px;\n margin-left: 8px;\n}\n.ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n margin-left: 8px;\n}\n.ant-picker-calendar .ant-picker-panel {\n background: #fff;\n border: 0;\n border-top: 1px solid #f0f0f0;\n border-radius: 0;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel,\n.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel {\n width: auto;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-body {\n padding: 8px 0;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-content {\n width: 100%;\n}\n.ant-picker-calendar-mini {\n border-radius: 2px;\n}\n.ant-picker-calendar-mini .ant-picker-calendar-header {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-picker-calendar-mini .ant-picker-panel {\n border-radius: 0 0 2px 2px;\n}\n.ant-picker-calendar-mini .ant-picker-content {\n height: 256px;\n}\n.ant-picker-calendar-mini .ant-picker-content th {\n height: auto;\n padding: 0;\n line-height: 18px;\n}\n.ant-picker-calendar-mini .ant-picker-cell::before {\n pointer-events: none;\n}\n.ant-picker-calendar-full .ant-picker-panel {\n display: block;\n width: 100%;\n text-align: right;\n background: #fff;\n border: 0;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td {\n padding: 0;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th {\n height: auto;\n padding: 0 12px 5px 0;\n line-height: 18px;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell::before {\n display: none;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date {\n background: #f5f5f5;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today::before {\n display: none;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today {\n background: #e6f7ff;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value {\n color: #1890ff;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {\n display: block;\n width: auto;\n height: auto;\n margin: 0 4px;\n padding: 4px 8px 0;\n border: 0;\n border-top: 2px solid #f0f0f0;\n border-radius: 0;\n transition: background 0.3s;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value {\n line-height: 24px;\n transition: color 0.3s;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content {\n position: static;\n width: auto;\n height: 86px;\n overflow-y: auto;\n color: rgba(0, 0, 0, 0.85);\n line-height: 1.5715;\n text-align: left;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {\n border-color: #1890ff;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value {\n color: rgba(0, 0, 0, 0.85);\n}\n@media only screen and (max-width: 480px) {\n .ant-picker-calendar-header {\n display: block;\n }\n .ant-picker-calendar-header .ant-picker-calendar-year-select {\n width: 50%;\n }\n .ant-picker-calendar-header .ant-picker-calendar-month-select {\n width: calc(50% - 8px);\n }\n .ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n width: 100%;\n margin-top: 8px;\n margin-left: 0;\n }\n .ant-picker-calendar-header .ant-picker-calendar-mode-switch > label {\n width: 50%;\n text-align: center;\n }\n}\n.ant-picker-calendar-rtl {\n direction: rtl;\n}\n.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel {\n text-align: left;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th {\n padding: 0 0 5px 12px;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content {\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-picker-status-error.ant-picker,\n.ant-picker-status-error.ant-picker:not([disabled]):hover {\n background-color: #fff;\n border-color: #ff4d4f;\n}\n.ant-picker-status-error.ant-picker-focused,\n.ant-picker-status-error.ant-picker:focus {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-picker-status-error.ant-picker .ant-picker-active-bar {\n background: #ff7875;\n}\n.ant-picker-status-warning.ant-picker,\n.ant-picker-status-warning.ant-picker:not([disabled]):hover {\n background-color: #fff;\n border-color: #faad14;\n}\n.ant-picker-status-warning.ant-picker-focused,\n.ant-picker-status-warning.ant-picker:focus {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-picker-status-warning.ant-picker .ant-picker-active-bar {\n background: #ffc53d;\n}\n.ant-picker {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n padding: 4px 11px 4px;\n position: relative;\n display: inline-flex;\n align-items: center;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: border 0.3s, box-shadow 0.3s;\n}\n.ant-picker:hover,\n.ant-picker-focused {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-picker-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-picker.ant-picker-disabled {\n background: #f5f5f5;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-picker.ant-picker-disabled .ant-picker-suffix {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-picker.ant-picker-borderless {\n background-color: transparent !important;\n border-color: transparent !important;\n box-shadow: none !important;\n}\n.ant-picker-input {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n}\n.ant-picker-input > input {\n position: relative;\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n flex: auto;\n min-width: 1px;\n height: auto;\n padding: 0;\n background: transparent;\n border: 0;\n}\n.ant-picker-input > input::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-picker-input > input:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-picker-input > input::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-picker-input > input:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-picker-input > input:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-picker-input > input:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-picker-input > input:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-picker-input > input:focus,\n.ant-picker-input > input-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-picker-input > input-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-picker-input > input-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-picker-input > input[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-picker-input > input[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-picker-input > input-borderless,\n.ant-picker-input > input-borderless:hover,\n.ant-picker-input > input-borderless:focus,\n.ant-picker-input > input-borderless-focused,\n.ant-picker-input > input-borderless-disabled,\n.ant-picker-input > input-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-picker-input > input {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-picker-input > input-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-picker-input > input-sm {\n padding: 0px 7px;\n}\n.ant-picker-input > input:focus {\n box-shadow: none;\n}\n.ant-picker-input > input[disabled] {\n background: transparent;\n}\n.ant-picker-input:hover .ant-picker-clear {\n opacity: 1;\n}\n.ant-picker-input-placeholder > input {\n color: #bfbfbf;\n}\n.ant-picker-large {\n padding: 6.5px 11px 6.5px;\n}\n.ant-picker-large .ant-picker-input > input {\n font-size: 16px;\n}\n.ant-picker-small {\n padding: 0px 7px 0px;\n}\n.ant-picker-suffix {\n display: flex;\n flex: none;\n align-self: center;\n margin-left: 4px;\n color: rgba(0, 0, 0, 0.25);\n line-height: 1;\n pointer-events: none;\n}\n.ant-picker-suffix > * {\n vertical-align: top;\n}\n.ant-picker-suffix > *:not(:last-child) {\n margin-right: 8px;\n}\n.ant-picker-clear {\n position: absolute;\n top: 50%;\n right: 0;\n color: rgba(0, 0, 0, 0.25);\n line-height: 1;\n background: #fff;\n transform: translateY(-50%);\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.3s, color 0.3s;\n}\n.ant-picker-clear > * {\n vertical-align: top;\n}\n.ant-picker-clear:hover {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-picker-separator {\n position: relative;\n display: inline-block;\n width: 1em;\n height: 16px;\n color: rgba(0, 0, 0, 0.25);\n font-size: 16px;\n vertical-align: top;\n cursor: default;\n}\n.ant-picker-focused .ant-picker-separator {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator {\n cursor: not-allowed;\n}\n.ant-picker-range {\n position: relative;\n display: inline-flex;\n}\n.ant-picker-range .ant-picker-clear {\n right: 11px;\n}\n.ant-picker-range:hover .ant-picker-clear {\n opacity: 1;\n}\n.ant-picker-range .ant-picker-active-bar {\n bottom: -1px;\n height: 2px;\n margin-left: 11px;\n background: #1890ff;\n opacity: 0;\n transition: all 0.3s ease-out;\n pointer-events: none;\n}\n.ant-picker-range.ant-picker-focused .ant-picker-active-bar {\n opacity: 1;\n}\n.ant-picker-range-separator {\n align-items: center;\n padding: 0 8px;\n line-height: 1;\n}\n.ant-picker-range.ant-picker-small .ant-picker-clear {\n right: 7px;\n}\n.ant-picker-range.ant-picker-small .ant-picker-active-bar {\n margin-left: 7px;\n}\n.ant-picker-dropdown {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: 1050;\n}\n.ant-picker-dropdown-hidden {\n display: none;\n}\n.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow {\n top: 2.58561808px;\n display: block;\n transform: rotate(-135deg) translateY(1px);\n}\n.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow {\n bottom: 2.58561808px;\n display: block;\n transform: rotate(45deg);\n}\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight {\n -webkit-animation-name: antSlideDownIn;\n animation-name: antSlideDownIn;\n}\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight {\n -webkit-animation-name: antSlideUpIn;\n animation-name: antSlideUpIn;\n}\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight {\n -webkit-animation-name: antSlideDownOut;\n animation-name: antSlideDownOut;\n}\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight {\n -webkit-animation-name: antSlideUpOut;\n animation-name: antSlideUpOut;\n}\n.ant-picker-dropdown-range {\n padding: 7.54247233px 0;\n}\n.ant-picker-dropdown-range-hidden {\n display: none;\n}\n.ant-picker-dropdown .ant-picker-panel > .ant-picker-time-panel {\n padding-top: 4px;\n}\n.ant-picker-ranges {\n margin-bottom: 0;\n padding: 4px 12px;\n overflow: hidden;\n line-height: 34px;\n text-align: left;\n list-style: none;\n}\n.ant-picker-ranges > li {\n display: inline-block;\n}\n.ant-picker-ranges .ant-picker-preset > .ant-tag-blue {\n color: #1890ff;\n background: #e6f7ff;\n border-color: #91d5ff;\n cursor: pointer;\n}\n.ant-picker-ranges .ant-picker-ok {\n float: right;\n margin-left: 8px;\n}\n.ant-picker-range-wrapper {\n display: flex;\n}\n.ant-picker-range-arrow {\n position: absolute;\n z-index: 1;\n display: none;\n width: 11.3137085px;\n height: 11.3137085px;\n margin-left: 16.5px;\n box-shadow: 2px 2px 6px -2px rgba(0, 0, 0, 0.1);\n transition: left 0.3s ease-out;\n border-radius: 0 0 2px;\n pointer-events: none;\n}\n.ant-picker-range-arrow::before {\n position: absolute;\n top: -11.3137085px;\n left: -11.3137085px;\n width: 33.9411255px;\n height: 33.9411255px;\n background: #fff;\n background-repeat: no-repeat;\n background-position: -10px -10px;\n content: '';\n -webkit-clip-path: inset(33% 33%);\n clip-path: inset(33% 33%);\n -webkit-clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-picker-panel-container {\n overflow: hidden;\n vertical-align: top;\n background: #fff;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n transition: margin 0.3s;\n}\n.ant-picker-panel-container .ant-picker-panels {\n display: inline-flex;\n flex-wrap: nowrap;\n direction: ltr;\n}\n.ant-picker-panel-container .ant-picker-panel {\n vertical-align: top;\n background: transparent;\n border-width: 0 0 1px 0;\n border-radius: 0;\n}\n.ant-picker-panel-container .ant-picker-panel .ant-picker-content,\n.ant-picker-panel-container .ant-picker-panel table {\n text-align: center;\n}\n.ant-picker-panel-container .ant-picker-panel-focused {\n border-color: #f0f0f0;\n}\n.ant-picker-panel {\n display: inline-flex;\n flex-direction: column;\n text-align: center;\n background: #fff;\n border: 1px solid #f0f0f0;\n border-radius: 2px;\n outline: none;\n}\n.ant-picker-panel-focused {\n border-color: #1890ff;\n}\n.ant-picker-decade-panel,\n.ant-picker-year-panel,\n.ant-picker-quarter-panel,\n.ant-picker-month-panel,\n.ant-picker-week-panel,\n.ant-picker-date-panel,\n.ant-picker-time-panel {\n display: flex;\n flex-direction: column;\n width: 280px;\n}\n.ant-picker-header {\n display: flex;\n padding: 0 8px;\n color: rgba(0, 0, 0, 0.85);\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-picker-header > * {\n flex: none;\n}\n.ant-picker-header button {\n padding: 0;\n color: rgba(0, 0, 0, 0.25);\n line-height: 40px;\n background: transparent;\n border: 0;\n cursor: pointer;\n transition: color 0.3s;\n}\n.ant-picker-header > button {\n min-width: 1.6em;\n font-size: 14px;\n}\n.ant-picker-header > button:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-picker-header-view {\n flex: auto;\n font-weight: 500;\n line-height: 40px;\n}\n.ant-picker-header-view button {\n color: inherit;\n font-weight: inherit;\n}\n.ant-picker-header-view button:not(:first-child) {\n margin-left: 8px;\n}\n.ant-picker-header-view button:hover {\n color: #1890ff;\n}\n.ant-picker-prev-icon,\n.ant-picker-next-icon,\n.ant-picker-super-prev-icon,\n.ant-picker-super-next-icon {\n position: relative;\n display: inline-block;\n width: 7px;\n height: 7px;\n}\n.ant-picker-prev-icon::before,\n.ant-picker-next-icon::before,\n.ant-picker-super-prev-icon::before,\n.ant-picker-super-next-icon::before {\n position: absolute;\n top: 0;\n left: 0;\n display: inline-block;\n width: 7px;\n height: 7px;\n border: 0 solid currentcolor;\n border-width: 1.5px 0 0 1.5px;\n content: '';\n}\n.ant-picker-super-prev-icon::after,\n.ant-picker-super-next-icon::after {\n position: absolute;\n top: 4px;\n left: 4px;\n display: inline-block;\n width: 7px;\n height: 7px;\n border: 0 solid currentcolor;\n border-width: 1.5px 0 0 1.5px;\n content: '';\n}\n.ant-picker-prev-icon,\n.ant-picker-super-prev-icon {\n transform: rotate(-45deg);\n}\n.ant-picker-next-icon,\n.ant-picker-super-next-icon {\n transform: rotate(135deg);\n}\n.ant-picker-content {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n}\n.ant-picker-content th,\n.ant-picker-content td {\n position: relative;\n min-width: 24px;\n font-weight: 400;\n}\n.ant-picker-content th {\n height: 30px;\n color: rgba(0, 0, 0, 0.85);\n line-height: 30px;\n}\n.ant-picker-cell {\n padding: 3px 0;\n color: rgba(0, 0, 0, 0.25);\n cursor: pointer;\n}\n.ant-picker-cell-in-view {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-picker-cell::before {\n position: absolute;\n top: 50%;\n right: 0;\n left: 0;\n z-index: 1;\n height: 24px;\n transform: translateY(-50%);\n transition: all 0.3s;\n content: '';\n}\n.ant-picker-cell .ant-picker-cell-inner {\n position: relative;\n z-index: 2;\n display: inline-block;\n min-width: 24px;\n height: 24px;\n line-height: 24px;\n border-radius: 2px;\n transition: background 0.3s, border 0.3s;\n}\n.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,\n.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n background: #f5f5f5;\n}\n.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n border: 1px solid #1890ff;\n border-radius: 2px;\n content: '';\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range {\n position: relative;\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range::before {\n background: #e6f7ff;\n}\n.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner,\n.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,\n.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner {\n color: #fff;\n background: #1890ff;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single)::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single)::before {\n background: #e6f7ff;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start::before {\n left: 50%;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-end::before {\n right: 50%;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range)::after {\n position: absolute;\n top: 50%;\n z-index: 0;\n height: 24px;\n border-top: 1px dashed #7ec1ff;\n border-bottom: 1px dashed #7ec1ff;\n transform: translateY(-50%);\n transition: all 0.3s;\n content: '';\n}\n.ant-picker-cell-range-hover-start::after,\n.ant-picker-cell-range-hover-end::after,\n.ant-picker-cell-range-hover::after {\n right: 0;\n left: 2px;\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end::before,\n.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start::before,\n.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end::before {\n background: #cbe6ff;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner {\n border-radius: 2px 0 0 2px;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner {\n border-radius: 0 2px 2px 0;\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after,\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: -1;\n background: #cbe6ff;\n transition: all 0.3s;\n content: '';\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after {\n right: -6px;\n left: 0;\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n right: 0;\n left: -6px;\n}\n.ant-picker-cell-range-hover.ant-picker-cell-range-start::after {\n right: 50%;\n}\n.ant-picker-cell-range-hover.ant-picker-cell-range-end::after {\n left: 50%;\n}\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child::after,\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after,\n.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after {\n left: 6px;\n border-left: 1px dashed #7ec1ff;\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child::after,\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after,\n.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after {\n right: 6px;\n border-right: 1px dashed #7ec1ff;\n border-top-right-radius: 2px;\n border-bottom-right-radius: 2px;\n}\n.ant-picker-cell-disabled {\n color: rgba(0, 0, 0, 0.25);\n pointer-events: none;\n}\n.ant-picker-cell-disabled .ant-picker-cell-inner {\n background: transparent;\n}\n.ant-picker-cell-disabled::before {\n background: rgba(0, 0, 0, 0.04);\n}\n.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner::before {\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-picker-decade-panel .ant-picker-content,\n.ant-picker-year-panel .ant-picker-content,\n.ant-picker-quarter-panel .ant-picker-content,\n.ant-picker-month-panel .ant-picker-content {\n height: 264px;\n}\n.ant-picker-decade-panel .ant-picker-cell-inner,\n.ant-picker-year-panel .ant-picker-cell-inner,\n.ant-picker-quarter-panel .ant-picker-cell-inner,\n.ant-picker-month-panel .ant-picker-cell-inner {\n padding: 0 8px;\n}\n.ant-picker-quarter-panel .ant-picker-content {\n height: 56px;\n}\n.ant-picker-footer {\n width: -webkit-min-content;\n width: -moz-min-content;\n width: min-content;\n min-width: 100%;\n line-height: 38px;\n text-align: center;\n border-bottom: 1px solid transparent;\n}\n.ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #f0f0f0;\n}\n.ant-picker-footer-extra {\n padding: 0 12px;\n line-height: 38px;\n text-align: left;\n}\n.ant-picker-footer-extra:not(:last-child) {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-picker-now {\n text-align: left;\n}\n.ant-picker-today-btn {\n color: #1890ff;\n}\n.ant-picker-today-btn:hover {\n color: #40a9ff;\n}\n.ant-picker-today-btn:active {\n color: #096dd9;\n}\n.ant-picker-today-btn.ant-picker-today-btn-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-picker-decade-panel .ant-picker-cell-inner {\n padding: 0 4px;\n}\n.ant-picker-decade-panel .ant-picker-cell::before {\n display: none;\n}\n.ant-picker-year-panel .ant-picker-body,\n.ant-picker-quarter-panel .ant-picker-body,\n.ant-picker-month-panel .ant-picker-body {\n padding: 0 8px;\n}\n.ant-picker-year-panel .ant-picker-cell-inner,\n.ant-picker-quarter-panel .ant-picker-cell-inner,\n.ant-picker-month-panel .ant-picker-cell-inner {\n width: 60px;\n}\n.ant-picker-year-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-month-panel .ant-picker-cell-range-hover-start::after {\n left: 14px;\n border-left: 1px dashed #7ec1ff;\n border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start::after {\n right: 14px;\n border-right: 1px dashed #7ec1ff;\n border-radius: 0 2px 2px 0;\n}\n.ant-picker-year-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-month-panel .ant-picker-cell-range-hover-end::after {\n right: 14px;\n border-right: 1px dashed #7ec1ff;\n border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end::after {\n left: 14px;\n border-left: 1px dashed #7ec1ff;\n border-radius: 2px 0 0 2px;\n}\n.ant-picker-week-panel .ant-picker-body {\n padding: 8px 12px;\n}\n.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner,\n.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,\n.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner {\n background: transparent !important;\n}\n.ant-picker-week-panel-row td {\n transition: background 0.3s;\n}\n.ant-picker-week-panel-row:hover td {\n background: #f5f5f5;\n}\n.ant-picker-week-panel-row-selected td,\n.ant-picker-week-panel-row-selected:hover td {\n background: #1890ff;\n}\n.ant-picker-week-panel-row-selected td.ant-picker-cell-week,\n.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week {\n color: rgba(255, 255, 255, 0.5);\n}\n.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner::before,\n.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner::before {\n border-color: #fff;\n}\n.ant-picker-week-panel-row-selected td .ant-picker-cell-inner,\n.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner {\n color: #fff;\n}\n.ant-picker-date-panel .ant-picker-body {\n padding: 8px 12px;\n}\n.ant-picker-date-panel .ant-picker-content {\n width: 252px;\n}\n.ant-picker-date-panel .ant-picker-content th {\n width: 36px;\n}\n.ant-picker-datetime-panel {\n display: flex;\n}\n.ant-picker-datetime-panel .ant-picker-time-panel {\n border-left: 1px solid #f0f0f0;\n}\n.ant-picker-datetime-panel .ant-picker-date-panel,\n.ant-picker-datetime-panel .ant-picker-time-panel {\n transition: opacity 0.3s;\n}\n.ant-picker-datetime-panel-active .ant-picker-date-panel,\n.ant-picker-datetime-panel-active .ant-picker-time-panel {\n opacity: 0.3;\n}\n.ant-picker-datetime-panel-active .ant-picker-date-panel-active,\n.ant-picker-datetime-panel-active .ant-picker-time-panel-active {\n opacity: 1;\n}\n.ant-picker-time-panel {\n width: auto;\n min-width: auto;\n}\n.ant-picker-time-panel .ant-picker-content {\n display: flex;\n flex: auto;\n height: 224px;\n}\n.ant-picker-time-panel-column {\n flex: 1 0 auto;\n width: 56px;\n margin: 0;\n padding: 0;\n overflow-y: hidden;\n text-align: left;\n list-style: none;\n transition: background 0.3s;\n}\n.ant-picker-time-panel-column::after {\n display: block;\n height: 196px;\n content: '';\n}\n.ant-picker-datetime-panel .ant-picker-time-panel-column::after {\n height: 198px;\n}\n.ant-picker-time-panel-column:not(:first-child) {\n border-left: 1px solid #f0f0f0;\n}\n.ant-picker-time-panel-column-active {\n background: rgba(230, 247, 255, 0.2);\n}\n.ant-picker-time-panel-column:hover {\n overflow-y: auto;\n}\n.ant-picker-time-panel-column > li {\n margin: 0;\n padding: 0;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n display: block;\n width: 100%;\n height: 28px;\n margin: 0;\n padding: 0 0 0 14px;\n color: rgba(0, 0, 0, 0.85);\n line-height: 28px;\n border-radius: 0;\n cursor: pointer;\n transition: background 0.3s;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n background: #f5f5f5;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n background: #e6f7ff;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner {\n color: rgba(0, 0, 0, 0.25);\n background: transparent;\n cursor: not-allowed;\n}\n/* stylelint-disable selector-type-no-unknown,selector-no-vendor-prefix */\n_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,\n:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,\n_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,\n:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell {\n padding: 21px 0;\n}\n.ant-picker-rtl {\n direction: rtl;\n}\n.ant-picker-rtl .ant-picker-suffix {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-picker-rtl .ant-picker-clear {\n right: auto;\n left: 0;\n}\n.ant-picker-rtl .ant-picker-separator {\n transform: rotate(180deg);\n}\n.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child) {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-picker-rtl.ant-picker-range .ant-picker-clear {\n right: auto;\n left: 11px;\n}\n.ant-picker-rtl.ant-picker-range .ant-picker-active-bar {\n margin-right: 11px;\n margin-left: 0;\n}\n.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar {\n margin-right: 7px;\n}\n.ant-picker-dropdown-rtl .ant-picker-ranges {\n text-align: right;\n}\n.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok {\n float: left;\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-picker-panel-rtl {\n direction: rtl;\n}\n.ant-picker-panel-rtl .ant-picker-prev-icon,\n.ant-picker-panel-rtl .ant-picker-super-prev-icon {\n transform: rotate(135deg);\n}\n.ant-picker-panel-rtl .ant-picker-next-icon,\n.ant-picker-panel-rtl .ant-picker-super-next-icon {\n transform: rotate(-45deg);\n}\n.ant-picker-cell .ant-picker-cell-inner {\n position: relative;\n z-index: 2;\n display: inline-block;\n min-width: 24px;\n height: 24px;\n line-height: 24px;\n border-radius: 2px;\n transition: background 0.3s, border 0.3s;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start::before {\n right: 50%;\n left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end::before {\n right: 0;\n left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end::before {\n right: 50%;\n left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after {\n right: 0;\n left: -6px;\n}\n.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n right: -6px;\n left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start::after {\n right: 0;\n left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end::after {\n right: 50%;\n left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner {\n border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner {\n border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after {\n right: 6px;\n left: 0;\n border-right: 1px dashed #7ec1ff;\n border-left: none;\n border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after {\n right: 0;\n left: 6px;\n border-right: none;\n border-left: 1px dashed #7ec1ff;\n border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child::after {\n right: 6px;\n left: 6px;\n border-right: 1px dashed #7ec1ff;\n border-left: 1px dashed #7ec1ff;\n border-radius: 2px;\n}\n.ant-picker-dropdown-rtl .ant-picker-footer-extra {\n direction: rtl;\n text-align: right;\n}\n.ant-picker-panel-rtl .ant-picker-time-panel {\n direction: ltr;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-tag {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n height: auto;\n margin-right: 8px;\n padding: 0 7px;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n background: #fafafa;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n opacity: 1;\n transition: all 0.3s;\n}\n.ant-tag,\n.ant-tag a,\n.ant-tag a:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-tag > a:first-child:last-child {\n display: inline-block;\n margin: 0 -8px;\n padding: 0 8px;\n}\n.ant-tag-close-icon {\n margin-left: 3px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 10px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-tag-close-icon:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-tag-has-color {\n border-color: transparent;\n}\n.ant-tag-has-color,\n.ant-tag-has-color a,\n.ant-tag-has-color a:hover,\n.ant-tag-has-color .anticon-close,\n.ant-tag-has-color .anticon-close:hover {\n color: #fff;\n}\n.ant-tag-checkable {\n background-color: transparent;\n border-color: transparent;\n cursor: pointer;\n}\n.ant-tag-checkable:not(.ant-tag-checkable-checked):hover {\n color: #1890ff;\n}\n.ant-tag-checkable:active,\n.ant-tag-checkable-checked {\n color: #fff;\n}\n.ant-tag-checkable-checked {\n background-color: #1890ff;\n}\n.ant-tag-checkable:active {\n background-color: #096dd9;\n}\n.ant-tag-hidden {\n display: none;\n}\n.ant-tag-pink {\n color: #c41d7f;\n background: #fff0f6;\n border-color: #ffadd2;\n}\n.ant-tag-pink-inverse {\n color: #fff;\n background: #eb2f96;\n border-color: #eb2f96;\n}\n.ant-tag-magenta {\n color: #c41d7f;\n background: #fff0f6;\n border-color: #ffadd2;\n}\n.ant-tag-magenta-inverse {\n color: #fff;\n background: #eb2f96;\n border-color: #eb2f96;\n}\n.ant-tag-red {\n color: #cf1322;\n background: #fff1f0;\n border-color: #ffa39e;\n}\n.ant-tag-red-inverse {\n color: #fff;\n background: #f5222d;\n border-color: #f5222d;\n}\n.ant-tag-volcano {\n color: #d4380d;\n background: #fff2e8;\n border-color: #ffbb96;\n}\n.ant-tag-volcano-inverse {\n color: #fff;\n background: #fa541c;\n border-color: #fa541c;\n}\n.ant-tag-orange {\n color: #d46b08;\n background: #fff7e6;\n border-color: #ffd591;\n}\n.ant-tag-orange-inverse {\n color: #fff;\n background: #fa8c16;\n border-color: #fa8c16;\n}\n.ant-tag-yellow {\n color: #d4b106;\n background: #feffe6;\n border-color: #fffb8f;\n}\n.ant-tag-yellow-inverse {\n color: #fff;\n background: #fadb14;\n border-color: #fadb14;\n}\n.ant-tag-gold {\n color: #d48806;\n background: #fffbe6;\n border-color: #ffe58f;\n}\n.ant-tag-gold-inverse {\n color: #fff;\n background: #faad14;\n border-color: #faad14;\n}\n.ant-tag-cyan {\n color: #08979c;\n background: #e6fffb;\n border-color: #87e8de;\n}\n.ant-tag-cyan-inverse {\n color: #fff;\n background: #13c2c2;\n border-color: #13c2c2;\n}\n.ant-tag-lime {\n color: #7cb305;\n background: #fcffe6;\n border-color: #eaff8f;\n}\n.ant-tag-lime-inverse {\n color: #fff;\n background: #a0d911;\n border-color: #a0d911;\n}\n.ant-tag-green {\n color: #389e0d;\n background: #f6ffed;\n border-color: #b7eb8f;\n}\n.ant-tag-green-inverse {\n color: #fff;\n background: #52c41a;\n border-color: #52c41a;\n}\n.ant-tag-blue {\n color: #096dd9;\n background: #e6f7ff;\n border-color: #91d5ff;\n}\n.ant-tag-blue-inverse {\n color: #fff;\n background: #1890ff;\n border-color: #1890ff;\n}\n.ant-tag-geekblue {\n color: #1d39c4;\n background: #f0f5ff;\n border-color: #adc6ff;\n}\n.ant-tag-geekblue-inverse {\n color: #fff;\n background: #2f54eb;\n border-color: #2f54eb;\n}\n.ant-tag-purple {\n color: #531dab;\n background: #f9f0ff;\n border-color: #d3adf7;\n}\n.ant-tag-purple-inverse {\n color: #fff;\n background: #722ed1;\n border-color: #722ed1;\n}\n.ant-tag-success {\n color: #52c41a;\n background: #f6ffed;\n border-color: #b7eb8f;\n}\n.ant-tag-processing {\n color: #1890ff;\n background: #e6f7ff;\n border-color: #91d5ff;\n}\n.ant-tag-error {\n color: #ff4d4f;\n background: #fff2f0;\n border-color: #ffccc7;\n}\n.ant-tag-warning {\n color: #faad14;\n background: #fffbe6;\n border-color: #ffe58f;\n}\n.ant-tag > .anticon + span,\n.ant-tag > span + .anticon {\n margin-left: 7px;\n}\n.ant-tag.ant-tag-rtl {\n margin-right: 0;\n margin-left: 8px;\n direction: rtl;\n text-align: right;\n}\n.ant-tag-rtl .ant-tag-close-icon {\n margin-right: 3px;\n margin-left: 0;\n}\n.ant-tag-rtl.ant-tag > .anticon + span,\n.ant-tag-rtl.ant-tag > span + .anticon {\n margin-right: 7px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-radio-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n font-size: 0;\n}\n.ant-radio-group .ant-badge-count {\n z-index: 1;\n}\n.ant-radio-group > .ant-badge:not(:first-child) > .ant-radio-button-wrapper {\n border-left: none;\n}\n.ant-radio-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-flex;\n align-items: baseline;\n margin-right: 8px;\n cursor: pointer;\n}\n.ant-radio-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-radio-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type='radio'] {\n width: 14px;\n height: 14px;\n}\n.ant-radio {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n display: inline-block;\n outline: none;\n cursor: pointer;\n}\n.ant-radio-wrapper:hover .ant-radio,\n.ant-radio:hover .ant-radio-inner,\n.ant-radio-input:focus + .ant-radio-inner {\n border-color: #1890ff;\n}\n.ant-radio-input:focus + .ant-radio-inner {\n box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.12);\n}\n.ant-radio-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 50%;\n visibility: hidden;\n -webkit-animation: antRadioEffect 0.36s ease-in-out;\n animation: antRadioEffect 0.36s ease-in-out;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n content: '';\n}\n.ant-radio:hover::after,\n.ant-radio-wrapper:hover .ant-radio::after {\n visibility: visible;\n}\n.ant-radio-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n background-color: #fff;\n border-color: #d9d9d9;\n border-style: solid;\n border-width: 1px;\n border-radius: 50%;\n transition: all 0.3s;\n}\n.ant-radio-inner::after {\n position: absolute;\n top: 50%;\n left: 50%;\n display: block;\n width: 16px;\n height: 16px;\n margin-top: -8px;\n margin-left: -8px;\n background-color: #1890ff;\n border-top: 0;\n border-left: 0;\n border-radius: 16px;\n transform: scale(0);\n opacity: 0;\n transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n content: ' ';\n}\n.ant-radio-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n cursor: pointer;\n opacity: 0;\n}\n.ant-radio.ant-radio-disabled .ant-radio-inner {\n border-color: #d9d9d9;\n}\n.ant-radio-checked .ant-radio-inner {\n border-color: #1890ff;\n}\n.ant-radio-checked .ant-radio-inner::after {\n transform: scale(0.5);\n opacity: 1;\n transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-radio-disabled {\n cursor: not-allowed;\n}\n.ant-radio-disabled .ant-radio-inner {\n background-color: #f5f5f5;\n cursor: not-allowed;\n}\n.ant-radio-disabled .ant-radio-inner::after {\n background-color: rgba(0, 0, 0, 0.2);\n}\n.ant-radio-disabled .ant-radio-input {\n cursor: not-allowed;\n}\n.ant-radio-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\nspan.ant-radio + * {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-radio-button-wrapper {\n position: relative;\n display: inline-block;\n height: 32px;\n margin: 0;\n padding: 0 15px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 30px;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-top-width: 1.02px;\n border-left-width: 0;\n cursor: pointer;\n transition: color 0.3s, background 0.3s, border-color 0.3s, box-shadow 0.3s;\n}\n.ant-radio-button-wrapper a {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-radio-button-wrapper > .ant-radio-button {\n position: absolute;\n top: 0;\n left: 0;\n z-index: -1;\n width: 100%;\n height: 100%;\n}\n.ant-radio-group-large .ant-radio-button-wrapper {\n height: 40px;\n font-size: 16px;\n line-height: 38px;\n}\n.ant-radio-group-small .ant-radio-button-wrapper {\n height: 24px;\n padding: 0 7px;\n line-height: 22px;\n}\n.ant-radio-button-wrapper:not(:first-child)::before {\n position: absolute;\n top: -1px;\n left: -1px;\n display: block;\n box-sizing: content-box;\n width: 1px;\n height: 100%;\n padding: 1px 0;\n background-color: #d9d9d9;\n transition: background-color 0.3s;\n content: '';\n}\n.ant-radio-button-wrapper:first-child {\n border-left: 1px solid #d9d9d9;\n border-radius: 2px 0 0 2px;\n}\n.ant-radio-button-wrapper:last-child {\n border-radius: 0 2px 2px 0;\n}\n.ant-radio-button-wrapper:first-child:last-child {\n border-radius: 2px;\n}\n.ant-radio-button-wrapper:hover {\n position: relative;\n color: #1890ff;\n}\n.ant-radio-button-wrapper:focus-within {\n box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.12);\n}\n.ant-radio-button-wrapper .ant-radio-inner,\n.ant-radio-button-wrapper input[type='checkbox'],\n.ant-radio-button-wrapper input[type='radio'] {\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {\n z-index: 1;\n color: #1890ff;\n background: #fff;\n border-color: #1890ff;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {\n background-color: #1890ff;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child {\n border-color: #1890ff;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {\n color: #40a9ff;\n border-color: #40a9ff;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before {\n background-color: #40a9ff;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active {\n color: #096dd9;\n border-color: #096dd9;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active::before {\n background-color: #096dd9;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {\n box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.12);\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {\n color: #fff;\n background: #1890ff;\n border-color: #1890ff;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {\n color: #fff;\n background: #40a9ff;\n border-color: #40a9ff;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active {\n color: #fff;\n background: #096dd9;\n border-color: #096dd9;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {\n box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.12);\n}\n.ant-radio-button-wrapper-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-radio-button-wrapper-disabled:first-child,\n.ant-radio-button-wrapper-disabled:hover {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n}\n.ant-radio-button-wrapper-disabled:first-child {\n border-left-color: #d9d9d9;\n}\n.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked {\n color: rgba(0, 0, 0, 0.25);\n background-color: #e6e6e6;\n border-color: #d9d9d9;\n box-shadow: none;\n}\n@-webkit-keyframes antRadioEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antRadioEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-radio-group.ant-radio-group-rtl {\n direction: rtl;\n}\n.ant-radio-wrapper.ant-radio-wrapper-rtl {\n margin-right: 0;\n margin-left: 8px;\n direction: rtl;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl {\n border-right-width: 0;\n border-left-width: 1px;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child)::before {\n right: -1px;\n left: 0;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child {\n border-right: 1px solid #d9d9d9;\n border-radius: 0 2px 2px 0;\n}\n.ant-radio-button-wrapper-checked:not([class*=' ant-radio-button-wrapper-disabled']).ant-radio-button-wrapper:first-child {\n border-right-color: #40a9ff;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child {\n border-radius: 2px 0 0 2px;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child {\n border-right-color: #d9d9d9;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-card {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n background: #fff;\n border-radius: 2px;\n}\n.ant-card-rtl {\n direction: rtl;\n}\n.ant-card-hoverable {\n cursor: pointer;\n transition: box-shadow 0.3s, border-color 0.3s;\n}\n.ant-card-hoverable:hover {\n border-color: transparent;\n box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09);\n}\n.ant-card-bordered {\n border: 1px solid #f0f0f0;\n}\n.ant-card-head {\n min-height: 48px;\n margin-bottom: -1px;\n padding: 0 24px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n background: transparent;\n border-bottom: 1px solid #f0f0f0;\n border-radius: 2px 2px 0 0;\n}\n.ant-card-head::before {\n display: table;\n content: '';\n}\n.ant-card-head::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-card-head-wrapper {\n display: flex;\n align-items: center;\n}\n.ant-card-head-title {\n display: inline-block;\n flex: 1;\n padding: 16px 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-card-head-title > .ant-typography,\n.ant-card-head-title > .ant-typography-edit-content {\n left: 0;\n margin-top: 0;\n margin-bottom: 0;\n}\n.ant-card-head .ant-tabs-top {\n clear: both;\n margin-bottom: -17px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n}\n.ant-card-head .ant-tabs-top-bar {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-card-extra {\n margin-left: auto;\n padding: 16px 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n}\n.ant-card-rtl .ant-card-extra {\n margin-right: auto;\n margin-left: 0;\n}\n.ant-card-body {\n padding: 24px;\n}\n.ant-card-body::before {\n display: table;\n content: '';\n}\n.ant-card-body::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-card-contain-grid .ant-card-body {\n display: flex;\n flex-wrap: wrap;\n}\n.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body {\n margin: -1px 0 0 -1px;\n padding: 0;\n}\n.ant-card-grid {\n width: 33.33%;\n padding: 24px;\n border: 0;\n border-radius: 0;\n box-shadow: 1px 0 0 0 #f0f0f0, 0 1px 0 0 #f0f0f0, 1px 1px 0 0 #f0f0f0, 1px 0 0 0 #f0f0f0 inset, 0 1px 0 0 #f0f0f0 inset;\n transition: all 0.3s;\n}\n.ant-card-grid-hoverable:hover {\n position: relative;\n z-index: 1;\n box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09);\n}\n.ant-card-contain-tabs > .ant-card-head .ant-card-head-title {\n min-height: 32px;\n padding-bottom: 0;\n}\n.ant-card-contain-tabs > .ant-card-head .ant-card-extra {\n padding-bottom: 0;\n}\n.ant-card-bordered .ant-card-cover {\n margin-top: -1px;\n margin-right: -1px;\n margin-left: -1px;\n}\n.ant-card-cover > * {\n display: block;\n width: 100%;\n}\n.ant-card-cover img {\n border-radius: 2px 2px 0 0;\n}\n.ant-card-actions {\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n background: #fff;\n border-top: 1px solid #f0f0f0;\n}\n.ant-card-actions::before {\n display: table;\n content: '';\n}\n.ant-card-actions::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-card-actions > li {\n margin: 12px 0;\n color: rgba(0, 0, 0, 0.45);\n text-align: center;\n}\n.ant-card-actions > li > span {\n position: relative;\n display: block;\n min-width: 32px;\n font-size: 14px;\n line-height: 1.5715;\n cursor: pointer;\n}\n.ant-card-actions > li > span:hover {\n color: #1890ff;\n transition: color 0.3s;\n}\n.ant-card-actions > li > span a:not(.ant-btn),\n.ant-card-actions > li > span > .anticon {\n display: inline-block;\n width: 100%;\n color: rgba(0, 0, 0, 0.45);\n line-height: 22px;\n transition: color 0.3s;\n}\n.ant-card-actions > li > span a:not(.ant-btn):hover,\n.ant-card-actions > li > span > .anticon:hover {\n color: #1890ff;\n}\n.ant-card-actions > li > span > .anticon {\n font-size: 16px;\n line-height: 22px;\n}\n.ant-card-actions > li:not(:last-child) {\n border-right: 1px solid #f0f0f0;\n}\n.ant-card-rtl .ant-card-actions > li:not(:last-child) {\n border-right: none;\n border-left: 1px solid #f0f0f0;\n}\n.ant-card-type-inner .ant-card-head {\n padding: 0 24px;\n background: #fafafa;\n}\n.ant-card-type-inner .ant-card-head-title {\n padding: 12px 0;\n font-size: 14px;\n}\n.ant-card-type-inner .ant-card-body {\n padding: 16px 24px;\n}\n.ant-card-type-inner .ant-card-extra {\n padding: 13.5px 0;\n}\n.ant-card-meta {\n display: flex;\n margin: -4px 0;\n}\n.ant-card-meta::before {\n display: table;\n content: '';\n}\n.ant-card-meta::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-card-meta-avatar {\n padding-right: 16px;\n}\n.ant-card-rtl .ant-card-meta-avatar {\n padding-right: 0;\n padding-left: 16px;\n}\n.ant-card-meta-detail {\n overflow: hidden;\n}\n.ant-card-meta-detail > div:not(:last-child) {\n margin-bottom: 8px;\n}\n.ant-card-meta-title {\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-card-meta-description {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-card-loading {\n overflow: hidden;\n}\n.ant-card-loading .ant-card-body {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-card-small > .ant-card-head {\n min-height: 36px;\n padding: 0 12px;\n font-size: 14px;\n}\n.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-head-title {\n padding: 8px 0;\n}\n.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-extra {\n padding: 8px 0;\n font-size: 14px;\n}\n.ant-card-small > .ant-card-body {\n padding: 12px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-skeleton {\n display: table;\n width: 100%;\n}\n.ant-skeleton-header {\n display: table-cell;\n padding-right: 16px;\n vertical-align: top;\n}\n.ant-skeleton-header .ant-skeleton-avatar {\n display: inline-block;\n vertical-align: top;\n background: rgba(190, 190, 190, 0.2);\n width: 32px;\n height: 32px;\n line-height: 32px;\n}\n.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-header .ant-skeleton-avatar-lg {\n width: 40px;\n height: 40px;\n line-height: 40px;\n}\n.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-header .ant-skeleton-avatar-sm {\n width: 24px;\n height: 24px;\n line-height: 24px;\n}\n.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-content {\n display: table-cell;\n width: 100%;\n vertical-align: top;\n}\n.ant-skeleton-content .ant-skeleton-title {\n width: 100%;\n height: 16px;\n background: rgba(190, 190, 190, 0.2);\n border-radius: 2px;\n}\n.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {\n margin-top: 24px;\n}\n.ant-skeleton-content .ant-skeleton-paragraph {\n padding: 0;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li {\n width: 100%;\n height: 16px;\n list-style: none;\n background: rgba(190, 190, 190, 0.2);\n border-radius: 2px;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) {\n width: 61%;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li + li {\n margin-top: 16px;\n}\n.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title {\n margin-top: 12px;\n}\n.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {\n margin-top: 28px;\n}\n.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title,\n.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph > li {\n border-radius: 100px;\n}\n.ant-skeleton-active .ant-skeleton-title,\n.ant-skeleton-active .ant-skeleton-paragraph > li,\n.ant-skeleton-active .ant-skeleton-avatar,\n.ant-skeleton-active .ant-skeleton-button,\n.ant-skeleton-active .ant-skeleton-input,\n.ant-skeleton-active .ant-skeleton-image {\n position: relative;\n /* stylelint-disable-next-line property-no-vendor-prefix,value-no-vendor-prefix */\n z-index: 0;\n overflow: hidden;\n background: transparent;\n}\n.ant-skeleton-active .ant-skeleton-title::after,\n.ant-skeleton-active .ant-skeleton-paragraph > li::after,\n.ant-skeleton-active .ant-skeleton-avatar::after,\n.ant-skeleton-active .ant-skeleton-button::after,\n.ant-skeleton-active .ant-skeleton-input::after,\n.ant-skeleton-active .ant-skeleton-image::after {\n position: absolute;\n top: 0;\n right: -150%;\n bottom: 0;\n left: -150%;\n background: linear-gradient(90deg, rgba(190, 190, 190, 0.2) 25%, rgba(129, 129, 129, 0.24) 37%, rgba(190, 190, 190, 0.2) 63%);\n -webkit-animation: ant-skeleton-loading 1.4s ease infinite;\n animation: ant-skeleton-loading 1.4s ease infinite;\n content: '';\n}\n.ant-skeleton.ant-skeleton-block {\n width: 100%;\n}\n.ant-skeleton.ant-skeleton-block .ant-skeleton-button {\n width: 100%;\n}\n.ant-skeleton.ant-skeleton-block .ant-skeleton-input {\n width: 100%;\n}\n.ant-skeleton-element {\n display: inline-block;\n width: auto;\n}\n.ant-skeleton-element .ant-skeleton-button {\n display: inline-block;\n vertical-align: top;\n background: rgba(190, 190, 190, 0.2);\n border-radius: 2px;\n width: 64px;\n min-width: 64px;\n height: 32px;\n line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square {\n width: 32px;\n min-width: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle {\n width: 32px;\n min-width: 32px;\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round {\n border-radius: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg {\n width: 80px;\n min-width: 80px;\n height: 40px;\n line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square {\n width: 40px;\n min-width: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle {\n width: 40px;\n min-width: 40px;\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round {\n border-radius: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm {\n width: 48px;\n min-width: 48px;\n height: 24px;\n line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square {\n width: 24px;\n min-width: 24px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle {\n width: 24px;\n min-width: 24px;\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round {\n border-radius: 24px;\n}\n.ant-skeleton-element .ant-skeleton-avatar {\n display: inline-block;\n vertical-align: top;\n background: rgba(190, 190, 190, 0.2);\n width: 32px;\n height: 32px;\n line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-avatar-lg {\n width: 40px;\n height: 40px;\n line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-avatar-sm {\n width: 24px;\n height: 24px;\n line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle {\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-input {\n display: inline-block;\n vertical-align: top;\n background: rgba(190, 190, 190, 0.2);\n width: 160px;\n min-width: 160px;\n height: 32px;\n line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-input-lg {\n width: 200px;\n min-width: 200px;\n height: 40px;\n line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-input-sm {\n width: 120px;\n min-width: 120px;\n height: 24px;\n line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-image {\n display: flex;\n align-items: center;\n justify-content: center;\n vertical-align: top;\n background: rgba(190, 190, 190, 0.2);\n width: 96px;\n height: 96px;\n line-height: 96px;\n}\n.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle {\n border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-image-path {\n fill: #bfbfbf;\n}\n.ant-skeleton-element .ant-skeleton-image-svg {\n width: 48px;\n height: 48px;\n line-height: 48px;\n max-width: 192px;\n max-height: 192px;\n}\n.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle {\n border-radius: 50%;\n}\n@-webkit-keyframes ant-skeleton-loading {\n 0% {\n transform: translateX(-37.5%);\n }\n 100% {\n transform: translateX(37.5%);\n }\n}\n@keyframes ant-skeleton-loading {\n 0% {\n transform: translateX(-37.5%);\n }\n 100% {\n transform: translateX(37.5%);\n }\n}\n.ant-skeleton-rtl {\n direction: rtl;\n}\n.ant-skeleton-rtl .ant-skeleton-header {\n padding-right: 0;\n padding-left: 16px;\n}\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li {\n -webkit-animation-name: ant-skeleton-loading-rtl;\n animation-name: ant-skeleton-loading-rtl;\n}\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar {\n -webkit-animation-name: ant-skeleton-loading-rtl;\n animation-name: ant-skeleton-loading-rtl;\n}\n@-webkit-keyframes ant-skeleton-loading-rtl {\n 0% {\n background-position: 0% 50%;\n }\n 100% {\n background-position: 100% 50%;\n }\n}\n@keyframes ant-skeleton-loading-rtl {\n 0% {\n background-position: 0% 50%;\n }\n 100% {\n background-position: 100% 50%;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab {\n padding: 8px 0;\n font-size: 14px;\n}\n.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab {\n padding: 16px 0;\n font-size: 16px;\n}\n.ant-tabs-card.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab {\n padding: 6px 16px;\n}\n.ant-tabs-card.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab {\n padding: 7px 16px 6px;\n}\n.ant-tabs-rtl {\n direction: rtl;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab {\n margin: 0 0 0 32px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type {\n margin-left: 0;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon {\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove {\n margin-right: 8px;\n margin-left: -4px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon {\n margin: 0;\n}\n.ant-tabs-rtl.ant-tabs-left > .ant-tabs-nav {\n order: 1;\n}\n.ant-tabs-rtl.ant-tabs-left > .ant-tabs-content-holder {\n order: 0;\n}\n.ant-tabs-rtl.ant-tabs-right > .ant-tabs-nav {\n order: 0;\n}\n.ant-tabs-rtl.ant-tabs-right > .ant-tabs-content-holder {\n order: 1;\n}\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n margin-right: 2px;\n margin-left: 0;\n}\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-add {\n margin-right: 2px;\n margin-left: 0;\n}\n.ant-tabs-dropdown-rtl {\n direction: rtl;\n}\n.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item {\n text-align: right;\n}\n.ant-tabs-top,\n.ant-tabs-bottom {\n flex-direction: column;\n}\n.ant-tabs-top > .ant-tabs-nav,\n.ant-tabs-bottom > .ant-tabs-nav,\n.ant-tabs-top > div > .ant-tabs-nav,\n.ant-tabs-bottom > div > .ant-tabs-nav {\n margin: 0 0 16px 0;\n}\n.ant-tabs-top > .ant-tabs-nav::before,\n.ant-tabs-bottom > .ant-tabs-nav::before,\n.ant-tabs-top > div > .ant-tabs-nav::before,\n.ant-tabs-bottom > div > .ant-tabs-nav::before {\n position: absolute;\n right: 0;\n left: 0;\n border-bottom: 1px solid #f0f0f0;\n content: '';\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar {\n height: 2px;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar-animated {\n transition: width 0.3s, left 0.3s, right 0.3s;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n top: 0;\n bottom: 0;\n width: 30px;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before {\n left: 0;\n box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n right: 0;\n box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before {\n opacity: 1;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after {\n opacity: 1;\n}\n.ant-tabs-top > .ant-tabs-nav::before,\n.ant-tabs-top > div > .ant-tabs-nav::before {\n bottom: 0;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar {\n bottom: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav,\n.ant-tabs-bottom > div > .ant-tabs-nav {\n order: 1;\n margin-top: 16px;\n margin-bottom: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav::before,\n.ant-tabs-bottom > div > .ant-tabs-nav::before {\n top: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar {\n top: 0;\n}\n.ant-tabs-bottom > .ant-tabs-content-holder,\n.ant-tabs-bottom > div > .ant-tabs-content-holder {\n order: 0;\n}\n.ant-tabs-left > .ant-tabs-nav,\n.ant-tabs-right > .ant-tabs-nav,\n.ant-tabs-left > div > .ant-tabs-nav,\n.ant-tabs-right > div > .ant-tabs-nav {\n flex-direction: column;\n min-width: 50px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab {\n padding: 8px 24px;\n text-align: center;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n margin: 16px 0 0 0;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap {\n flex-direction: column;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n right: 0;\n left: 0;\n height: 30px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before {\n top: 0;\n box-shadow: inset 0 10px 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n bottom: 0;\n box-shadow: inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before {\n opacity: 1;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after {\n opacity: 1;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar {\n width: 2px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar-animated {\n transition: height 0.3s, top 0.3s;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-operations {\n flex: 1 0 auto;\n flex-direction: column;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar {\n right: 0;\n}\n.ant-tabs-left > .ant-tabs-content-holder,\n.ant-tabs-left > div > .ant-tabs-content-holder {\n margin-left: -1px;\n border-left: 1px solid #f0f0f0;\n}\n.ant-tabs-left > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane,\n.ant-tabs-left > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane {\n padding-left: 24px;\n}\n.ant-tabs-right > .ant-tabs-nav,\n.ant-tabs-right > div > .ant-tabs-nav {\n order: 1;\n}\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar {\n left: 0;\n}\n.ant-tabs-right > .ant-tabs-content-holder,\n.ant-tabs-right > div > .ant-tabs-content-holder {\n order: 0;\n margin-right: -1px;\n border-right: 1px solid #f0f0f0;\n}\n.ant-tabs-right > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane,\n.ant-tabs-right > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane {\n padding-right: 24px;\n}\n.ant-tabs-dropdown {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: 1050;\n display: block;\n}\n.ant-tabs-dropdown-hidden {\n display: none;\n}\n.ant-tabs-dropdown-menu {\n max-height: 200px;\n margin: 0;\n padding: 4px 0;\n overflow-x: hidden;\n overflow-y: auto;\n text-align: left;\n list-style-type: none;\n background-color: #fff;\n background-clip: padding-box;\n border-radius: 2px;\n outline: none;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-tabs-dropdown-menu-item {\n display: flex;\n align-items: center;\n min-width: 120px;\n margin: 0;\n padding: 5px 12px;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n line-height: 22px;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-tabs-dropdown-menu-item > span {\n flex: 1;\n white-space: nowrap;\n}\n.ant-tabs-dropdown-menu-item-remove {\n flex: none;\n margin-left: 12px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 12px;\n background: transparent;\n border: 0;\n cursor: pointer;\n}\n.ant-tabs-dropdown-menu-item-remove:hover {\n color: #40a9ff;\n}\n.ant-tabs-dropdown-menu-item:hover {\n background: #f5f5f5;\n}\n.ant-tabs-dropdown-menu-item-disabled,\n.ant-tabs-dropdown-menu-item-disabled:hover {\n color: rgba(0, 0, 0, 0.25);\n background: transparent;\n cursor: not-allowed;\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab {\n margin: 0;\n padding: 8px 16px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab-active {\n color: #1890ff;\n background: #fff;\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-ink-bar {\n visibility: hidden;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n margin-left: 2px;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab {\n border-radius: 2px 2px 0 0;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab-active {\n border-bottom-color: #fff;\n}\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab {\n border-radius: 0 0 2px 2px;\n}\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab-active {\n border-top-color: #fff;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n margin-top: 2px;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab {\n border-radius: 2px 0 0 2px;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab-active {\n border-right-color: #fff;\n}\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab {\n border-radius: 0 2px 2px 0;\n}\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab-active {\n border-left-color: #fff;\n}\n.ant-tabs {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: flex;\n}\n.ant-tabs > .ant-tabs-nav,\n.ant-tabs > div > .ant-tabs-nav {\n position: relative;\n display: flex;\n flex: none;\n align-items: center;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap {\n position: relative;\n display: inline-block;\n display: flex;\n flex: auto;\n align-self: stretch;\n overflow: hidden;\n white-space: nowrap;\n transform: translate(0);\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n position: absolute;\n z-index: 1;\n opacity: 0;\n transition: opacity 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-list {\n position: relative;\n display: flex;\n transition: transform 0.3s;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations {\n display: flex;\n align-self: stretch;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations-hidden,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations-hidden {\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more {\n position: relative;\n padding: 8px 16px;\n background: transparent;\n border: 0;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more::after,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more::after {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 5px;\n transform: translateY(100%);\n content: '';\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add {\n min-width: 40px;\n margin-left: 2px;\n padding: 0 8px;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 2px 2px 0 0;\n outline: none;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:hover,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:hover {\n color: #40a9ff;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:active,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:active,\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:focus,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:focus {\n color: #096dd9;\n}\n.ant-tabs-extra-content {\n flex: none;\n}\n.ant-tabs-centered > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']),\n.ant-tabs-centered > div > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']) {\n justify-content: center;\n}\n.ant-tabs-ink-bar {\n position: absolute;\n background: #1890ff;\n pointer-events: none;\n}\n.ant-tabs-tab {\n position: relative;\n display: inline-flex;\n align-items: center;\n padding: 12px 0;\n font-size: 14px;\n background: transparent;\n border: 0;\n outline: none;\n cursor: pointer;\n}\n.ant-tabs-tab-btn:focus,\n.ant-tabs-tab-remove:focus,\n.ant-tabs-tab-btn:active,\n.ant-tabs-tab-remove:active {\n color: #096dd9;\n}\n.ant-tabs-tab-btn {\n outline: none;\n transition: all 0.3s;\n}\n.ant-tabs-tab-remove {\n flex: none;\n margin-right: -4px;\n margin-left: 8px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 12px;\n background: transparent;\n border: none;\n outline: none;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-tabs-tab-remove:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-tabs-tab:hover {\n color: #40a9ff;\n}\n.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {\n color: #1890ff;\n text-shadow: 0 0 0.25px currentcolor;\n}\n.ant-tabs-tab.ant-tabs-tab-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-tabs-tab .ant-tabs-tab-remove .anticon {\n margin: 0;\n}\n.ant-tabs-tab .anticon {\n margin-right: 12px;\n}\n.ant-tabs-tab + .ant-tabs-tab {\n margin: 0 0 0 32px;\n}\n.ant-tabs-content {\n display: flex;\n width: 100%;\n}\n.ant-tabs-content-holder {\n flex: auto;\n min-width: 0;\n min-height: 0;\n}\n.ant-tabs-content-animated {\n transition: margin 0.3s;\n}\n.ant-tabs-tabpane {\n flex: none;\n width: 100%;\n outline: none;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-carousel {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n}\n.ant-carousel .slick-slider {\n position: relative;\n display: block;\n box-sizing: border-box;\n touch-action: pan-y;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n}\n.ant-carousel .slick-list {\n position: relative;\n display: block;\n margin: 0;\n padding: 0;\n overflow: hidden;\n}\n.ant-carousel .slick-list:focus {\n outline: none;\n}\n.ant-carousel .slick-list.dragging {\n cursor: pointer;\n}\n.ant-carousel .slick-list .slick-slide {\n pointer-events: none;\n}\n.ant-carousel .slick-list .slick-slide input.ant-radio-input,\n.ant-carousel .slick-list .slick-slide input.ant-checkbox-input {\n visibility: hidden;\n}\n.ant-carousel .slick-list .slick-slide.slick-active {\n pointer-events: auto;\n}\n.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input,\n.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input {\n visibility: visible;\n}\n.ant-carousel .slick-list .slick-slide > div > div {\n vertical-align: bottom;\n}\n.ant-carousel .slick-slider .slick-track,\n.ant-carousel .slick-slider .slick-list {\n transform: translate3d(0, 0, 0);\n touch-action: pan-y;\n}\n.ant-carousel .slick-track {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n}\n.ant-carousel .slick-track::before,\n.ant-carousel .slick-track::after {\n display: table;\n content: '';\n}\n.ant-carousel .slick-track::after {\n clear: both;\n}\n.slick-loading .ant-carousel .slick-track {\n visibility: hidden;\n}\n.ant-carousel .slick-slide {\n display: none;\n float: left;\n height: 100%;\n min-height: 1px;\n}\n.ant-carousel .slick-slide img {\n display: block;\n}\n.ant-carousel .slick-slide.slick-loading img {\n display: none;\n}\n.ant-carousel .slick-slide.dragging img {\n pointer-events: none;\n}\n.ant-carousel .slick-initialized .slick-slide {\n display: block;\n}\n.ant-carousel .slick-loading .slick-slide {\n visibility: hidden;\n}\n.ant-carousel .slick-vertical .slick-slide {\n display: block;\n height: auto;\n}\n.ant-carousel .slick-arrow.slick-hidden {\n display: none;\n}\n.ant-carousel .slick-prev,\n.ant-carousel .slick-next {\n position: absolute;\n top: 50%;\n display: block;\n width: 20px;\n height: 20px;\n margin-top: -10px;\n padding: 0;\n color: transparent;\n font-size: 0;\n line-height: 0;\n background: transparent;\n border: 0;\n outline: none;\n cursor: pointer;\n}\n.ant-carousel .slick-prev:hover,\n.ant-carousel .slick-next:hover,\n.ant-carousel .slick-prev:focus,\n.ant-carousel .slick-next:focus {\n color: transparent;\n background: transparent;\n outline: none;\n}\n.ant-carousel .slick-prev:hover::before,\n.ant-carousel .slick-next:hover::before,\n.ant-carousel .slick-prev:focus::before,\n.ant-carousel .slick-next:focus::before {\n opacity: 1;\n}\n.ant-carousel .slick-prev.slick-disabled::before,\n.ant-carousel .slick-next.slick-disabled::before {\n opacity: 0.25;\n}\n.ant-carousel .slick-prev {\n left: -25px;\n}\n.ant-carousel .slick-prev::before {\n content: '←';\n}\n.ant-carousel .slick-next {\n right: -25px;\n}\n.ant-carousel .slick-next::before {\n content: '→';\n}\n.ant-carousel .slick-dots {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex !important;\n justify-content: center;\n margin-right: 15%;\n margin-left: 15%;\n padding-left: 0;\n list-style: none;\n}\n.ant-carousel .slick-dots-bottom {\n bottom: 12px;\n}\n.ant-carousel .slick-dots-top {\n top: 12px;\n bottom: auto;\n}\n.ant-carousel .slick-dots li {\n position: relative;\n display: inline-block;\n flex: 0 1 auto;\n box-sizing: content-box;\n width: 16px;\n height: 3px;\n margin: 0 2px;\n margin-right: 3px;\n margin-left: 3px;\n padding: 0;\n text-align: center;\n text-indent: -999px;\n vertical-align: top;\n transition: all 0.5s;\n}\n.ant-carousel .slick-dots li button {\n display: block;\n width: 100%;\n height: 3px;\n padding: 0;\n color: transparent;\n font-size: 0;\n background: #fff;\n border: 0;\n border-radius: 1px;\n outline: none;\n cursor: pointer;\n opacity: 0.3;\n transition: all 0.5s;\n}\n.ant-carousel .slick-dots li button:hover,\n.ant-carousel .slick-dots li button:focus {\n opacity: 0.75;\n}\n.ant-carousel .slick-dots li.slick-active {\n width: 24px;\n}\n.ant-carousel .slick-dots li.slick-active button {\n background: #fff;\n opacity: 1;\n}\n.ant-carousel .slick-dots li.slick-active:hover,\n.ant-carousel .slick-dots li.slick-active:focus {\n opacity: 1;\n}\n.ant-carousel-vertical .slick-dots {\n top: 50%;\n bottom: auto;\n flex-direction: column;\n width: 3px;\n height: auto;\n margin: 0;\n transform: translateY(-50%);\n}\n.ant-carousel-vertical .slick-dots-left {\n right: auto;\n left: 12px;\n}\n.ant-carousel-vertical .slick-dots-right {\n right: 12px;\n left: auto;\n}\n.ant-carousel-vertical .slick-dots li {\n width: 3px;\n height: 16px;\n margin: 4px 2px;\n vertical-align: baseline;\n}\n.ant-carousel-vertical .slick-dots li button {\n width: 3px;\n height: 16px;\n}\n.ant-carousel-vertical .slick-dots li.slick-active {\n width: 3px;\n height: 24px;\n}\n.ant-carousel-vertical .slick-dots li.slick-active button {\n width: 3px;\n height: 24px;\n}\n.ant-carousel-rtl {\n direction: rtl;\n}\n.ant-carousel-rtl .ant-carousel .slick-track {\n right: 0;\n left: auto;\n}\n.ant-carousel-rtl .ant-carousel .slick-prev {\n right: -25px;\n left: auto;\n}\n.ant-carousel-rtl .ant-carousel .slick-prev::before {\n content: '→';\n}\n.ant-carousel-rtl .ant-carousel .slick-next {\n right: auto;\n left: -25px;\n}\n.ant-carousel-rtl .ant-carousel .slick-next::before {\n content: '←';\n}\n.ant-carousel-rtl.ant-carousel .slick-dots {\n flex-direction: row-reverse;\n}\n.ant-carousel-rtl.ant-carousel-vertical .slick-dots {\n flex-direction: column;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@-webkit-keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-cascader-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,\n.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner,\n.ant-cascader-checkbox-input:focus + .ant-cascader-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-cascader-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n -webkit-animation: antCheckboxEffect 0.36s ease-in-out;\n animation: antCheckboxEffect 0.36s ease-in-out;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-cascader-checkbox:hover::after,\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox::after {\n visibility: visible;\n}\n.ant-cascader-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-cascader-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-cascader-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-cascader-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-cascader-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-cascader-checkbox-disabled:hover::after,\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-cascader-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-cascader-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-cascader-checkbox-wrapper + .ant-cascader-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-cascader-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-cascader-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-cascader-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-cascader-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-cascader-checkbox-group-item + .ant-cascader-checkbox-group-item {\n margin-left: 0;\n}\n.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-cascader {\n width: 184px;\n}\n.ant-cascader-checkbox {\n top: 0;\n margin-right: 8px;\n}\n.ant-cascader-menus {\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n}\n.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu {\n width: 100%;\n height: auto;\n}\n.ant-cascader-menu {\n flex-grow: 1;\n min-width: 111px;\n height: 180px;\n margin: 0;\n margin: -4px 0;\n padding: 4px 0;\n overflow: auto;\n vertical-align: top;\n list-style: none;\n border-right: 1px solid #f0f0f0;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n.ant-cascader-menu-item {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n padding: 5px 12px;\n overflow: hidden;\n line-height: 22px;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-cascader-menu-item:hover {\n background: #f5f5f5;\n}\n.ant-cascader-menu-item-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-cascader-menu-item-disabled:hover {\n background: transparent;\n}\n.ant-cascader-menu-empty .ant-cascader-menu-item {\n color: rgba(0, 0, 0, 0.25);\n cursor: default;\n pointer-events: none;\n}\n.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),\n.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover {\n font-weight: 600;\n background-color: #e6f7ff;\n}\n.ant-cascader-menu-item-content {\n flex: auto;\n}\n.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,\n.ant-cascader-menu-item-loading-icon {\n margin-left: 4px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 10px;\n}\n.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,\n.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-cascader-menu-item-keyword {\n color: #ff4d4f;\n}\n.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,\n.ant-cascader-rtl .ant-cascader-menu-item-loading-icon {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-cascader-rtl .ant-cascader-checkbox {\n top: 0;\n margin-right: 0;\n margin-left: 8px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@-webkit-keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-checkbox-wrapper:hover .ant-checkbox-inner,\n.ant-checkbox:hover .ant-checkbox-inner,\n.ant-checkbox-input:focus + .ant-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n -webkit-animation: antCheckboxEffect 0.36s ease-in-out;\n animation: antCheckboxEffect 0.36s ease-in-out;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-checkbox:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox::after {\n visibility: visible;\n}\n.ant-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-checkbox-checked .ant-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-checkbox-checked .ant-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-checkbox-disabled .ant-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-checkbox-disabled .ant-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-checkbox-disabled .ant-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-checkbox-disabled:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-checkbox-wrapper + .ant-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-checkbox-group-item + .ant-checkbox-group-item {\n margin-left: 0;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-checkbox-rtl {\n direction: rtl;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child {\n margin-left: 0 !important;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item + .ant-checkbox-group-item {\n margin-left: 8px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-row {\n display: flex;\n flex-flow: row wrap;\n}\n.ant-row::before,\n.ant-row::after {\n display: flex;\n}\n.ant-row-no-wrap {\n flex-wrap: nowrap;\n}\n.ant-row-start {\n justify-content: flex-start;\n}\n.ant-row-center {\n justify-content: center;\n}\n.ant-row-end {\n justify-content: flex-end;\n}\n.ant-row-space-between {\n justify-content: space-between;\n}\n.ant-row-space-around {\n justify-content: space-around;\n}\n.ant-row-space-evenly {\n justify-content: space-evenly;\n}\n.ant-row-top {\n align-items: flex-start;\n}\n.ant-row-middle {\n align-items: center;\n}\n.ant-row-bottom {\n align-items: flex-end;\n}\n.ant-col {\n position: relative;\n max-width: 100%;\n min-height: 1px;\n}\n.ant-col-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n}\n.ant-col-push-24 {\n left: 100%;\n}\n.ant-col-pull-24 {\n right: 100%;\n}\n.ant-col-offset-24 {\n margin-left: 100%;\n}\n.ant-col-order-24 {\n order: 24;\n}\n.ant-col-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n}\n.ant-col-push-23 {\n left: 95.83333333%;\n}\n.ant-col-pull-23 {\n right: 95.83333333%;\n}\n.ant-col-offset-23 {\n margin-left: 95.83333333%;\n}\n.ant-col-order-23 {\n order: 23;\n}\n.ant-col-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n}\n.ant-col-push-22 {\n left: 91.66666667%;\n}\n.ant-col-pull-22 {\n right: 91.66666667%;\n}\n.ant-col-offset-22 {\n margin-left: 91.66666667%;\n}\n.ant-col-order-22 {\n order: 22;\n}\n.ant-col-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n}\n.ant-col-push-21 {\n left: 87.5%;\n}\n.ant-col-pull-21 {\n right: 87.5%;\n}\n.ant-col-offset-21 {\n margin-left: 87.5%;\n}\n.ant-col-order-21 {\n order: 21;\n}\n.ant-col-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n}\n.ant-col-push-20 {\n left: 83.33333333%;\n}\n.ant-col-pull-20 {\n right: 83.33333333%;\n}\n.ant-col-offset-20 {\n margin-left: 83.33333333%;\n}\n.ant-col-order-20 {\n order: 20;\n}\n.ant-col-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n}\n.ant-col-push-19 {\n left: 79.16666667%;\n}\n.ant-col-pull-19 {\n right: 79.16666667%;\n}\n.ant-col-offset-19 {\n margin-left: 79.16666667%;\n}\n.ant-col-order-19 {\n order: 19;\n}\n.ant-col-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n}\n.ant-col-push-18 {\n left: 75%;\n}\n.ant-col-pull-18 {\n right: 75%;\n}\n.ant-col-offset-18 {\n margin-left: 75%;\n}\n.ant-col-order-18 {\n order: 18;\n}\n.ant-col-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n}\n.ant-col-push-17 {\n left: 70.83333333%;\n}\n.ant-col-pull-17 {\n right: 70.83333333%;\n}\n.ant-col-offset-17 {\n margin-left: 70.83333333%;\n}\n.ant-col-order-17 {\n order: 17;\n}\n.ant-col-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n}\n.ant-col-push-16 {\n left: 66.66666667%;\n}\n.ant-col-pull-16 {\n right: 66.66666667%;\n}\n.ant-col-offset-16 {\n margin-left: 66.66666667%;\n}\n.ant-col-order-16 {\n order: 16;\n}\n.ant-col-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n}\n.ant-col-push-15 {\n left: 62.5%;\n}\n.ant-col-pull-15 {\n right: 62.5%;\n}\n.ant-col-offset-15 {\n margin-left: 62.5%;\n}\n.ant-col-order-15 {\n order: 15;\n}\n.ant-col-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n}\n.ant-col-push-14 {\n left: 58.33333333%;\n}\n.ant-col-pull-14 {\n right: 58.33333333%;\n}\n.ant-col-offset-14 {\n margin-left: 58.33333333%;\n}\n.ant-col-order-14 {\n order: 14;\n}\n.ant-col-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n}\n.ant-col-push-13 {\n left: 54.16666667%;\n}\n.ant-col-pull-13 {\n right: 54.16666667%;\n}\n.ant-col-offset-13 {\n margin-left: 54.16666667%;\n}\n.ant-col-order-13 {\n order: 13;\n}\n.ant-col-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n}\n.ant-col-push-12 {\n left: 50%;\n}\n.ant-col-pull-12 {\n right: 50%;\n}\n.ant-col-offset-12 {\n margin-left: 50%;\n}\n.ant-col-order-12 {\n order: 12;\n}\n.ant-col-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n}\n.ant-col-push-11 {\n left: 45.83333333%;\n}\n.ant-col-pull-11 {\n right: 45.83333333%;\n}\n.ant-col-offset-11 {\n margin-left: 45.83333333%;\n}\n.ant-col-order-11 {\n order: 11;\n}\n.ant-col-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n}\n.ant-col-push-10 {\n left: 41.66666667%;\n}\n.ant-col-pull-10 {\n right: 41.66666667%;\n}\n.ant-col-offset-10 {\n margin-left: 41.66666667%;\n}\n.ant-col-order-10 {\n order: 10;\n}\n.ant-col-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n}\n.ant-col-push-9 {\n left: 37.5%;\n}\n.ant-col-pull-9 {\n right: 37.5%;\n}\n.ant-col-offset-9 {\n margin-left: 37.5%;\n}\n.ant-col-order-9 {\n order: 9;\n}\n.ant-col-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n}\n.ant-col-push-8 {\n left: 33.33333333%;\n}\n.ant-col-pull-8 {\n right: 33.33333333%;\n}\n.ant-col-offset-8 {\n margin-left: 33.33333333%;\n}\n.ant-col-order-8 {\n order: 8;\n}\n.ant-col-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n}\n.ant-col-push-7 {\n left: 29.16666667%;\n}\n.ant-col-pull-7 {\n right: 29.16666667%;\n}\n.ant-col-offset-7 {\n margin-left: 29.16666667%;\n}\n.ant-col-order-7 {\n order: 7;\n}\n.ant-col-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n}\n.ant-col-push-6 {\n left: 25%;\n}\n.ant-col-pull-6 {\n right: 25%;\n}\n.ant-col-offset-6 {\n margin-left: 25%;\n}\n.ant-col-order-6 {\n order: 6;\n}\n.ant-col-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n}\n.ant-col-push-5 {\n left: 20.83333333%;\n}\n.ant-col-pull-5 {\n right: 20.83333333%;\n}\n.ant-col-offset-5 {\n margin-left: 20.83333333%;\n}\n.ant-col-order-5 {\n order: 5;\n}\n.ant-col-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n}\n.ant-col-push-4 {\n left: 16.66666667%;\n}\n.ant-col-pull-4 {\n right: 16.66666667%;\n}\n.ant-col-offset-4 {\n margin-left: 16.66666667%;\n}\n.ant-col-order-4 {\n order: 4;\n}\n.ant-col-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n}\n.ant-col-push-3 {\n left: 12.5%;\n}\n.ant-col-pull-3 {\n right: 12.5%;\n}\n.ant-col-offset-3 {\n margin-left: 12.5%;\n}\n.ant-col-order-3 {\n order: 3;\n}\n.ant-col-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n}\n.ant-col-push-2 {\n left: 8.33333333%;\n}\n.ant-col-pull-2 {\n right: 8.33333333%;\n}\n.ant-col-offset-2 {\n margin-left: 8.33333333%;\n}\n.ant-col-order-2 {\n order: 2;\n}\n.ant-col-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n}\n.ant-col-push-1 {\n left: 4.16666667%;\n}\n.ant-col-pull-1 {\n right: 4.16666667%;\n}\n.ant-col-offset-1 {\n margin-left: 4.16666667%;\n}\n.ant-col-order-1 {\n order: 1;\n}\n.ant-col-0 {\n display: none;\n}\n.ant-col-push-0 {\n left: auto;\n}\n.ant-col-pull-0 {\n right: auto;\n}\n.ant-col-push-0 {\n left: auto;\n}\n.ant-col-pull-0 {\n right: auto;\n}\n.ant-col-offset-0 {\n margin-left: 0;\n}\n.ant-col-order-0 {\n order: 0;\n}\n.ant-col-push-0.ant-col-rtl {\n right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n left: auto;\n}\n.ant-col-push-0.ant-col-rtl {\n right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n left: auto;\n}\n.ant-col-offset-0.ant-col-rtl {\n margin-right: 0;\n}\n.ant-col-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n}\n.ant-col-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n}\n.ant-col-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n}\n.ant-col-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n}\n.ant-col-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n}\n.ant-col-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n}\n.ant-col-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n}\n.ant-col-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n}\n.ant-col-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n}\n.ant-col-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n}\n.ant-col-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n}\n.ant-col-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n}\n.ant-col-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n}\n.ant-col-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n}\n.ant-col-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n}\n.ant-col-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n}\n.ant-col-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n}\n.ant-col-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n}\n.ant-col-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n}\n.ant-col-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n}\n.ant-col-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n}\n.ant-col-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n}\n.ant-col-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n}\n.ant-col-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n}\n.ant-col-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n}\n.ant-col-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n}\n.ant-col-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n}\n.ant-col-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n}\n.ant-col-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n}\n.ant-col-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n}\n.ant-col-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n}\n.ant-col-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n}\n.ant-col-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n}\n.ant-col-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n}\n.ant-col-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n}\n.ant-col-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n}\n.ant-col-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n}\n.ant-col-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n}\n.ant-col-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n}\n.ant-col-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n}\n.ant-col-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n}\n.ant-col-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n}\n.ant-col-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n}\n.ant-col-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n}\n.ant-col-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n}\n.ant-col-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n}\n.ant-col-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n}\n.ant-col-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n}\n.ant-col-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n}\n.ant-col-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n}\n.ant-col-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n}\n.ant-col-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n}\n.ant-col-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n}\n.ant-col-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n}\n.ant-col-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n}\n.ant-col-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n}\n.ant-col-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n}\n.ant-col-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n}\n.ant-col-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n}\n.ant-col-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n}\n.ant-col-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n}\n.ant-col-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n}\n.ant-col-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n}\n.ant-col-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n}\n.ant-col-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n}\n.ant-col-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n}\n.ant-col-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n}\n.ant-col-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n}\n.ant-col-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n}\n.ant-col-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n}\n.ant-col-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n}\n.ant-col-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n}\n.ant-col-xs-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n}\n.ant-col-xs-push-24 {\n left: 100%;\n}\n.ant-col-xs-pull-24 {\n right: 100%;\n}\n.ant-col-xs-offset-24 {\n margin-left: 100%;\n}\n.ant-col-xs-order-24 {\n order: 24;\n}\n.ant-col-xs-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n}\n.ant-col-xs-push-23 {\n left: 95.83333333%;\n}\n.ant-col-xs-pull-23 {\n right: 95.83333333%;\n}\n.ant-col-xs-offset-23 {\n margin-left: 95.83333333%;\n}\n.ant-col-xs-order-23 {\n order: 23;\n}\n.ant-col-xs-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n}\n.ant-col-xs-push-22 {\n left: 91.66666667%;\n}\n.ant-col-xs-pull-22 {\n right: 91.66666667%;\n}\n.ant-col-xs-offset-22 {\n margin-left: 91.66666667%;\n}\n.ant-col-xs-order-22 {\n order: 22;\n}\n.ant-col-xs-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n}\n.ant-col-xs-push-21 {\n left: 87.5%;\n}\n.ant-col-xs-pull-21 {\n right: 87.5%;\n}\n.ant-col-xs-offset-21 {\n margin-left: 87.5%;\n}\n.ant-col-xs-order-21 {\n order: 21;\n}\n.ant-col-xs-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n}\n.ant-col-xs-push-20 {\n left: 83.33333333%;\n}\n.ant-col-xs-pull-20 {\n right: 83.33333333%;\n}\n.ant-col-xs-offset-20 {\n margin-left: 83.33333333%;\n}\n.ant-col-xs-order-20 {\n order: 20;\n}\n.ant-col-xs-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n}\n.ant-col-xs-push-19 {\n left: 79.16666667%;\n}\n.ant-col-xs-pull-19 {\n right: 79.16666667%;\n}\n.ant-col-xs-offset-19 {\n margin-left: 79.16666667%;\n}\n.ant-col-xs-order-19 {\n order: 19;\n}\n.ant-col-xs-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n}\n.ant-col-xs-push-18 {\n left: 75%;\n}\n.ant-col-xs-pull-18 {\n right: 75%;\n}\n.ant-col-xs-offset-18 {\n margin-left: 75%;\n}\n.ant-col-xs-order-18 {\n order: 18;\n}\n.ant-col-xs-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n}\n.ant-col-xs-push-17 {\n left: 70.83333333%;\n}\n.ant-col-xs-pull-17 {\n right: 70.83333333%;\n}\n.ant-col-xs-offset-17 {\n margin-left: 70.83333333%;\n}\n.ant-col-xs-order-17 {\n order: 17;\n}\n.ant-col-xs-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n}\n.ant-col-xs-push-16 {\n left: 66.66666667%;\n}\n.ant-col-xs-pull-16 {\n right: 66.66666667%;\n}\n.ant-col-xs-offset-16 {\n margin-left: 66.66666667%;\n}\n.ant-col-xs-order-16 {\n order: 16;\n}\n.ant-col-xs-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n}\n.ant-col-xs-push-15 {\n left: 62.5%;\n}\n.ant-col-xs-pull-15 {\n right: 62.5%;\n}\n.ant-col-xs-offset-15 {\n margin-left: 62.5%;\n}\n.ant-col-xs-order-15 {\n order: 15;\n}\n.ant-col-xs-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n}\n.ant-col-xs-push-14 {\n left: 58.33333333%;\n}\n.ant-col-xs-pull-14 {\n right: 58.33333333%;\n}\n.ant-col-xs-offset-14 {\n margin-left: 58.33333333%;\n}\n.ant-col-xs-order-14 {\n order: 14;\n}\n.ant-col-xs-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n}\n.ant-col-xs-push-13 {\n left: 54.16666667%;\n}\n.ant-col-xs-pull-13 {\n right: 54.16666667%;\n}\n.ant-col-xs-offset-13 {\n margin-left: 54.16666667%;\n}\n.ant-col-xs-order-13 {\n order: 13;\n}\n.ant-col-xs-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n}\n.ant-col-xs-push-12 {\n left: 50%;\n}\n.ant-col-xs-pull-12 {\n right: 50%;\n}\n.ant-col-xs-offset-12 {\n margin-left: 50%;\n}\n.ant-col-xs-order-12 {\n order: 12;\n}\n.ant-col-xs-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n}\n.ant-col-xs-push-11 {\n left: 45.83333333%;\n}\n.ant-col-xs-pull-11 {\n right: 45.83333333%;\n}\n.ant-col-xs-offset-11 {\n margin-left: 45.83333333%;\n}\n.ant-col-xs-order-11 {\n order: 11;\n}\n.ant-col-xs-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n}\n.ant-col-xs-push-10 {\n left: 41.66666667%;\n}\n.ant-col-xs-pull-10 {\n right: 41.66666667%;\n}\n.ant-col-xs-offset-10 {\n margin-left: 41.66666667%;\n}\n.ant-col-xs-order-10 {\n order: 10;\n}\n.ant-col-xs-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n}\n.ant-col-xs-push-9 {\n left: 37.5%;\n}\n.ant-col-xs-pull-9 {\n right: 37.5%;\n}\n.ant-col-xs-offset-9 {\n margin-left: 37.5%;\n}\n.ant-col-xs-order-9 {\n order: 9;\n}\n.ant-col-xs-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n}\n.ant-col-xs-push-8 {\n left: 33.33333333%;\n}\n.ant-col-xs-pull-8 {\n right: 33.33333333%;\n}\n.ant-col-xs-offset-8 {\n margin-left: 33.33333333%;\n}\n.ant-col-xs-order-8 {\n order: 8;\n}\n.ant-col-xs-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n}\n.ant-col-xs-push-7 {\n left: 29.16666667%;\n}\n.ant-col-xs-pull-7 {\n right: 29.16666667%;\n}\n.ant-col-xs-offset-7 {\n margin-left: 29.16666667%;\n}\n.ant-col-xs-order-7 {\n order: 7;\n}\n.ant-col-xs-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n}\n.ant-col-xs-push-6 {\n left: 25%;\n}\n.ant-col-xs-pull-6 {\n right: 25%;\n}\n.ant-col-xs-offset-6 {\n margin-left: 25%;\n}\n.ant-col-xs-order-6 {\n order: 6;\n}\n.ant-col-xs-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n}\n.ant-col-xs-push-5 {\n left: 20.83333333%;\n}\n.ant-col-xs-pull-5 {\n right: 20.83333333%;\n}\n.ant-col-xs-offset-5 {\n margin-left: 20.83333333%;\n}\n.ant-col-xs-order-5 {\n order: 5;\n}\n.ant-col-xs-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n}\n.ant-col-xs-push-4 {\n left: 16.66666667%;\n}\n.ant-col-xs-pull-4 {\n right: 16.66666667%;\n}\n.ant-col-xs-offset-4 {\n margin-left: 16.66666667%;\n}\n.ant-col-xs-order-4 {\n order: 4;\n}\n.ant-col-xs-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n}\n.ant-col-xs-push-3 {\n left: 12.5%;\n}\n.ant-col-xs-pull-3 {\n right: 12.5%;\n}\n.ant-col-xs-offset-3 {\n margin-left: 12.5%;\n}\n.ant-col-xs-order-3 {\n order: 3;\n}\n.ant-col-xs-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n}\n.ant-col-xs-push-2 {\n left: 8.33333333%;\n}\n.ant-col-xs-pull-2 {\n right: 8.33333333%;\n}\n.ant-col-xs-offset-2 {\n margin-left: 8.33333333%;\n}\n.ant-col-xs-order-2 {\n order: 2;\n}\n.ant-col-xs-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n}\n.ant-col-xs-push-1 {\n left: 4.16666667%;\n}\n.ant-col-xs-pull-1 {\n right: 4.16666667%;\n}\n.ant-col-xs-offset-1 {\n margin-left: 4.16666667%;\n}\n.ant-col-xs-order-1 {\n order: 1;\n}\n.ant-col-xs-0 {\n display: none;\n}\n.ant-col-push-0 {\n left: auto;\n}\n.ant-col-pull-0 {\n right: auto;\n}\n.ant-col-xs-push-0 {\n left: auto;\n}\n.ant-col-xs-pull-0 {\n right: auto;\n}\n.ant-col-xs-offset-0 {\n margin-left: 0;\n}\n.ant-col-xs-order-0 {\n order: 0;\n}\n.ant-col-push-0.ant-col-rtl {\n right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n left: auto;\n}\n.ant-col-xs-push-0.ant-col-rtl {\n right: auto;\n}\n.ant-col-xs-pull-0.ant-col-rtl {\n left: auto;\n}\n.ant-col-xs-offset-0.ant-col-rtl {\n margin-right: 0;\n}\n.ant-col-xs-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n}\n.ant-col-xs-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n}\n.ant-col-xs-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n}\n.ant-col-xs-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n}\n.ant-col-xs-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n}\n.ant-col-xs-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n}\n.ant-col-xs-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n}\n.ant-col-xs-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n}\n.ant-col-xs-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n}\n.ant-col-xs-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n}\n.ant-col-xs-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n}\n.ant-col-xs-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n}\n.ant-col-xs-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n}\n.ant-col-xs-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n}\n.ant-col-xs-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n}\n.ant-col-xs-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n}\n.ant-col-xs-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n}\n.ant-col-xs-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n}\n.ant-col-xs-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n}\n.ant-col-xs-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n}\n.ant-col-xs-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n}\n.ant-col-xs-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n}\n.ant-col-xs-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n}\n.ant-col-xs-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n}\n.ant-col-xs-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n}\n.ant-col-xs-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n}\n.ant-col-xs-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n}\n.ant-col-xs-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n}\n.ant-col-xs-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n}\n.ant-col-xs-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n}\n.ant-col-xs-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n}\n.ant-col-xs-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n}\n.ant-col-xs-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n}\n.ant-col-xs-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n}\n.ant-col-xs-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n}\n.ant-col-xs-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n}\n.ant-col-xs-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n}\n.ant-col-xs-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n}\n.ant-col-xs-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n}\n.ant-col-xs-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n}\n.ant-col-xs-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n}\n.ant-col-xs-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n}\n.ant-col-xs-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n}\n.ant-col-xs-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n}\n.ant-col-xs-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n}\n.ant-col-xs-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n}\n.ant-col-xs-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n}\n.ant-col-xs-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n}\n.ant-col-xs-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n}\n.ant-col-xs-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n}\n.ant-col-xs-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n}\n.ant-col-xs-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n}\n.ant-col-xs-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n}\n.ant-col-xs-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n}\n.ant-col-xs-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n}\n.ant-col-xs-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n}\n.ant-col-xs-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n}\n.ant-col-xs-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n}\n@media (min-width: 576px) {\n .ant-col-sm-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-sm-push-24 {\n left: 100%;\n }\n .ant-col-sm-pull-24 {\n right: 100%;\n }\n .ant-col-sm-offset-24 {\n margin-left: 100%;\n }\n .ant-col-sm-order-24 {\n order: 24;\n }\n .ant-col-sm-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n }\n .ant-col-sm-push-23 {\n left: 95.83333333%;\n }\n .ant-col-sm-pull-23 {\n right: 95.83333333%;\n }\n .ant-col-sm-offset-23 {\n margin-left: 95.83333333%;\n }\n .ant-col-sm-order-23 {\n order: 23;\n }\n .ant-col-sm-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .ant-col-sm-push-22 {\n left: 91.66666667%;\n }\n .ant-col-sm-pull-22 {\n right: 91.66666667%;\n }\n .ant-col-sm-offset-22 {\n margin-left: 91.66666667%;\n }\n .ant-col-sm-order-22 {\n order: 22;\n }\n .ant-col-sm-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n }\n .ant-col-sm-push-21 {\n left: 87.5%;\n }\n .ant-col-sm-pull-21 {\n right: 87.5%;\n }\n .ant-col-sm-offset-21 {\n margin-left: 87.5%;\n }\n .ant-col-sm-order-21 {\n order: 21;\n }\n .ant-col-sm-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .ant-col-sm-push-20 {\n left: 83.33333333%;\n }\n .ant-col-sm-pull-20 {\n right: 83.33333333%;\n }\n .ant-col-sm-offset-20 {\n margin-left: 83.33333333%;\n }\n .ant-col-sm-order-20 {\n order: 20;\n }\n .ant-col-sm-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n }\n .ant-col-sm-push-19 {\n left: 79.16666667%;\n }\n .ant-col-sm-pull-19 {\n right: 79.16666667%;\n }\n .ant-col-sm-offset-19 {\n margin-left: 79.16666667%;\n }\n .ant-col-sm-order-19 {\n order: 19;\n }\n .ant-col-sm-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .ant-col-sm-push-18 {\n left: 75%;\n }\n .ant-col-sm-pull-18 {\n right: 75%;\n }\n .ant-col-sm-offset-18 {\n margin-left: 75%;\n }\n .ant-col-sm-order-18 {\n order: 18;\n }\n .ant-col-sm-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n }\n .ant-col-sm-push-17 {\n left: 70.83333333%;\n }\n .ant-col-sm-pull-17 {\n right: 70.83333333%;\n }\n .ant-col-sm-offset-17 {\n margin-left: 70.83333333%;\n }\n .ant-col-sm-order-17 {\n order: 17;\n }\n .ant-col-sm-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .ant-col-sm-push-16 {\n left: 66.66666667%;\n }\n .ant-col-sm-pull-16 {\n right: 66.66666667%;\n }\n .ant-col-sm-offset-16 {\n margin-left: 66.66666667%;\n }\n .ant-col-sm-order-16 {\n order: 16;\n }\n .ant-col-sm-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n }\n .ant-col-sm-push-15 {\n left: 62.5%;\n }\n .ant-col-sm-pull-15 {\n right: 62.5%;\n }\n .ant-col-sm-offset-15 {\n margin-left: 62.5%;\n }\n .ant-col-sm-order-15 {\n order: 15;\n }\n .ant-col-sm-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .ant-col-sm-push-14 {\n left: 58.33333333%;\n }\n .ant-col-sm-pull-14 {\n right: 58.33333333%;\n }\n .ant-col-sm-offset-14 {\n margin-left: 58.33333333%;\n }\n .ant-col-sm-order-14 {\n order: 14;\n }\n .ant-col-sm-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n }\n .ant-col-sm-push-13 {\n left: 54.16666667%;\n }\n .ant-col-sm-pull-13 {\n right: 54.16666667%;\n }\n .ant-col-sm-offset-13 {\n margin-left: 54.16666667%;\n }\n .ant-col-sm-order-13 {\n order: 13;\n }\n .ant-col-sm-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .ant-col-sm-push-12 {\n left: 50%;\n }\n .ant-col-sm-pull-12 {\n right: 50%;\n }\n .ant-col-sm-offset-12 {\n margin-left: 50%;\n }\n .ant-col-sm-order-12 {\n order: 12;\n }\n .ant-col-sm-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n }\n .ant-col-sm-push-11 {\n left: 45.83333333%;\n }\n .ant-col-sm-pull-11 {\n right: 45.83333333%;\n }\n .ant-col-sm-offset-11 {\n margin-left: 45.83333333%;\n }\n .ant-col-sm-order-11 {\n order: 11;\n }\n .ant-col-sm-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .ant-col-sm-push-10 {\n left: 41.66666667%;\n }\n .ant-col-sm-pull-10 {\n right: 41.66666667%;\n }\n .ant-col-sm-offset-10 {\n margin-left: 41.66666667%;\n }\n .ant-col-sm-order-10 {\n order: 10;\n }\n .ant-col-sm-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n }\n .ant-col-sm-push-9 {\n left: 37.5%;\n }\n .ant-col-sm-pull-9 {\n right: 37.5%;\n }\n .ant-col-sm-offset-9 {\n margin-left: 37.5%;\n }\n .ant-col-sm-order-9 {\n order: 9;\n }\n .ant-col-sm-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .ant-col-sm-push-8 {\n left: 33.33333333%;\n }\n .ant-col-sm-pull-8 {\n right: 33.33333333%;\n }\n .ant-col-sm-offset-8 {\n margin-left: 33.33333333%;\n }\n .ant-col-sm-order-8 {\n order: 8;\n }\n .ant-col-sm-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n }\n .ant-col-sm-push-7 {\n left: 29.16666667%;\n }\n .ant-col-sm-pull-7 {\n right: 29.16666667%;\n }\n .ant-col-sm-offset-7 {\n margin-left: 29.16666667%;\n }\n .ant-col-sm-order-7 {\n order: 7;\n }\n .ant-col-sm-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .ant-col-sm-push-6 {\n left: 25%;\n }\n .ant-col-sm-pull-6 {\n right: 25%;\n }\n .ant-col-sm-offset-6 {\n margin-left: 25%;\n }\n .ant-col-sm-order-6 {\n order: 6;\n }\n .ant-col-sm-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n }\n .ant-col-sm-push-5 {\n left: 20.83333333%;\n }\n .ant-col-sm-pull-5 {\n right: 20.83333333%;\n }\n .ant-col-sm-offset-5 {\n margin-left: 20.83333333%;\n }\n .ant-col-sm-order-5 {\n order: 5;\n }\n .ant-col-sm-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .ant-col-sm-push-4 {\n left: 16.66666667%;\n }\n .ant-col-sm-pull-4 {\n right: 16.66666667%;\n }\n .ant-col-sm-offset-4 {\n margin-left: 16.66666667%;\n }\n .ant-col-sm-order-4 {\n order: 4;\n }\n .ant-col-sm-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n }\n .ant-col-sm-push-3 {\n left: 12.5%;\n }\n .ant-col-sm-pull-3 {\n right: 12.5%;\n }\n .ant-col-sm-offset-3 {\n margin-left: 12.5%;\n }\n .ant-col-sm-order-3 {\n order: 3;\n }\n .ant-col-sm-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .ant-col-sm-push-2 {\n left: 8.33333333%;\n }\n .ant-col-sm-pull-2 {\n right: 8.33333333%;\n }\n .ant-col-sm-offset-2 {\n margin-left: 8.33333333%;\n }\n .ant-col-sm-order-2 {\n order: 2;\n }\n .ant-col-sm-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n }\n .ant-col-sm-push-1 {\n left: 4.16666667%;\n }\n .ant-col-sm-pull-1 {\n right: 4.16666667%;\n }\n .ant-col-sm-offset-1 {\n margin-left: 4.16666667%;\n }\n .ant-col-sm-order-1 {\n order: 1;\n }\n .ant-col-sm-0 {\n display: none;\n }\n .ant-col-push-0 {\n left: auto;\n }\n .ant-col-pull-0 {\n right: auto;\n }\n .ant-col-sm-push-0 {\n left: auto;\n }\n .ant-col-sm-pull-0 {\n right: auto;\n }\n .ant-col-sm-offset-0 {\n margin-left: 0;\n }\n .ant-col-sm-order-0 {\n order: 0;\n }\n .ant-col-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-sm-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-sm-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-sm-offset-0.ant-col-rtl {\n margin-right: 0;\n }\n .ant-col-sm-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n }\n .ant-col-sm-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n }\n .ant-col-sm-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n }\n .ant-col-sm-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n }\n .ant-col-sm-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n }\n .ant-col-sm-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n }\n .ant-col-sm-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n }\n .ant-col-sm-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n }\n .ant-col-sm-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n }\n .ant-col-sm-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n }\n .ant-col-sm-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n }\n .ant-col-sm-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n }\n .ant-col-sm-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n }\n .ant-col-sm-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n }\n .ant-col-sm-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n }\n .ant-col-sm-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n }\n .ant-col-sm-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n }\n .ant-col-sm-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n }\n .ant-col-sm-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n }\n .ant-col-sm-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n }\n .ant-col-sm-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n }\n .ant-col-sm-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n }\n .ant-col-sm-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n }\n .ant-col-sm-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n }\n .ant-col-sm-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n }\n .ant-col-sm-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n }\n .ant-col-sm-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n }\n .ant-col-sm-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n }\n .ant-col-sm-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n }\n .ant-col-sm-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n }\n .ant-col-sm-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n }\n .ant-col-sm-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n }\n .ant-col-sm-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n }\n .ant-col-sm-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n }\n .ant-col-sm-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n }\n .ant-col-sm-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n }\n .ant-col-sm-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n }\n .ant-col-sm-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n }\n .ant-col-sm-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n }\n .ant-col-sm-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n }\n .ant-col-sm-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n }\n .ant-col-sm-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n }\n .ant-col-sm-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n }\n .ant-col-sm-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n }\n .ant-col-sm-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n }\n .ant-col-sm-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n }\n .ant-col-sm-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n }\n .ant-col-sm-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n }\n .ant-col-sm-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n }\n .ant-col-sm-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n }\n .ant-col-sm-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n }\n .ant-col-sm-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n }\n .ant-col-sm-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n }\n .ant-col-sm-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n }\n .ant-col-sm-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n }\n .ant-col-sm-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n }\n .ant-col-sm-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n }\n .ant-col-sm-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n }\n}\n@media (min-width: 768px) {\n .ant-col-md-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-md-push-24 {\n left: 100%;\n }\n .ant-col-md-pull-24 {\n right: 100%;\n }\n .ant-col-md-offset-24 {\n margin-left: 100%;\n }\n .ant-col-md-order-24 {\n order: 24;\n }\n .ant-col-md-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n }\n .ant-col-md-push-23 {\n left: 95.83333333%;\n }\n .ant-col-md-pull-23 {\n right: 95.83333333%;\n }\n .ant-col-md-offset-23 {\n margin-left: 95.83333333%;\n }\n .ant-col-md-order-23 {\n order: 23;\n }\n .ant-col-md-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .ant-col-md-push-22 {\n left: 91.66666667%;\n }\n .ant-col-md-pull-22 {\n right: 91.66666667%;\n }\n .ant-col-md-offset-22 {\n margin-left: 91.66666667%;\n }\n .ant-col-md-order-22 {\n order: 22;\n }\n .ant-col-md-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n }\n .ant-col-md-push-21 {\n left: 87.5%;\n }\n .ant-col-md-pull-21 {\n right: 87.5%;\n }\n .ant-col-md-offset-21 {\n margin-left: 87.5%;\n }\n .ant-col-md-order-21 {\n order: 21;\n }\n .ant-col-md-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .ant-col-md-push-20 {\n left: 83.33333333%;\n }\n .ant-col-md-pull-20 {\n right: 83.33333333%;\n }\n .ant-col-md-offset-20 {\n margin-left: 83.33333333%;\n }\n .ant-col-md-order-20 {\n order: 20;\n }\n .ant-col-md-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n }\n .ant-col-md-push-19 {\n left: 79.16666667%;\n }\n .ant-col-md-pull-19 {\n right: 79.16666667%;\n }\n .ant-col-md-offset-19 {\n margin-left: 79.16666667%;\n }\n .ant-col-md-order-19 {\n order: 19;\n }\n .ant-col-md-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .ant-col-md-push-18 {\n left: 75%;\n }\n .ant-col-md-pull-18 {\n right: 75%;\n }\n .ant-col-md-offset-18 {\n margin-left: 75%;\n }\n .ant-col-md-order-18 {\n order: 18;\n }\n .ant-col-md-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n }\n .ant-col-md-push-17 {\n left: 70.83333333%;\n }\n .ant-col-md-pull-17 {\n right: 70.83333333%;\n }\n .ant-col-md-offset-17 {\n margin-left: 70.83333333%;\n }\n .ant-col-md-order-17 {\n order: 17;\n }\n .ant-col-md-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .ant-col-md-push-16 {\n left: 66.66666667%;\n }\n .ant-col-md-pull-16 {\n right: 66.66666667%;\n }\n .ant-col-md-offset-16 {\n margin-left: 66.66666667%;\n }\n .ant-col-md-order-16 {\n order: 16;\n }\n .ant-col-md-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n }\n .ant-col-md-push-15 {\n left: 62.5%;\n }\n .ant-col-md-pull-15 {\n right: 62.5%;\n }\n .ant-col-md-offset-15 {\n margin-left: 62.5%;\n }\n .ant-col-md-order-15 {\n order: 15;\n }\n .ant-col-md-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .ant-col-md-push-14 {\n left: 58.33333333%;\n }\n .ant-col-md-pull-14 {\n right: 58.33333333%;\n }\n .ant-col-md-offset-14 {\n margin-left: 58.33333333%;\n }\n .ant-col-md-order-14 {\n order: 14;\n }\n .ant-col-md-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n }\n .ant-col-md-push-13 {\n left: 54.16666667%;\n }\n .ant-col-md-pull-13 {\n right: 54.16666667%;\n }\n .ant-col-md-offset-13 {\n margin-left: 54.16666667%;\n }\n .ant-col-md-order-13 {\n order: 13;\n }\n .ant-col-md-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .ant-col-md-push-12 {\n left: 50%;\n }\n .ant-col-md-pull-12 {\n right: 50%;\n }\n .ant-col-md-offset-12 {\n margin-left: 50%;\n }\n .ant-col-md-order-12 {\n order: 12;\n }\n .ant-col-md-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n }\n .ant-col-md-push-11 {\n left: 45.83333333%;\n }\n .ant-col-md-pull-11 {\n right: 45.83333333%;\n }\n .ant-col-md-offset-11 {\n margin-left: 45.83333333%;\n }\n .ant-col-md-order-11 {\n order: 11;\n }\n .ant-col-md-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .ant-col-md-push-10 {\n left: 41.66666667%;\n }\n .ant-col-md-pull-10 {\n right: 41.66666667%;\n }\n .ant-col-md-offset-10 {\n margin-left: 41.66666667%;\n }\n .ant-col-md-order-10 {\n order: 10;\n }\n .ant-col-md-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n }\n .ant-col-md-push-9 {\n left: 37.5%;\n }\n .ant-col-md-pull-9 {\n right: 37.5%;\n }\n .ant-col-md-offset-9 {\n margin-left: 37.5%;\n }\n .ant-col-md-order-9 {\n order: 9;\n }\n .ant-col-md-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .ant-col-md-push-8 {\n left: 33.33333333%;\n }\n .ant-col-md-pull-8 {\n right: 33.33333333%;\n }\n .ant-col-md-offset-8 {\n margin-left: 33.33333333%;\n }\n .ant-col-md-order-8 {\n order: 8;\n }\n .ant-col-md-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n }\n .ant-col-md-push-7 {\n left: 29.16666667%;\n }\n .ant-col-md-pull-7 {\n right: 29.16666667%;\n }\n .ant-col-md-offset-7 {\n margin-left: 29.16666667%;\n }\n .ant-col-md-order-7 {\n order: 7;\n }\n .ant-col-md-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .ant-col-md-push-6 {\n left: 25%;\n }\n .ant-col-md-pull-6 {\n right: 25%;\n }\n .ant-col-md-offset-6 {\n margin-left: 25%;\n }\n .ant-col-md-order-6 {\n order: 6;\n }\n .ant-col-md-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n }\n .ant-col-md-push-5 {\n left: 20.83333333%;\n }\n .ant-col-md-pull-5 {\n right: 20.83333333%;\n }\n .ant-col-md-offset-5 {\n margin-left: 20.83333333%;\n }\n .ant-col-md-order-5 {\n order: 5;\n }\n .ant-col-md-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .ant-col-md-push-4 {\n left: 16.66666667%;\n }\n .ant-col-md-pull-4 {\n right: 16.66666667%;\n }\n .ant-col-md-offset-4 {\n margin-left: 16.66666667%;\n }\n .ant-col-md-order-4 {\n order: 4;\n }\n .ant-col-md-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n }\n .ant-col-md-push-3 {\n left: 12.5%;\n }\n .ant-col-md-pull-3 {\n right: 12.5%;\n }\n .ant-col-md-offset-3 {\n margin-left: 12.5%;\n }\n .ant-col-md-order-3 {\n order: 3;\n }\n .ant-col-md-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .ant-col-md-push-2 {\n left: 8.33333333%;\n }\n .ant-col-md-pull-2 {\n right: 8.33333333%;\n }\n .ant-col-md-offset-2 {\n margin-left: 8.33333333%;\n }\n .ant-col-md-order-2 {\n order: 2;\n }\n .ant-col-md-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n }\n .ant-col-md-push-1 {\n left: 4.16666667%;\n }\n .ant-col-md-pull-1 {\n right: 4.16666667%;\n }\n .ant-col-md-offset-1 {\n margin-left: 4.16666667%;\n }\n .ant-col-md-order-1 {\n order: 1;\n }\n .ant-col-md-0 {\n display: none;\n }\n .ant-col-push-0 {\n left: auto;\n }\n .ant-col-pull-0 {\n right: auto;\n }\n .ant-col-md-push-0 {\n left: auto;\n }\n .ant-col-md-pull-0 {\n right: auto;\n }\n .ant-col-md-offset-0 {\n margin-left: 0;\n }\n .ant-col-md-order-0 {\n order: 0;\n }\n .ant-col-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-md-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-md-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-md-offset-0.ant-col-rtl {\n margin-right: 0;\n }\n .ant-col-md-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n }\n .ant-col-md-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n }\n .ant-col-md-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n }\n .ant-col-md-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n }\n .ant-col-md-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n }\n .ant-col-md-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n .ant-col-md-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n }\n .ant-col-md-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n }\n .ant-col-md-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n }\n .ant-col-md-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n }\n .ant-col-md-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n }\n .ant-col-md-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n }\n .ant-col-md-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n }\n .ant-col-md-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n }\n .ant-col-md-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n }\n .ant-col-md-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n }\n .ant-col-md-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n }\n .ant-col-md-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n }\n .ant-col-md-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n }\n .ant-col-md-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n }\n .ant-col-md-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n }\n .ant-col-md-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n }\n .ant-col-md-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n }\n .ant-col-md-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n }\n .ant-col-md-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n }\n .ant-col-md-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n }\n .ant-col-md-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n }\n .ant-col-md-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n }\n .ant-col-md-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n }\n .ant-col-md-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n }\n .ant-col-md-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n }\n .ant-col-md-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n }\n .ant-col-md-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n }\n .ant-col-md-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n }\n .ant-col-md-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n }\n .ant-col-md-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n }\n .ant-col-md-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n }\n .ant-col-md-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n }\n .ant-col-md-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n }\n .ant-col-md-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n }\n .ant-col-md-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n }\n .ant-col-md-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n }\n .ant-col-md-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n }\n .ant-col-md-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n }\n .ant-col-md-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n }\n .ant-col-md-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n }\n .ant-col-md-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n }\n .ant-col-md-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n }\n .ant-col-md-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n }\n .ant-col-md-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n }\n .ant-col-md-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n }\n .ant-col-md-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n }\n .ant-col-md-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n }\n .ant-col-md-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n }\n .ant-col-md-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n }\n .ant-col-md-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n }\n .ant-col-md-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n }\n .ant-col-md-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n }\n .ant-col-md-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n }\n .ant-col-md-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n }\n .ant-col-md-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n }\n .ant-col-md-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n }\n .ant-col-md-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n }\n .ant-col-md-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n }\n .ant-col-md-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n }\n .ant-col-md-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n }\n .ant-col-md-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n }\n .ant-col-md-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n }\n .ant-col-md-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n }\n .ant-col-md-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n }\n .ant-col-md-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n }\n .ant-col-md-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .ant-col-lg-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-lg-push-24 {\n left: 100%;\n }\n .ant-col-lg-pull-24 {\n right: 100%;\n }\n .ant-col-lg-offset-24 {\n margin-left: 100%;\n }\n .ant-col-lg-order-24 {\n order: 24;\n }\n .ant-col-lg-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n }\n .ant-col-lg-push-23 {\n left: 95.83333333%;\n }\n .ant-col-lg-pull-23 {\n right: 95.83333333%;\n }\n .ant-col-lg-offset-23 {\n margin-left: 95.83333333%;\n }\n .ant-col-lg-order-23 {\n order: 23;\n }\n .ant-col-lg-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .ant-col-lg-push-22 {\n left: 91.66666667%;\n }\n .ant-col-lg-pull-22 {\n right: 91.66666667%;\n }\n .ant-col-lg-offset-22 {\n margin-left: 91.66666667%;\n }\n .ant-col-lg-order-22 {\n order: 22;\n }\n .ant-col-lg-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n }\n .ant-col-lg-push-21 {\n left: 87.5%;\n }\n .ant-col-lg-pull-21 {\n right: 87.5%;\n }\n .ant-col-lg-offset-21 {\n margin-left: 87.5%;\n }\n .ant-col-lg-order-21 {\n order: 21;\n }\n .ant-col-lg-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .ant-col-lg-push-20 {\n left: 83.33333333%;\n }\n .ant-col-lg-pull-20 {\n right: 83.33333333%;\n }\n .ant-col-lg-offset-20 {\n margin-left: 83.33333333%;\n }\n .ant-col-lg-order-20 {\n order: 20;\n }\n .ant-col-lg-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n }\n .ant-col-lg-push-19 {\n left: 79.16666667%;\n }\n .ant-col-lg-pull-19 {\n right: 79.16666667%;\n }\n .ant-col-lg-offset-19 {\n margin-left: 79.16666667%;\n }\n .ant-col-lg-order-19 {\n order: 19;\n }\n .ant-col-lg-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .ant-col-lg-push-18 {\n left: 75%;\n }\n .ant-col-lg-pull-18 {\n right: 75%;\n }\n .ant-col-lg-offset-18 {\n margin-left: 75%;\n }\n .ant-col-lg-order-18 {\n order: 18;\n }\n .ant-col-lg-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n }\n .ant-col-lg-push-17 {\n left: 70.83333333%;\n }\n .ant-col-lg-pull-17 {\n right: 70.83333333%;\n }\n .ant-col-lg-offset-17 {\n margin-left: 70.83333333%;\n }\n .ant-col-lg-order-17 {\n order: 17;\n }\n .ant-col-lg-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .ant-col-lg-push-16 {\n left: 66.66666667%;\n }\n .ant-col-lg-pull-16 {\n right: 66.66666667%;\n }\n .ant-col-lg-offset-16 {\n margin-left: 66.66666667%;\n }\n .ant-col-lg-order-16 {\n order: 16;\n }\n .ant-col-lg-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n }\n .ant-col-lg-push-15 {\n left: 62.5%;\n }\n .ant-col-lg-pull-15 {\n right: 62.5%;\n }\n .ant-col-lg-offset-15 {\n margin-left: 62.5%;\n }\n .ant-col-lg-order-15 {\n order: 15;\n }\n .ant-col-lg-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .ant-col-lg-push-14 {\n left: 58.33333333%;\n }\n .ant-col-lg-pull-14 {\n right: 58.33333333%;\n }\n .ant-col-lg-offset-14 {\n margin-left: 58.33333333%;\n }\n .ant-col-lg-order-14 {\n order: 14;\n }\n .ant-col-lg-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n }\n .ant-col-lg-push-13 {\n left: 54.16666667%;\n }\n .ant-col-lg-pull-13 {\n right: 54.16666667%;\n }\n .ant-col-lg-offset-13 {\n margin-left: 54.16666667%;\n }\n .ant-col-lg-order-13 {\n order: 13;\n }\n .ant-col-lg-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .ant-col-lg-push-12 {\n left: 50%;\n }\n .ant-col-lg-pull-12 {\n right: 50%;\n }\n .ant-col-lg-offset-12 {\n margin-left: 50%;\n }\n .ant-col-lg-order-12 {\n order: 12;\n }\n .ant-col-lg-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n }\n .ant-col-lg-push-11 {\n left: 45.83333333%;\n }\n .ant-col-lg-pull-11 {\n right: 45.83333333%;\n }\n .ant-col-lg-offset-11 {\n margin-left: 45.83333333%;\n }\n .ant-col-lg-order-11 {\n order: 11;\n }\n .ant-col-lg-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .ant-col-lg-push-10 {\n left: 41.66666667%;\n }\n .ant-col-lg-pull-10 {\n right: 41.66666667%;\n }\n .ant-col-lg-offset-10 {\n margin-left: 41.66666667%;\n }\n .ant-col-lg-order-10 {\n order: 10;\n }\n .ant-col-lg-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n }\n .ant-col-lg-push-9 {\n left: 37.5%;\n }\n .ant-col-lg-pull-9 {\n right: 37.5%;\n }\n .ant-col-lg-offset-9 {\n margin-left: 37.5%;\n }\n .ant-col-lg-order-9 {\n order: 9;\n }\n .ant-col-lg-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .ant-col-lg-push-8 {\n left: 33.33333333%;\n }\n .ant-col-lg-pull-8 {\n right: 33.33333333%;\n }\n .ant-col-lg-offset-8 {\n margin-left: 33.33333333%;\n }\n .ant-col-lg-order-8 {\n order: 8;\n }\n .ant-col-lg-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n }\n .ant-col-lg-push-7 {\n left: 29.16666667%;\n }\n .ant-col-lg-pull-7 {\n right: 29.16666667%;\n }\n .ant-col-lg-offset-7 {\n margin-left: 29.16666667%;\n }\n .ant-col-lg-order-7 {\n order: 7;\n }\n .ant-col-lg-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .ant-col-lg-push-6 {\n left: 25%;\n }\n .ant-col-lg-pull-6 {\n right: 25%;\n }\n .ant-col-lg-offset-6 {\n margin-left: 25%;\n }\n .ant-col-lg-order-6 {\n order: 6;\n }\n .ant-col-lg-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n }\n .ant-col-lg-push-5 {\n left: 20.83333333%;\n }\n .ant-col-lg-pull-5 {\n right: 20.83333333%;\n }\n .ant-col-lg-offset-5 {\n margin-left: 20.83333333%;\n }\n .ant-col-lg-order-5 {\n order: 5;\n }\n .ant-col-lg-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .ant-col-lg-push-4 {\n left: 16.66666667%;\n }\n .ant-col-lg-pull-4 {\n right: 16.66666667%;\n }\n .ant-col-lg-offset-4 {\n margin-left: 16.66666667%;\n }\n .ant-col-lg-order-4 {\n order: 4;\n }\n .ant-col-lg-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n }\n .ant-col-lg-push-3 {\n left: 12.5%;\n }\n .ant-col-lg-pull-3 {\n right: 12.5%;\n }\n .ant-col-lg-offset-3 {\n margin-left: 12.5%;\n }\n .ant-col-lg-order-3 {\n order: 3;\n }\n .ant-col-lg-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .ant-col-lg-push-2 {\n left: 8.33333333%;\n }\n .ant-col-lg-pull-2 {\n right: 8.33333333%;\n }\n .ant-col-lg-offset-2 {\n margin-left: 8.33333333%;\n }\n .ant-col-lg-order-2 {\n order: 2;\n }\n .ant-col-lg-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n }\n .ant-col-lg-push-1 {\n left: 4.16666667%;\n }\n .ant-col-lg-pull-1 {\n right: 4.16666667%;\n }\n .ant-col-lg-offset-1 {\n margin-left: 4.16666667%;\n }\n .ant-col-lg-order-1 {\n order: 1;\n }\n .ant-col-lg-0 {\n display: none;\n }\n .ant-col-push-0 {\n left: auto;\n }\n .ant-col-pull-0 {\n right: auto;\n }\n .ant-col-lg-push-0 {\n left: auto;\n }\n .ant-col-lg-pull-0 {\n right: auto;\n }\n .ant-col-lg-offset-0 {\n margin-left: 0;\n }\n .ant-col-lg-order-0 {\n order: 0;\n }\n .ant-col-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-lg-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-lg-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-lg-offset-0.ant-col-rtl {\n margin-right: 0;\n }\n .ant-col-lg-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n }\n .ant-col-lg-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n }\n .ant-col-lg-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n }\n .ant-col-lg-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n }\n .ant-col-lg-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n }\n .ant-col-lg-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n }\n .ant-col-lg-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n }\n .ant-col-lg-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n }\n .ant-col-lg-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n }\n .ant-col-lg-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n }\n .ant-col-lg-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n }\n .ant-col-lg-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n }\n .ant-col-lg-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n }\n .ant-col-lg-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n }\n .ant-col-lg-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n }\n .ant-col-lg-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n }\n .ant-col-lg-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n }\n .ant-col-lg-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n }\n .ant-col-lg-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n }\n .ant-col-lg-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n }\n .ant-col-lg-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n }\n .ant-col-lg-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n }\n .ant-col-lg-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n }\n .ant-col-lg-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n }\n .ant-col-lg-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n }\n .ant-col-lg-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n }\n .ant-col-lg-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n }\n .ant-col-lg-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n }\n .ant-col-lg-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n }\n .ant-col-lg-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n }\n .ant-col-lg-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n }\n .ant-col-lg-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n }\n .ant-col-lg-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n }\n .ant-col-lg-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n }\n .ant-col-lg-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n }\n .ant-col-lg-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n }\n .ant-col-lg-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n }\n .ant-col-lg-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n }\n .ant-col-lg-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n }\n .ant-col-lg-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n }\n .ant-col-lg-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n }\n .ant-col-lg-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n }\n .ant-col-lg-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n }\n .ant-col-lg-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n }\n .ant-col-lg-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n }\n .ant-col-lg-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n }\n .ant-col-lg-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n }\n .ant-col-lg-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n }\n .ant-col-lg-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n }\n .ant-col-lg-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n }\n .ant-col-lg-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n }\n .ant-col-lg-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n }\n .ant-col-lg-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n }\n .ant-col-lg-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n }\n .ant-col-lg-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n }\n .ant-col-lg-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n }\n .ant-col-lg-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n }\n .ant-col-lg-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .ant-col-xl-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-xl-push-24 {\n left: 100%;\n }\n .ant-col-xl-pull-24 {\n right: 100%;\n }\n .ant-col-xl-offset-24 {\n margin-left: 100%;\n }\n .ant-col-xl-order-24 {\n order: 24;\n }\n .ant-col-xl-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n }\n .ant-col-xl-push-23 {\n left: 95.83333333%;\n }\n .ant-col-xl-pull-23 {\n right: 95.83333333%;\n }\n .ant-col-xl-offset-23 {\n margin-left: 95.83333333%;\n }\n .ant-col-xl-order-23 {\n order: 23;\n }\n .ant-col-xl-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .ant-col-xl-push-22 {\n left: 91.66666667%;\n }\n .ant-col-xl-pull-22 {\n right: 91.66666667%;\n }\n .ant-col-xl-offset-22 {\n margin-left: 91.66666667%;\n }\n .ant-col-xl-order-22 {\n order: 22;\n }\n .ant-col-xl-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n }\n .ant-col-xl-push-21 {\n left: 87.5%;\n }\n .ant-col-xl-pull-21 {\n right: 87.5%;\n }\n .ant-col-xl-offset-21 {\n margin-left: 87.5%;\n }\n .ant-col-xl-order-21 {\n order: 21;\n }\n .ant-col-xl-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .ant-col-xl-push-20 {\n left: 83.33333333%;\n }\n .ant-col-xl-pull-20 {\n right: 83.33333333%;\n }\n .ant-col-xl-offset-20 {\n margin-left: 83.33333333%;\n }\n .ant-col-xl-order-20 {\n order: 20;\n }\n .ant-col-xl-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n }\n .ant-col-xl-push-19 {\n left: 79.16666667%;\n }\n .ant-col-xl-pull-19 {\n right: 79.16666667%;\n }\n .ant-col-xl-offset-19 {\n margin-left: 79.16666667%;\n }\n .ant-col-xl-order-19 {\n order: 19;\n }\n .ant-col-xl-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .ant-col-xl-push-18 {\n left: 75%;\n }\n .ant-col-xl-pull-18 {\n right: 75%;\n }\n .ant-col-xl-offset-18 {\n margin-left: 75%;\n }\n .ant-col-xl-order-18 {\n order: 18;\n }\n .ant-col-xl-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n }\n .ant-col-xl-push-17 {\n left: 70.83333333%;\n }\n .ant-col-xl-pull-17 {\n right: 70.83333333%;\n }\n .ant-col-xl-offset-17 {\n margin-left: 70.83333333%;\n }\n .ant-col-xl-order-17 {\n order: 17;\n }\n .ant-col-xl-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .ant-col-xl-push-16 {\n left: 66.66666667%;\n }\n .ant-col-xl-pull-16 {\n right: 66.66666667%;\n }\n .ant-col-xl-offset-16 {\n margin-left: 66.66666667%;\n }\n .ant-col-xl-order-16 {\n order: 16;\n }\n .ant-col-xl-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n }\n .ant-col-xl-push-15 {\n left: 62.5%;\n }\n .ant-col-xl-pull-15 {\n right: 62.5%;\n }\n .ant-col-xl-offset-15 {\n margin-left: 62.5%;\n }\n .ant-col-xl-order-15 {\n order: 15;\n }\n .ant-col-xl-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .ant-col-xl-push-14 {\n left: 58.33333333%;\n }\n .ant-col-xl-pull-14 {\n right: 58.33333333%;\n }\n .ant-col-xl-offset-14 {\n margin-left: 58.33333333%;\n }\n .ant-col-xl-order-14 {\n order: 14;\n }\n .ant-col-xl-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n }\n .ant-col-xl-push-13 {\n left: 54.16666667%;\n }\n .ant-col-xl-pull-13 {\n right: 54.16666667%;\n }\n .ant-col-xl-offset-13 {\n margin-left: 54.16666667%;\n }\n .ant-col-xl-order-13 {\n order: 13;\n }\n .ant-col-xl-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .ant-col-xl-push-12 {\n left: 50%;\n }\n .ant-col-xl-pull-12 {\n right: 50%;\n }\n .ant-col-xl-offset-12 {\n margin-left: 50%;\n }\n .ant-col-xl-order-12 {\n order: 12;\n }\n .ant-col-xl-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n }\n .ant-col-xl-push-11 {\n left: 45.83333333%;\n }\n .ant-col-xl-pull-11 {\n right: 45.83333333%;\n }\n .ant-col-xl-offset-11 {\n margin-left: 45.83333333%;\n }\n .ant-col-xl-order-11 {\n order: 11;\n }\n .ant-col-xl-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .ant-col-xl-push-10 {\n left: 41.66666667%;\n }\n .ant-col-xl-pull-10 {\n right: 41.66666667%;\n }\n .ant-col-xl-offset-10 {\n margin-left: 41.66666667%;\n }\n .ant-col-xl-order-10 {\n order: 10;\n }\n .ant-col-xl-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n }\n .ant-col-xl-push-9 {\n left: 37.5%;\n }\n .ant-col-xl-pull-9 {\n right: 37.5%;\n }\n .ant-col-xl-offset-9 {\n margin-left: 37.5%;\n }\n .ant-col-xl-order-9 {\n order: 9;\n }\n .ant-col-xl-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .ant-col-xl-push-8 {\n left: 33.33333333%;\n }\n .ant-col-xl-pull-8 {\n right: 33.33333333%;\n }\n .ant-col-xl-offset-8 {\n margin-left: 33.33333333%;\n }\n .ant-col-xl-order-8 {\n order: 8;\n }\n .ant-col-xl-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n }\n .ant-col-xl-push-7 {\n left: 29.16666667%;\n }\n .ant-col-xl-pull-7 {\n right: 29.16666667%;\n }\n .ant-col-xl-offset-7 {\n margin-left: 29.16666667%;\n }\n .ant-col-xl-order-7 {\n order: 7;\n }\n .ant-col-xl-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .ant-col-xl-push-6 {\n left: 25%;\n }\n .ant-col-xl-pull-6 {\n right: 25%;\n }\n .ant-col-xl-offset-6 {\n margin-left: 25%;\n }\n .ant-col-xl-order-6 {\n order: 6;\n }\n .ant-col-xl-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n }\n .ant-col-xl-push-5 {\n left: 20.83333333%;\n }\n .ant-col-xl-pull-5 {\n right: 20.83333333%;\n }\n .ant-col-xl-offset-5 {\n margin-left: 20.83333333%;\n }\n .ant-col-xl-order-5 {\n order: 5;\n }\n .ant-col-xl-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .ant-col-xl-push-4 {\n left: 16.66666667%;\n }\n .ant-col-xl-pull-4 {\n right: 16.66666667%;\n }\n .ant-col-xl-offset-4 {\n margin-left: 16.66666667%;\n }\n .ant-col-xl-order-4 {\n order: 4;\n }\n .ant-col-xl-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n }\n .ant-col-xl-push-3 {\n left: 12.5%;\n }\n .ant-col-xl-pull-3 {\n right: 12.5%;\n }\n .ant-col-xl-offset-3 {\n margin-left: 12.5%;\n }\n .ant-col-xl-order-3 {\n order: 3;\n }\n .ant-col-xl-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .ant-col-xl-push-2 {\n left: 8.33333333%;\n }\n .ant-col-xl-pull-2 {\n right: 8.33333333%;\n }\n .ant-col-xl-offset-2 {\n margin-left: 8.33333333%;\n }\n .ant-col-xl-order-2 {\n order: 2;\n }\n .ant-col-xl-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n }\n .ant-col-xl-push-1 {\n left: 4.16666667%;\n }\n .ant-col-xl-pull-1 {\n right: 4.16666667%;\n }\n .ant-col-xl-offset-1 {\n margin-left: 4.16666667%;\n }\n .ant-col-xl-order-1 {\n order: 1;\n }\n .ant-col-xl-0 {\n display: none;\n }\n .ant-col-push-0 {\n left: auto;\n }\n .ant-col-pull-0 {\n right: auto;\n }\n .ant-col-xl-push-0 {\n left: auto;\n }\n .ant-col-xl-pull-0 {\n right: auto;\n }\n .ant-col-xl-offset-0 {\n margin-left: 0;\n }\n .ant-col-xl-order-0 {\n order: 0;\n }\n .ant-col-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-xl-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-xl-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-xl-offset-0.ant-col-rtl {\n margin-right: 0;\n }\n .ant-col-xl-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n }\n .ant-col-xl-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n }\n .ant-col-xl-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n }\n .ant-col-xl-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n }\n .ant-col-xl-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n }\n .ant-col-xl-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n }\n .ant-col-xl-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n }\n .ant-col-xl-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n }\n .ant-col-xl-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n }\n .ant-col-xl-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n }\n .ant-col-xl-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n }\n .ant-col-xl-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n }\n .ant-col-xl-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n }\n .ant-col-xl-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n }\n .ant-col-xl-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n }\n .ant-col-xl-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n }\n .ant-col-xl-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n }\n .ant-col-xl-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n }\n .ant-col-xl-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n }\n .ant-col-xl-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n }\n .ant-col-xl-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n }\n .ant-col-xl-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n }\n .ant-col-xl-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n }\n .ant-col-xl-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n }\n .ant-col-xl-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n }\n .ant-col-xl-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n }\n .ant-col-xl-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n }\n .ant-col-xl-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n }\n .ant-col-xl-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n }\n .ant-col-xl-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n }\n .ant-col-xl-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n }\n .ant-col-xl-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n }\n .ant-col-xl-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n }\n .ant-col-xl-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n }\n .ant-col-xl-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n }\n .ant-col-xl-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n }\n .ant-col-xl-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n }\n .ant-col-xl-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n }\n .ant-col-xl-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n }\n .ant-col-xl-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n }\n .ant-col-xl-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n }\n .ant-col-xl-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n }\n .ant-col-xl-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n }\n .ant-col-xl-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n }\n .ant-col-xl-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n }\n .ant-col-xl-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n }\n .ant-col-xl-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n }\n .ant-col-xl-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n }\n .ant-col-xl-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n }\n .ant-col-xl-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n }\n .ant-col-xl-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n }\n .ant-col-xl-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n }\n .ant-col-xl-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n }\n .ant-col-xl-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n }\n .ant-col-xl-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n }\n .ant-col-xl-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n }\n .ant-col-xl-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n }\n .ant-col-xl-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n }\n}\n@media (min-width: 1600px) {\n .ant-col-xxl-24 {\n display: block;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-xxl-push-24 {\n left: 100%;\n }\n .ant-col-xxl-pull-24 {\n right: 100%;\n }\n .ant-col-xxl-offset-24 {\n margin-left: 100%;\n }\n .ant-col-xxl-order-24 {\n order: 24;\n }\n .ant-col-xxl-23 {\n display: block;\n flex: 0 0 95.83333333%;\n max-width: 95.83333333%;\n }\n .ant-col-xxl-push-23 {\n left: 95.83333333%;\n }\n .ant-col-xxl-pull-23 {\n right: 95.83333333%;\n }\n .ant-col-xxl-offset-23 {\n margin-left: 95.83333333%;\n }\n .ant-col-xxl-order-23 {\n order: 23;\n }\n .ant-col-xxl-22 {\n display: block;\n flex: 0 0 91.66666667%;\n max-width: 91.66666667%;\n }\n .ant-col-xxl-push-22 {\n left: 91.66666667%;\n }\n .ant-col-xxl-pull-22 {\n right: 91.66666667%;\n }\n .ant-col-xxl-offset-22 {\n margin-left: 91.66666667%;\n }\n .ant-col-xxl-order-22 {\n order: 22;\n }\n .ant-col-xxl-21 {\n display: block;\n flex: 0 0 87.5%;\n max-width: 87.5%;\n }\n .ant-col-xxl-push-21 {\n left: 87.5%;\n }\n .ant-col-xxl-pull-21 {\n right: 87.5%;\n }\n .ant-col-xxl-offset-21 {\n margin-left: 87.5%;\n }\n .ant-col-xxl-order-21 {\n order: 21;\n }\n .ant-col-xxl-20 {\n display: block;\n flex: 0 0 83.33333333%;\n max-width: 83.33333333%;\n }\n .ant-col-xxl-push-20 {\n left: 83.33333333%;\n }\n .ant-col-xxl-pull-20 {\n right: 83.33333333%;\n }\n .ant-col-xxl-offset-20 {\n margin-left: 83.33333333%;\n }\n .ant-col-xxl-order-20 {\n order: 20;\n }\n .ant-col-xxl-19 {\n display: block;\n flex: 0 0 79.16666667%;\n max-width: 79.16666667%;\n }\n .ant-col-xxl-push-19 {\n left: 79.16666667%;\n }\n .ant-col-xxl-pull-19 {\n right: 79.16666667%;\n }\n .ant-col-xxl-offset-19 {\n margin-left: 79.16666667%;\n }\n .ant-col-xxl-order-19 {\n order: 19;\n }\n .ant-col-xxl-18 {\n display: block;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .ant-col-xxl-push-18 {\n left: 75%;\n }\n .ant-col-xxl-pull-18 {\n right: 75%;\n }\n .ant-col-xxl-offset-18 {\n margin-left: 75%;\n }\n .ant-col-xxl-order-18 {\n order: 18;\n }\n .ant-col-xxl-17 {\n display: block;\n flex: 0 0 70.83333333%;\n max-width: 70.83333333%;\n }\n .ant-col-xxl-push-17 {\n left: 70.83333333%;\n }\n .ant-col-xxl-pull-17 {\n right: 70.83333333%;\n }\n .ant-col-xxl-offset-17 {\n margin-left: 70.83333333%;\n }\n .ant-col-xxl-order-17 {\n order: 17;\n }\n .ant-col-xxl-16 {\n display: block;\n flex: 0 0 66.66666667%;\n max-width: 66.66666667%;\n }\n .ant-col-xxl-push-16 {\n left: 66.66666667%;\n }\n .ant-col-xxl-pull-16 {\n right: 66.66666667%;\n }\n .ant-col-xxl-offset-16 {\n margin-left: 66.66666667%;\n }\n .ant-col-xxl-order-16 {\n order: 16;\n }\n .ant-col-xxl-15 {\n display: block;\n flex: 0 0 62.5%;\n max-width: 62.5%;\n }\n .ant-col-xxl-push-15 {\n left: 62.5%;\n }\n .ant-col-xxl-pull-15 {\n right: 62.5%;\n }\n .ant-col-xxl-offset-15 {\n margin-left: 62.5%;\n }\n .ant-col-xxl-order-15 {\n order: 15;\n }\n .ant-col-xxl-14 {\n display: block;\n flex: 0 0 58.33333333%;\n max-width: 58.33333333%;\n }\n .ant-col-xxl-push-14 {\n left: 58.33333333%;\n }\n .ant-col-xxl-pull-14 {\n right: 58.33333333%;\n }\n .ant-col-xxl-offset-14 {\n margin-left: 58.33333333%;\n }\n .ant-col-xxl-order-14 {\n order: 14;\n }\n .ant-col-xxl-13 {\n display: block;\n flex: 0 0 54.16666667%;\n max-width: 54.16666667%;\n }\n .ant-col-xxl-push-13 {\n left: 54.16666667%;\n }\n .ant-col-xxl-pull-13 {\n right: 54.16666667%;\n }\n .ant-col-xxl-offset-13 {\n margin-left: 54.16666667%;\n }\n .ant-col-xxl-order-13 {\n order: 13;\n }\n .ant-col-xxl-12 {\n display: block;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .ant-col-xxl-push-12 {\n left: 50%;\n }\n .ant-col-xxl-pull-12 {\n right: 50%;\n }\n .ant-col-xxl-offset-12 {\n margin-left: 50%;\n }\n .ant-col-xxl-order-12 {\n order: 12;\n }\n .ant-col-xxl-11 {\n display: block;\n flex: 0 0 45.83333333%;\n max-width: 45.83333333%;\n }\n .ant-col-xxl-push-11 {\n left: 45.83333333%;\n }\n .ant-col-xxl-pull-11 {\n right: 45.83333333%;\n }\n .ant-col-xxl-offset-11 {\n margin-left: 45.83333333%;\n }\n .ant-col-xxl-order-11 {\n order: 11;\n }\n .ant-col-xxl-10 {\n display: block;\n flex: 0 0 41.66666667%;\n max-width: 41.66666667%;\n }\n .ant-col-xxl-push-10 {\n left: 41.66666667%;\n }\n .ant-col-xxl-pull-10 {\n right: 41.66666667%;\n }\n .ant-col-xxl-offset-10 {\n margin-left: 41.66666667%;\n }\n .ant-col-xxl-order-10 {\n order: 10;\n }\n .ant-col-xxl-9 {\n display: block;\n flex: 0 0 37.5%;\n max-width: 37.5%;\n }\n .ant-col-xxl-push-9 {\n left: 37.5%;\n }\n .ant-col-xxl-pull-9 {\n right: 37.5%;\n }\n .ant-col-xxl-offset-9 {\n margin-left: 37.5%;\n }\n .ant-col-xxl-order-9 {\n order: 9;\n }\n .ant-col-xxl-8 {\n display: block;\n flex: 0 0 33.33333333%;\n max-width: 33.33333333%;\n }\n .ant-col-xxl-push-8 {\n left: 33.33333333%;\n }\n .ant-col-xxl-pull-8 {\n right: 33.33333333%;\n }\n .ant-col-xxl-offset-8 {\n margin-left: 33.33333333%;\n }\n .ant-col-xxl-order-8 {\n order: 8;\n }\n .ant-col-xxl-7 {\n display: block;\n flex: 0 0 29.16666667%;\n max-width: 29.16666667%;\n }\n .ant-col-xxl-push-7 {\n left: 29.16666667%;\n }\n .ant-col-xxl-pull-7 {\n right: 29.16666667%;\n }\n .ant-col-xxl-offset-7 {\n margin-left: 29.16666667%;\n }\n .ant-col-xxl-order-7 {\n order: 7;\n }\n .ant-col-xxl-6 {\n display: block;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .ant-col-xxl-push-6 {\n left: 25%;\n }\n .ant-col-xxl-pull-6 {\n right: 25%;\n }\n .ant-col-xxl-offset-6 {\n margin-left: 25%;\n }\n .ant-col-xxl-order-6 {\n order: 6;\n }\n .ant-col-xxl-5 {\n display: block;\n flex: 0 0 20.83333333%;\n max-width: 20.83333333%;\n }\n .ant-col-xxl-push-5 {\n left: 20.83333333%;\n }\n .ant-col-xxl-pull-5 {\n right: 20.83333333%;\n }\n .ant-col-xxl-offset-5 {\n margin-left: 20.83333333%;\n }\n .ant-col-xxl-order-5 {\n order: 5;\n }\n .ant-col-xxl-4 {\n display: block;\n flex: 0 0 16.66666667%;\n max-width: 16.66666667%;\n }\n .ant-col-xxl-push-4 {\n left: 16.66666667%;\n }\n .ant-col-xxl-pull-4 {\n right: 16.66666667%;\n }\n .ant-col-xxl-offset-4 {\n margin-left: 16.66666667%;\n }\n .ant-col-xxl-order-4 {\n order: 4;\n }\n .ant-col-xxl-3 {\n display: block;\n flex: 0 0 12.5%;\n max-width: 12.5%;\n }\n .ant-col-xxl-push-3 {\n left: 12.5%;\n }\n .ant-col-xxl-pull-3 {\n right: 12.5%;\n }\n .ant-col-xxl-offset-3 {\n margin-left: 12.5%;\n }\n .ant-col-xxl-order-3 {\n order: 3;\n }\n .ant-col-xxl-2 {\n display: block;\n flex: 0 0 8.33333333%;\n max-width: 8.33333333%;\n }\n .ant-col-xxl-push-2 {\n left: 8.33333333%;\n }\n .ant-col-xxl-pull-2 {\n right: 8.33333333%;\n }\n .ant-col-xxl-offset-2 {\n margin-left: 8.33333333%;\n }\n .ant-col-xxl-order-2 {\n order: 2;\n }\n .ant-col-xxl-1 {\n display: block;\n flex: 0 0 4.16666667%;\n max-width: 4.16666667%;\n }\n .ant-col-xxl-push-1 {\n left: 4.16666667%;\n }\n .ant-col-xxl-pull-1 {\n right: 4.16666667%;\n }\n .ant-col-xxl-offset-1 {\n margin-left: 4.16666667%;\n }\n .ant-col-xxl-order-1 {\n order: 1;\n }\n .ant-col-xxl-0 {\n display: none;\n }\n .ant-col-push-0 {\n left: auto;\n }\n .ant-col-pull-0 {\n right: auto;\n }\n .ant-col-xxl-push-0 {\n left: auto;\n }\n .ant-col-xxl-pull-0 {\n right: auto;\n }\n .ant-col-xxl-offset-0 {\n margin-left: 0;\n }\n .ant-col-xxl-order-0 {\n order: 0;\n }\n .ant-col-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-xxl-push-0.ant-col-rtl {\n right: auto;\n }\n .ant-col-xxl-pull-0.ant-col-rtl {\n left: auto;\n }\n .ant-col-xxl-offset-0.ant-col-rtl {\n margin-right: 0;\n }\n .ant-col-xxl-push-1.ant-col-rtl {\n right: 4.16666667%;\n left: auto;\n }\n .ant-col-xxl-pull-1.ant-col-rtl {\n right: auto;\n left: 4.16666667%;\n }\n .ant-col-xxl-offset-1.ant-col-rtl {\n margin-right: 4.16666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-2.ant-col-rtl {\n right: 8.33333333%;\n left: auto;\n }\n .ant-col-xxl-pull-2.ant-col-rtl {\n right: auto;\n left: 8.33333333%;\n }\n .ant-col-xxl-offset-2.ant-col-rtl {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-3.ant-col-rtl {\n right: 12.5%;\n left: auto;\n }\n .ant-col-xxl-pull-3.ant-col-rtl {\n right: auto;\n left: 12.5%;\n }\n .ant-col-xxl-offset-3.ant-col-rtl {\n margin-right: 12.5%;\n margin-left: 0;\n }\n .ant-col-xxl-push-4.ant-col-rtl {\n right: 16.66666667%;\n left: auto;\n }\n .ant-col-xxl-pull-4.ant-col-rtl {\n right: auto;\n left: 16.66666667%;\n }\n .ant-col-xxl-offset-4.ant-col-rtl {\n margin-right: 16.66666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-5.ant-col-rtl {\n right: 20.83333333%;\n left: auto;\n }\n .ant-col-xxl-pull-5.ant-col-rtl {\n right: auto;\n left: 20.83333333%;\n }\n .ant-col-xxl-offset-5.ant-col-rtl {\n margin-right: 20.83333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-6.ant-col-rtl {\n right: 25%;\n left: auto;\n }\n .ant-col-xxl-pull-6.ant-col-rtl {\n right: auto;\n left: 25%;\n }\n .ant-col-xxl-offset-6.ant-col-rtl {\n margin-right: 25%;\n margin-left: 0;\n }\n .ant-col-xxl-push-7.ant-col-rtl {\n right: 29.16666667%;\n left: auto;\n }\n .ant-col-xxl-pull-7.ant-col-rtl {\n right: auto;\n left: 29.16666667%;\n }\n .ant-col-xxl-offset-7.ant-col-rtl {\n margin-right: 29.16666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-8.ant-col-rtl {\n right: 33.33333333%;\n left: auto;\n }\n .ant-col-xxl-pull-8.ant-col-rtl {\n right: auto;\n left: 33.33333333%;\n }\n .ant-col-xxl-offset-8.ant-col-rtl {\n margin-right: 33.33333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-9.ant-col-rtl {\n right: 37.5%;\n left: auto;\n }\n .ant-col-xxl-pull-9.ant-col-rtl {\n right: auto;\n left: 37.5%;\n }\n .ant-col-xxl-offset-9.ant-col-rtl {\n margin-right: 37.5%;\n margin-left: 0;\n }\n .ant-col-xxl-push-10.ant-col-rtl {\n right: 41.66666667%;\n left: auto;\n }\n .ant-col-xxl-pull-10.ant-col-rtl {\n right: auto;\n left: 41.66666667%;\n }\n .ant-col-xxl-offset-10.ant-col-rtl {\n margin-right: 41.66666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-11.ant-col-rtl {\n right: 45.83333333%;\n left: auto;\n }\n .ant-col-xxl-pull-11.ant-col-rtl {\n right: auto;\n left: 45.83333333%;\n }\n .ant-col-xxl-offset-11.ant-col-rtl {\n margin-right: 45.83333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-12.ant-col-rtl {\n right: 50%;\n left: auto;\n }\n .ant-col-xxl-pull-12.ant-col-rtl {\n right: auto;\n left: 50%;\n }\n .ant-col-xxl-offset-12.ant-col-rtl {\n margin-right: 50%;\n margin-left: 0;\n }\n .ant-col-xxl-push-13.ant-col-rtl {\n right: 54.16666667%;\n left: auto;\n }\n .ant-col-xxl-pull-13.ant-col-rtl {\n right: auto;\n left: 54.16666667%;\n }\n .ant-col-xxl-offset-13.ant-col-rtl {\n margin-right: 54.16666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-14.ant-col-rtl {\n right: 58.33333333%;\n left: auto;\n }\n .ant-col-xxl-pull-14.ant-col-rtl {\n right: auto;\n left: 58.33333333%;\n }\n .ant-col-xxl-offset-14.ant-col-rtl {\n margin-right: 58.33333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-15.ant-col-rtl {\n right: 62.5%;\n left: auto;\n }\n .ant-col-xxl-pull-15.ant-col-rtl {\n right: auto;\n left: 62.5%;\n }\n .ant-col-xxl-offset-15.ant-col-rtl {\n margin-right: 62.5%;\n margin-left: 0;\n }\n .ant-col-xxl-push-16.ant-col-rtl {\n right: 66.66666667%;\n left: auto;\n }\n .ant-col-xxl-pull-16.ant-col-rtl {\n right: auto;\n left: 66.66666667%;\n }\n .ant-col-xxl-offset-16.ant-col-rtl {\n margin-right: 66.66666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-17.ant-col-rtl {\n right: 70.83333333%;\n left: auto;\n }\n .ant-col-xxl-pull-17.ant-col-rtl {\n right: auto;\n left: 70.83333333%;\n }\n .ant-col-xxl-offset-17.ant-col-rtl {\n margin-right: 70.83333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-18.ant-col-rtl {\n right: 75%;\n left: auto;\n }\n .ant-col-xxl-pull-18.ant-col-rtl {\n right: auto;\n left: 75%;\n }\n .ant-col-xxl-offset-18.ant-col-rtl {\n margin-right: 75%;\n margin-left: 0;\n }\n .ant-col-xxl-push-19.ant-col-rtl {\n right: 79.16666667%;\n left: auto;\n }\n .ant-col-xxl-pull-19.ant-col-rtl {\n right: auto;\n left: 79.16666667%;\n }\n .ant-col-xxl-offset-19.ant-col-rtl {\n margin-right: 79.16666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-20.ant-col-rtl {\n right: 83.33333333%;\n left: auto;\n }\n .ant-col-xxl-pull-20.ant-col-rtl {\n right: auto;\n left: 83.33333333%;\n }\n .ant-col-xxl-offset-20.ant-col-rtl {\n margin-right: 83.33333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-21.ant-col-rtl {\n right: 87.5%;\n left: auto;\n }\n .ant-col-xxl-pull-21.ant-col-rtl {\n right: auto;\n left: 87.5%;\n }\n .ant-col-xxl-offset-21.ant-col-rtl {\n margin-right: 87.5%;\n margin-left: 0;\n }\n .ant-col-xxl-push-22.ant-col-rtl {\n right: 91.66666667%;\n left: auto;\n }\n .ant-col-xxl-pull-22.ant-col-rtl {\n right: auto;\n left: 91.66666667%;\n }\n .ant-col-xxl-offset-22.ant-col-rtl {\n margin-right: 91.66666667%;\n margin-left: 0;\n }\n .ant-col-xxl-push-23.ant-col-rtl {\n right: 95.83333333%;\n left: auto;\n }\n .ant-col-xxl-pull-23.ant-col-rtl {\n right: auto;\n left: 95.83333333%;\n }\n .ant-col-xxl-offset-23.ant-col-rtl {\n margin-right: 95.83333333%;\n margin-left: 0;\n }\n .ant-col-xxl-push-24.ant-col-rtl {\n right: 100%;\n left: auto;\n }\n .ant-col-xxl-pull-24.ant-col-rtl {\n right: auto;\n left: 100%;\n }\n .ant-col-xxl-offset-24.ant-col-rtl {\n margin-right: 100%;\n margin-left: 0;\n }\n}\n.ant-row-rtl {\n direction: rtl;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-collapse {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n background-color: #fafafa;\n border: 1px solid #d9d9d9;\n border-bottom: 0;\n border-radius: 2px;\n}\n.ant-collapse > .ant-collapse-item {\n border-bottom: 1px solid #d9d9d9;\n}\n.ant-collapse > .ant-collapse-item:last-child,\n.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header {\n border-radius: 0 0 2px 2px;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header {\n position: relative;\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n padding: 12px 16px;\n color: rgba(0, 0, 0, 0.85);\n line-height: 1.5715;\n cursor: pointer;\n transition: all 0.3s, visibility 0s;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n display: inline-block;\n margin-right: 12px;\n font-size: 12px;\n vertical-align: -1px;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg {\n transition: transform 0.24s;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra {\n margin-left: auto;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header:focus {\n outline: none;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-header-collapsible-only {\n cursor: default;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-header-collapsible-only .ant-collapse-header-text {\n cursor: pointer;\n}\n.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header {\n padding-left: 12px;\n}\n.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header {\n position: relative;\n padding: 12px 16px;\n padding-right: 40px;\n}\n.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n position: absolute;\n top: 50%;\n right: 16px;\n left: auto;\n margin: 0;\n transform: translateY(-50%);\n}\n.ant-collapse-content {\n color: rgba(0, 0, 0, 0.85);\n background-color: #fff;\n border-top: 1px solid #d9d9d9;\n}\n.ant-collapse-content > .ant-collapse-content-box {\n padding: 16px;\n}\n.ant-collapse-content-hidden {\n display: none;\n}\n.ant-collapse-item:last-child > .ant-collapse-content {\n border-radius: 0 0 2px 2px;\n}\n.ant-collapse-borderless {\n background-color: #fafafa;\n border: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item {\n border-bottom: 1px solid #d9d9d9;\n}\n.ant-collapse-borderless > .ant-collapse-item:last-child,\n.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header {\n border-radius: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item:last-child {\n border-bottom: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content {\n background-color: transparent;\n border-top: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box {\n padding-top: 4px;\n}\n.ant-collapse-ghost {\n background-color: transparent;\n border: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item {\n border-bottom: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content {\n background-color: transparent;\n border-top: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box {\n padding-top: 12px;\n padding-bottom: 12px;\n}\n.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header,\n.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-collapse-rtl {\n direction: rtl;\n}\n.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header {\n position: relative;\n padding: 12px 16px;\n padding-left: 40px;\n}\n.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n position: absolute;\n top: 50%;\n right: auto;\n left: 16px;\n margin: 0;\n transform: translateY(-50%);\n}\n.ant-collapse-rtl .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n padding: 12px 16px;\n padding-right: 40px;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg {\n transform: rotate(180deg);\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra {\n margin-right: auto;\n margin-left: 0;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header {\n padding-right: 12px;\n padding-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-comment {\n position: relative;\n background-color: inherit;\n}\n.ant-comment-inner {\n display: flex;\n padding: 16px 0;\n}\n.ant-comment-avatar {\n position: relative;\n flex-shrink: 0;\n margin-right: 12px;\n cursor: pointer;\n}\n.ant-comment-avatar img {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n}\n.ant-comment-content {\n position: relative;\n flex: 1 1 auto;\n min-width: 1px;\n font-size: 14px;\n word-wrap: break-word;\n}\n.ant-comment-content-author {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n margin-bottom: 4px;\n font-size: 14px;\n}\n.ant-comment-content-author > a,\n.ant-comment-content-author > span {\n padding-right: 8px;\n font-size: 12px;\n line-height: 18px;\n}\n.ant-comment-content-author-name {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n transition: color 0.3s;\n}\n.ant-comment-content-author-name > * {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-comment-content-author-name > *:hover {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-comment-content-author-time {\n color: #ccc;\n white-space: nowrap;\n cursor: auto;\n}\n.ant-comment-content-detail p {\n margin-bottom: inherit;\n white-space: pre-wrap;\n}\n.ant-comment-actions {\n margin-top: 12px;\n margin-bottom: inherit;\n padding-left: 0;\n}\n.ant-comment-actions > li {\n display: inline-block;\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-comment-actions > li > span {\n margin-right: 10px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-comment-actions > li > span:hover {\n color: #595959;\n}\n.ant-comment-nested {\n margin-left: 44px;\n}\n.ant-comment-rtl {\n direction: rtl;\n}\n.ant-comment-rtl .ant-comment-avatar {\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-comment-rtl .ant-comment-content-author > a,\n.ant-comment-rtl .ant-comment-content-author > span {\n padding-right: 0;\n padding-left: 8px;\n}\n.ant-comment-rtl .ant-comment-actions {\n padding-right: 0;\n}\n.ant-comment-rtl .ant-comment-actions > li > span {\n margin-right: 0;\n margin-left: 10px;\n}\n.ant-comment-rtl .ant-comment-nested {\n margin-right: 44px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-descriptions-header {\n display: flex;\n align-items: center;\n margin-bottom: 20px;\n}\n.ant-descriptions-title {\n flex: auto;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: bold;\n font-size: 16px;\n line-height: 1.5715;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-descriptions-extra {\n margin-left: auto;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-descriptions-view {\n width: 100%;\n border-radius: 2px;\n}\n.ant-descriptions-view table {\n width: 100%;\n table-layout: fixed;\n}\n.ant-descriptions-row > th,\n.ant-descriptions-row > td {\n padding-bottom: 16px;\n}\n.ant-descriptions-row:last-child {\n border-bottom: none;\n}\n.ant-descriptions-item-label {\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n line-height: 1.5715;\n text-align: start;\n}\n.ant-descriptions-item-label::after {\n content: ':';\n position: relative;\n top: -0.5px;\n margin: 0 8px 0 2px;\n}\n.ant-descriptions-item-label.ant-descriptions-item-no-colon::after {\n content: ' ';\n}\n.ant-descriptions-item-no-label::after {\n margin: 0;\n content: '';\n}\n.ant-descriptions-item-content {\n display: table-cell;\n flex: 1;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n word-break: break-word;\n overflow-wrap: break-word;\n}\n.ant-descriptions-item {\n padding-bottom: 0;\n vertical-align: top;\n}\n.ant-descriptions-item-container {\n display: flex;\n}\n.ant-descriptions-item-container .ant-descriptions-item-label,\n.ant-descriptions-item-container .ant-descriptions-item-content {\n display: inline-flex;\n align-items: baseline;\n}\n.ant-descriptions-middle .ant-descriptions-row > th,\n.ant-descriptions-middle .ant-descriptions-row > td {\n padding-bottom: 12px;\n}\n.ant-descriptions-small .ant-descriptions-row > th,\n.ant-descriptions-small .ant-descriptions-row > td {\n padding-bottom: 8px;\n}\n.ant-descriptions-bordered .ant-descriptions-view {\n border: 1px solid #f0f0f0;\n}\n.ant-descriptions-bordered .ant-descriptions-view > table {\n table-layout: auto;\n border-collapse: collapse;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label,\n.ant-descriptions-bordered .ant-descriptions-item-content {\n padding: 16px 24px;\n border-right: 1px solid #f0f0f0;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label:last-child,\n.ant-descriptions-bordered .ant-descriptions-item-content:last-child {\n border-right: none;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label {\n background-color: #fafafa;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label::after {\n display: none;\n}\n.ant-descriptions-bordered .ant-descriptions-row {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-descriptions-bordered .ant-descriptions-row:last-child {\n border-bottom: none;\n}\n.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label,\n.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content {\n padding: 12px 24px;\n}\n.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label,\n.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content {\n padding: 8px 16px;\n}\n.ant-descriptions-rtl {\n direction: rtl;\n}\n.ant-descriptions-rtl .ant-descriptions-item-label::after {\n margin: 0 2px 0 8px;\n}\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label,\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content {\n border-right: none;\n border-left: 1px solid #f0f0f0;\n}\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label:last-child,\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content:last-child {\n border-left: none;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-divider {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n}\n.ant-divider-vertical {\n position: relative;\n top: -0.06em;\n display: inline-block;\n height: 0.9em;\n margin: 0 8px;\n vertical-align: middle;\n border-top: 0;\n border-left: 1px solid rgba(0, 0, 0, 0.06);\n}\n.ant-divider-horizontal {\n display: flex;\n clear: both;\n width: 100%;\n min-width: 100%;\n margin: 24px 0;\n}\n.ant-divider-horizontal.ant-divider-with-text {\n display: flex;\n margin: 16px 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n white-space: nowrap;\n text-align: center;\n border-top: 0;\n border-top-color: rgba(0, 0, 0, 0.06);\n}\n.ant-divider-horizontal.ant-divider-with-text::before,\n.ant-divider-horizontal.ant-divider-with-text::after {\n position: relative;\n top: 50%;\n width: 50%;\n border-top: 1px solid transparent;\n border-top-color: inherit;\n border-bottom: 0;\n transform: translateY(50%);\n content: '';\n}\n.ant-divider-horizontal.ant-divider-with-text-left::before {\n top: 50%;\n width: 5%;\n}\n.ant-divider-horizontal.ant-divider-with-text-left::after {\n top: 50%;\n width: 95%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right::before {\n top: 50%;\n width: 95%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right::after {\n top: 50%;\n width: 5%;\n}\n.ant-divider-inner-text {\n display: inline-block;\n padding: 0 1em;\n}\n.ant-divider-dashed {\n background: none;\n border-color: rgba(0, 0, 0, 0.06);\n border-style: dashed;\n border-width: 1px 0 0;\n}\n.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::before,\n.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::after {\n border-style: dashed none none;\n}\n.ant-divider-vertical.ant-divider-dashed {\n border-width: 0 0 0 1px;\n}\n.ant-divider-plain.ant-divider-with-text {\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left::before {\n width: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left::after {\n width: 100%;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text {\n padding-left: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right::before {\n width: 100%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right::after {\n width: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text {\n padding-right: 0;\n}\n.ant-divider-rtl {\n direction: rtl;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::before {\n width: 95%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::after {\n width: 5%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::before {\n width: 5%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::after {\n width: 95%;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-drawer {\n position: fixed;\n z-index: 1000;\n pointer-events: none;\n inset: 0;\n}\n.ant-drawer-inline {\n position: absolute;\n}\n.ant-drawer-mask {\n position: absolute;\n z-index: 1000;\n background: rgba(0, 0, 0, 0.45);\n pointer-events: auto;\n inset: 0;\n}\n.ant-drawer-content-wrapper {\n position: absolute;\n z-index: 1000;\n transition: transform 0.3s;\n}\n.ant-drawer-left .ant-drawer-content-wrapper {\n top: 0;\n bottom: 0;\n left: 0;\n}\n.ant-drawer-right .ant-drawer-content-wrapper {\n top: 0;\n right: 0;\n bottom: 0;\n}\n.ant-drawer-top .ant-drawer-content-wrapper {\n top: 0;\n right: 0;\n left: 0;\n}\n.ant-drawer-bottom .ant-drawer-content-wrapper {\n right: 0;\n bottom: 0;\n left: 0;\n}\n.ant-drawer-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n pointer-events: auto;\n}\n.ant-drawer-content-hidden {\n display: none;\n}\n.ant-drawer-left .ant-drawer-content {\n box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-right .ant-drawer-content {\n box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-top .ant-drawer-content {\n box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-bottom .ant-drawer-content {\n box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-wrapper-body {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: #fff;\n}\n.ant-drawer-header {\n display: flex;\n flex: 0;\n align-items: center;\n padding: 16px 24px;\n font-size: 16px;\n line-height: 22px;\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-drawer-header-title {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n min-height: 0;\n}\n.ant-drawer-extra {\n flex: 0;\n}\n.ant-drawer-close {\n display: inline-block;\n margin-right: 12px;\n color: rgba(0, 0, 0, 0.45);\n font-weight: 700;\n font-size: 16px;\n font-style: normal;\n line-height: 1;\n text-align: center;\n text-transform: none;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color 0.3s;\n text-rendering: auto;\n}\n.ant-drawer-close:focus,\n.ant-drawer-close:hover {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n}\n.ant-drawer-title {\n flex: 1;\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n}\n.ant-drawer-body {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 24px;\n overflow: auto;\n}\n.ant-drawer-footer {\n flex-shrink: 0;\n padding: 10px 16px;\n border-top: 1px solid #f0f0f0;\n}\n.panel-motion-enter-active,\n.panel-motion-appear-active,\n.panel-motion-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active,\n.ant-drawer-mask-motion-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter,\n.ant-drawer-mask-motion-appear {\n opacity: 0;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active {\n opacity: 1;\n}\n.ant-drawer-mask-motion-leave {\n opacity: 1;\n}\n.ant-drawer-mask-motion-leave-active {\n opacity: 0;\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active,\n.ant-drawer-panel-motion-left-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-left-enter,\n.ant-drawer-panel-motion-left-appear {\n transform: translateX(-100%);\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave-active {\n transform: translateX(-100%);\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active,\n.ant-drawer-panel-motion-right-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-right-enter,\n.ant-drawer-panel-motion-right-appear {\n transform: translateX(100%);\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave-active {\n transform: translateX(100%);\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active,\n.ant-drawer-panel-motion-top-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-top-enter,\n.ant-drawer-panel-motion-top-appear {\n transform: translateY(-100%);\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave-active {\n transform: translateY(-100%);\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active,\n.ant-drawer-panel-motion-bottom-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-bottom-enter,\n.ant-drawer-panel-motion-bottom-appear {\n transform: translateY(100%);\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave-active {\n transform: translateY(100%);\n}\n.ant-drawer-rtl {\n direction: rtl;\n}\n.ant-drawer-rtl .ant-drawer-close {\n margin-right: 0;\n margin-left: 12px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-form-item .ant-input-number + .ant-form-text {\n margin-left: 8px;\n}\n.ant-form-inline {\n display: flex;\n flex-wrap: wrap;\n}\n.ant-form-inline .ant-form-item {\n flex: none;\n flex-wrap: nowrap;\n margin-right: 16px;\n margin-bottom: 0;\n}\n.ant-form-inline .ant-form-item-with-help {\n margin-bottom: 24px;\n}\n.ant-form-inline .ant-form-item > .ant-form-item-label,\n.ant-form-inline .ant-form-item > .ant-form-item-control {\n display: inline-block;\n vertical-align: top;\n}\n.ant-form-inline .ant-form-item > .ant-form-item-label {\n flex: none;\n}\n.ant-form-inline .ant-form-item .ant-form-text {\n display: inline-block;\n}\n.ant-form-inline .ant-form-item .ant-form-item-has-feedback {\n display: inline-block;\n}\n.ant-form-horizontal .ant-form-item-label {\n flex-grow: 0;\n}\n.ant-form-horizontal .ant-form-item-control {\n flex: 1 1 0;\n min-width: 0;\n}\n.ant-form-horizontal .ant-form-item-label[class$='-24'] + .ant-form-item-control,\n.ant-form-horizontal .ant-form-item-label[class*='-24 '] + .ant-form-item-control {\n min-width: unset;\n}\n.ant-form-vertical .ant-form-item {\n flex-direction: column;\n}\n.ant-form-vertical .ant-form-item-label > label {\n height: auto;\n}\n.ant-form-vertical .ant-form-item .ant-form-item-control {\n width: 100%;\n}\n.ant-form-vertical .ant-form-item-label,\n.ant-col-24.ant-form-item-label,\n.ant-col-xl-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n}\n.ant-form-vertical .ant-form-item-label > label,\n.ant-col-24.ant-form-item-label > label,\n.ant-col-xl-24.ant-form-item-label > label {\n margin: 0;\n}\n.ant-form-vertical .ant-form-item-label > label::after,\n.ant-col-24.ant-form-item-label > label::after,\n.ant-col-xl-24.ant-form-item-label > label::after {\n display: none;\n}\n.ant-form-rtl.ant-form-vertical .ant-form-item-label,\n.ant-form-rtl.ant-col-24.ant-form-item-label,\n.ant-form-rtl.ant-col-xl-24.ant-form-item-label {\n text-align: right;\n}\n@media (max-width: 575px) {\n .ant-form-item .ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-form-item .ant-form-item-label > label {\n margin: 0;\n }\n .ant-form-item .ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-form-item .ant-form-item-label {\n text-align: right;\n }\n .ant-form .ant-form-item {\n flex-wrap: wrap;\n }\n .ant-form .ant-form-item .ant-form-item-label,\n .ant-form .ant-form-item .ant-form-item-control {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .ant-col-xs-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-col-xs-24.ant-form-item-label > label {\n margin: 0;\n }\n .ant-col-xs-24.ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-col-xs-24.ant-form-item-label {\n text-align: right;\n }\n}\n@media (max-width: 767px) {\n .ant-col-sm-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-col-sm-24.ant-form-item-label > label {\n margin: 0;\n }\n .ant-col-sm-24.ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-col-sm-24.ant-form-item-label {\n text-align: right;\n }\n}\n@media (max-width: 991px) {\n .ant-col-md-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-col-md-24.ant-form-item-label > label {\n margin: 0;\n }\n .ant-col-md-24.ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-col-md-24.ant-form-item-label {\n text-align: right;\n }\n}\n@media (max-width: 1199px) {\n .ant-col-lg-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-col-lg-24.ant-form-item-label > label {\n margin: 0;\n }\n .ant-col-lg-24.ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-col-lg-24.ant-form-item-label {\n text-align: right;\n }\n}\n@media (max-width: 1599px) {\n .ant-col-xl-24.ant-form-item-label {\n padding: 0 0 8px;\n line-height: 1.5715;\n white-space: initial;\n text-align: left;\n }\n .ant-col-xl-24.ant-form-item-label > label {\n margin: 0;\n }\n .ant-col-xl-24.ant-form-item-label > label::after {\n display: none;\n }\n .ant-form-rtl.ant-col-xl-24.ant-form-item-label {\n text-align: right;\n }\n}\n.ant-form-item {\n /* Some non-status related component style is in `components.less` */\n /* To support leave along ErrorList. We add additional className to handle explain style */\n}\n.ant-form-item-explain-error {\n color: #ff4d4f;\n}\n.ant-form-item-explain-warning {\n color: #faad14;\n}\n.ant-form-item-has-feedback .ant-switch {\n margin: 2px 0 4px;\n}\n.ant-form-item-has-warning .ant-form-item-split {\n color: #faad14;\n}\n.ant-form-item-has-error .ant-form-item-split {\n color: #ff4d4f;\n}\n.ant-form {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n}\n.ant-form legend {\n display: block;\n width: 100%;\n margin-bottom: 20px;\n padding: 0;\n color: rgba(0, 0, 0, 0.45);\n font-size: 16px;\n line-height: inherit;\n border: 0;\n border-bottom: 1px solid #d9d9d9;\n}\n.ant-form label {\n font-size: 14px;\n}\n.ant-form input[type='search'] {\n box-sizing: border-box;\n}\n.ant-form input[type='radio'],\n.ant-form input[type='checkbox'] {\n line-height: normal;\n}\n.ant-form input[type='file'] {\n display: block;\n}\n.ant-form input[type='range'] {\n display: block;\n width: 100%;\n}\n.ant-form select[multiple],\n.ant-form select[size] {\n height: auto;\n}\n.ant-form input[type='file']:focus,\n.ant-form input[type='radio']:focus,\n.ant-form input[type='checkbox']:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.ant-form output {\n display: block;\n padding-top: 15px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n}\n.ant-form .ant-form-text {\n display: inline-block;\n padding-right: 8px;\n}\n.ant-form-small .ant-form-item-label > label {\n height: 24px;\n}\n.ant-form-small .ant-form-item-control-input {\n min-height: 24px;\n}\n.ant-form-large .ant-form-item-label > label {\n height: 40px;\n}\n.ant-form-large .ant-form-item-control-input {\n min-height: 40px;\n}\n.ant-form-item {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n margin-bottom: 24px;\n vertical-align: top;\n}\n.ant-form-item-with-help {\n transition: none;\n}\n.ant-form-item-hidden,\n.ant-form-item-hidden.ant-row {\n display: none;\n}\n.ant-form-item-label {\n display: inline-block;\n flex-grow: 0;\n overflow: hidden;\n white-space: nowrap;\n text-align: right;\n vertical-align: middle;\n}\n.ant-form-item-label-left {\n text-align: left;\n}\n.ant-form-item-label-wrap {\n overflow: unset;\n line-height: 1.3215em;\n white-space: unset;\n}\n.ant-form-item-label > label {\n position: relative;\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 32px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-form-item-label > label > .anticon {\n font-size: 14px;\n vertical-align: top;\n}\n.ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {\n display: inline-block;\n margin-right: 4px;\n color: #ff4d4f;\n font-size: 14px;\n font-family: SimSun, sans-serif;\n line-height: 1;\n content: '*';\n}\n.ant-form-hide-required-mark .ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {\n display: none;\n}\n.ant-form-item-label > label .ant-form-item-optional {\n display: inline-block;\n margin-left: 4px;\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-form-hide-required-mark .ant-form-item-label > label .ant-form-item-optional {\n display: none;\n}\n.ant-form-item-label > label .ant-form-item-tooltip {\n color: rgba(0, 0, 0, 0.45);\n cursor: help;\n -ms-writing-mode: lr-tb;\n writing-mode: horizontal-tb;\n -webkit-margin-start: 4px;\n margin-inline-start: 4px;\n}\n.ant-form-item-label > label::after {\n content: ':';\n position: relative;\n top: -0.5px;\n margin: 0 8px 0 2px;\n}\n.ant-form-item-label > label.ant-form-item-no-colon::after {\n content: ' ';\n}\n.ant-form-item-control {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n}\n.ant-form-item-control:first-child:not([class^='ant-col-']):not([class*=' ant-col-']) {\n width: 100%;\n}\n.ant-form-item-control-input {\n position: relative;\n display: flex;\n align-items: center;\n min-height: 32px;\n}\n.ant-form-item-control-input-content {\n flex: auto;\n max-width: 100%;\n}\n.ant-form-item-explain,\n.ant-form-item-extra {\n clear: both;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.5715;\n transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.ant-form-item-explain-connected {\n width: 100%;\n}\n.ant-form-item-extra {\n min-height: 24px;\n}\n.ant-form-item-with-help .ant-form-item-explain {\n height: auto;\n opacity: 1;\n}\n.ant-form-item-feedback-icon {\n font-size: 14px;\n text-align: center;\n visibility: visible;\n -webkit-animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n pointer-events: none;\n}\n.ant-form-item-feedback-icon-success {\n color: #52c41a;\n}\n.ant-form-item-feedback-icon-error {\n color: #ff4d4f;\n}\n.ant-form-item-feedback-icon-warning {\n color: #faad14;\n}\n.ant-form-item-feedback-icon-validating {\n color: #1890ff;\n}\n.ant-show-help {\n transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-show-help-appear,\n.ant-show-help-enter {\n opacity: 0;\n}\n.ant-show-help-appear-active,\n.ant-show-help-enter-active {\n opacity: 1;\n}\n.ant-show-help-leave {\n opacity: 1;\n}\n.ant-show-help-leave-active {\n opacity: 0;\n}\n.ant-show-help-item {\n overflow: hidden;\n transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-show-help-item-appear,\n.ant-show-help-item-enter {\n transform: translateY(-5px);\n opacity: 0;\n}\n.ant-show-help-item-appear-active,\n.ant-show-help-item-enter-active {\n transform: translateY(0);\n opacity: 1;\n}\n.ant-show-help-item-leave {\n transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-show-help-item-leave-active {\n transform: translateY(-5px);\n}\n@-webkit-keyframes diffZoomIn1 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes diffZoomIn1 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@-webkit-keyframes diffZoomIn2 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes diffZoomIn2 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@-webkit-keyframes diffZoomIn3 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes diffZoomIn3 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.ant-form-rtl {\n direction: rtl;\n}\n.ant-form-rtl .ant-form-item-label {\n text-align: left;\n}\n.ant-form-rtl .ant-form-item-label > label.ant-form-item-required::before {\n margin-right: 0;\n margin-left: 4px;\n}\n.ant-form-rtl .ant-form-item-label > label::after {\n margin: 0 2px 0 8px;\n}\n.ant-form-rtl .ant-form-item-label > label .ant-form-item-optional {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-col-rtl .ant-form-item-control:first-child {\n width: 100%;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input {\n padding-right: 11px;\n padding-left: 24px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix {\n padding-right: 11px;\n padding-left: 18px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input {\n padding: 0;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number {\n padding: 0;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix {\n right: auto;\n left: 28px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-number {\n padding-left: 18px;\n}\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-clear,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-clear,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-clear {\n right: auto;\n left: 32px;\n}\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-selection-selected-value,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-selection-selected-value {\n padding-right: 0;\n padding-left: 42px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow {\n margin-right: 0;\n margin-left: 19px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear {\n right: auto;\n left: 32px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker {\n padding-right: 11px;\n padding-left: 29.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large {\n padding-right: 11px;\n padding-left: 29.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small {\n padding-right: 7px;\n padding-left: 25.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon {\n right: auto;\n left: 0;\n}\n.ant-form-rtl.ant-form-inline .ant-form-item {\n margin-right: 0;\n margin-left: 16px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-image {\n position: relative;\n display: inline-block;\n}\n.ant-image-img {\n width: 100%;\n height: auto;\n vertical-align: middle;\n}\n.ant-image-img-placeholder {\n background-color: #f5f5f5;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=');\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 30%;\n}\n.ant-image-mask {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.3s;\n}\n.ant-image-mask-info {\n padding: 0 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-image-mask-info .anticon {\n -webkit-margin-end: 4px;\n margin-inline-end: 4px;\n}\n.ant-image-mask:hover {\n opacity: 1;\n}\n.ant-image-placeholder {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.ant-image-preview {\n pointer-events: none;\n height: 100%;\n text-align: center;\n}\n.ant-image-preview.ant-zoom-enter,\n.ant-image-preview.ant-zoom-appear {\n transform: none;\n opacity: 0;\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-image-preview-mask {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1000;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-image-preview-mask-hidden {\n display: none;\n}\n.ant-image-preview-wrap {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n outline: 0;\n}\n.ant-image-preview-body {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: hidden;\n}\n.ant-image-preview-img {\n max-width: 100%;\n max-height: 100%;\n vertical-align: middle;\n transform: scale3d(1, 1, 1);\n cursor: -webkit-grab;\n cursor: grab;\n transition: transform 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n pointer-events: auto;\n}\n.ant-image-preview-img-wrapper {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n transition: transform 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;\n}\n.ant-image-preview-img-wrapper::before {\n display: inline-block;\n width: 1px;\n height: 50%;\n margin-right: -1px;\n content: '';\n}\n.ant-image-preview-moving .ant-image-preview-img {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n}\n.ant-image-preview-moving .ant-image-preview-img-wrapper {\n transition-duration: 0s;\n}\n.ant-image-preview-wrap {\n z-index: 1080;\n}\n.ant-image-preview-operations {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n font-feature-settings: 'tnum';\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: flex;\n flex-direction: row-reverse;\n align-items: center;\n width: 100%;\n color: rgba(255, 255, 255, 0.85);\n list-style: none;\n background: rgba(0, 0, 0, 0.1);\n pointer-events: auto;\n}\n.ant-image-preview-operations-operation {\n margin-left: 12px;\n padding: 12px;\n cursor: pointer;\n}\n.ant-image-preview-operations-operation-disabled {\n color: rgba(255, 255, 255, 0.25);\n pointer-events: none;\n}\n.ant-image-preview-operations-operation:last-of-type {\n margin-left: 0;\n}\n.ant-image-preview-operations-progress {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n}\n.ant-image-preview-operations-icon {\n font-size: 18px;\n}\n.ant-image-preview-switch-left,\n.ant-image-preview-switch-right {\n position: absolute;\n top: 50%;\n right: 10px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n margin-top: -22px;\n color: rgba(255, 255, 255, 0.85);\n background: rgba(0, 0, 0, 0.1);\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n}\n.ant-image-preview-switch-left-disabled,\n.ant-image-preview-switch-right-disabled {\n color: rgba(255, 255, 255, 0.25);\n cursor: not-allowed;\n}\n.ant-image-preview-switch-left-disabled > .anticon,\n.ant-image-preview-switch-right-disabled > .anticon {\n cursor: not-allowed;\n}\n.ant-image-preview-switch-left > .anticon,\n.ant-image-preview-switch-right > .anticon {\n font-size: 18px;\n}\n.ant-image-preview-switch-left {\n left: 10px;\n}\n.ant-image-preview-switch-right {\n right: 10px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-input-number-affix-wrapper {\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n position: relative;\n display: inline-flex;\n width: 90px;\n padding: 0;\n -webkit-padding-start: 11px;\n padding-inline-start: 11px;\n}\n.ant-input-number-affix-wrapper::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-input-number-affix-wrapper:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number-affix-wrapper::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number-affix-wrapper:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number-affix-wrapper:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-input-number-affix-wrapper:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number-affix-wrapper:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-affix-wrapper-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-number-affix-wrapper-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-number-affix-wrapper[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-number-affix-wrapper[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-number-affix-wrapper-borderless,\n.ant-input-number-affix-wrapper-borderless:hover,\n.ant-input-number-affix-wrapper-borderless:focus,\n.ant-input-number-affix-wrapper-borderless-focused,\n.ant-input-number-affix-wrapper-borderless-disabled,\n.ant-input-number-affix-wrapper-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-input-number-affix-wrapper {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-input-number-affix-wrapper-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-number-affix-wrapper-sm {\n padding: 0px 7px;\n}\n.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n z-index: 1;\n}\n.ant-input-number-affix-wrapper-focused,\n.ant-input-number-affix-wrapper:focus {\n z-index: 1;\n}\n.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled] {\n background: transparent;\n}\n.ant-input-number-affix-wrapper > div.ant-input-number {\n width: 100%;\n border: none;\n outline: none;\n}\n.ant-input-number-affix-wrapper > div.ant-input-number.ant-input-number-focused {\n box-shadow: none !important;\n}\n.ant-input-number-affix-wrapper input.ant-input-number-input {\n padding: 0;\n}\n.ant-input-number-affix-wrapper::before {\n width: 0;\n visibility: hidden;\n content: '\\a0';\n}\n.ant-input-number-affix-wrapper .ant-input-number-handler-wrap {\n z-index: 2;\n}\n.ant-input-number-prefix,\n.ant-input-number-suffix {\n display: flex;\n flex: none;\n align-items: center;\n pointer-events: none;\n}\n.ant-input-number-prefix {\n -webkit-margin-end: 4px;\n margin-inline-end: 4px;\n}\n.ant-input-number-suffix {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n height: 100%;\n margin-right: 11px;\n margin-left: 4px;\n}\n.ant-input-number-group-wrapper .ant-input-number-affix-wrapper {\n width: 100%;\n}\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover {\n background: #fff;\n border-color: #ff4d4f;\n}\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-status-error .ant-input-number-prefix {\n color: #ff4d4f;\n}\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover {\n background: #fff;\n border-color: #faad14;\n}\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-status-warning .ant-input-number-prefix {\n color: #faad14;\n}\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover {\n background: #fff;\n border-color: #ff4d4f;\n}\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix {\n color: #ff4d4f;\n}\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover {\n background: #fff;\n border-color: #faad14;\n}\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix {\n color: #faad14;\n}\n.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon {\n color: #ff4d4f;\n border-color: #ff4d4f;\n}\n.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon {\n color: #faad14;\n border-color: #faad14;\n}\n.ant-input-number {\n box-sizing: border-box;\n font-variant: tabular-nums;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n transition: all 0.3s;\n display: inline-block;\n width: 90px;\n margin: 0;\n padding: 0;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n}\n.ant-input-number::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-input-number:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-input-number:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-input-number:focus,\n.ant-input-number-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-number-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-number[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-number[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-number-borderless,\n.ant-input-number-borderless:hover,\n.ant-input-number-borderless:focus,\n.ant-input-number-borderless-focused,\n.ant-input-number-borderless-disabled,\n.ant-input-number-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-input-number {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-input-number-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-number-sm {\n padding: 0px 7px;\n}\n.ant-input-number-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: table;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n}\n.ant-input-number-group[class*='col-'] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.ant-input-number-group > [class*='col-'] {\n padding-right: 8px;\n}\n.ant-input-number-group > [class*='col-']:last-child {\n padding-right: 0;\n}\n.ant-input-number-group-addon,\n.ant-input-number-group-wrap,\n.ant-input-number-group > .ant-input-number {\n display: table-cell;\n}\n.ant-input-number-group-addon:not(:first-child):not(:last-child),\n.ant-input-number-group-wrap:not(:first-child):not(:last-child),\n.ant-input-number-group > .ant-input-number:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.ant-input-number-group-addon,\n.ant-input-number-group-wrap {\n width: 1px;\n white-space: nowrap;\n vertical-align: middle;\n}\n.ant-input-number-group-wrap > * {\n display: block !important;\n}\n.ant-input-number-group .ant-input-number {\n float: left;\n width: 100%;\n margin-bottom: 0;\n text-align: inherit;\n}\n.ant-input-number-group .ant-input-number:focus {\n z-index: 1;\n border-right-width: 1px;\n}\n.ant-input-number-group .ant-input-number:hover {\n z-index: 1;\n border-right-width: 1px;\n}\n.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover {\n z-index: 0;\n}\n.ant-input-number-group-addon {\n position: relative;\n padding: 0 11px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n text-align: center;\n background-color: #fafafa;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n}\n.ant-input-number-group-addon .ant-select {\n margin: -5px -11px;\n}\n.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n background-color: inherit;\n border: 1px solid transparent;\n box-shadow: none;\n}\n.ant-input-number-group-addon .ant-select-open .ant-select-selector,\n.ant-input-number-group-addon .ant-select-focused .ant-select-selector {\n color: #1890ff;\n}\n.ant-input-number-group-addon .ant-cascader-picker {\n margin: -9px -12px;\n background-color: transparent;\n}\n.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input {\n text-align: left;\n border: 0;\n box-shadow: none;\n}\n.ant-input-number-group > .ant-input-number:first-child,\n.ant-input-number-group-addon:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-number-group > .ant-input-number:first-child .ant-select .ant-select-selector,\n.ant-input-number-group-addon:first-child .ant-select .ant-select-selector {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-number-group > .ant-input-number-affix-wrapper:not(:first-child) .ant-input-number {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-number-group > .ant-input-number-affix-wrapper:not(:last-child) .ant-input-number {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-number-group-addon:first-child {\n border-right: 0;\n}\n.ant-input-number-group-addon:last-child {\n border-left: 0;\n}\n.ant-input-number-group > .ant-input-number:last-child,\n.ant-input-number-group-addon:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-number-group > .ant-input-number:last-child .ant-select .ant-select-selector,\n.ant-input-number-group-addon:last-child .ant-select .ant-select-selector {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-number-group-lg .ant-input-number,\n.ant-input-number-group-lg > .ant-input-number-group-addon {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-number-group-sm .ant-input-number,\n.ant-input-number-group-sm > .ant-input-number-group-addon {\n padding: 0px 7px;\n}\n.ant-input-number-group-lg .ant-select-single .ant-select-selector {\n height: 40px;\n}\n.ant-input-number-group-sm .ant-select-single .ant-select-selector {\n height: 24px;\n}\n.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child) {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),\n.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact {\n display: block;\n}\n.ant-input-number-group.ant-input-number-group-compact::before {\n display: table;\n content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child) {\n border-right-width: 1px;\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child):hover {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child):focus {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > * {\n display: inline-block;\n float: none;\n vertical-align: top;\n border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number-affix-wrapper {\n display: inline-flex;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-picker-range {\n display: inline-flex;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:not(:last-child) {\n margin-right: -1px;\n border-right-width: 1px;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-number {\n float: none;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input {\n border-right-width: 1px;\n border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input:hover {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input:focus {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-focused {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-arrow {\n z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:first-child,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:first-child .ant-input {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:last-child,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n border-right-width: 1px;\n border-top-right-radius: 2px;\n border-bottom-right-radius: 2px;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input {\n vertical-align: top;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper {\n margin-left: -1px;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper .ant-input-affix-wrapper {\n border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input-group-addon > .ant-input-search-button {\n border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group > .ant-input-number-rtl:first-child {\n border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group > .ant-input-number-rtl:last-child {\n border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:first-child {\n border-right: 1px solid #d9d9d9;\n border-left: 0;\n border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:last-child {\n border-right: 0;\n border-left: 1px solid #d9d9d9;\n border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-wrapper {\n display: inline-block;\n text-align: start;\n vertical-align: top;\n}\n.ant-input-number-handler {\n position: relative;\n display: block;\n width: 100%;\n height: 50%;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.45);\n font-weight: bold;\n line-height: 0;\n text-align: center;\n border-left: 1px solid #d9d9d9;\n transition: all 0.1s linear;\n}\n.ant-input-number-handler:active {\n background: #f4f4f4;\n}\n.ant-input-number-handler:hover .ant-input-number-handler-up-inner,\n.ant-input-number-handler:hover .ant-input-number-handler-down-inner {\n color: #40a9ff;\n}\n.ant-input-number-handler-up-inner,\n.ant-input-number-handler-down-inner {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n position: absolute;\n right: 4px;\n width: 12px;\n height: 12px;\n color: rgba(0, 0, 0, 0.45);\n line-height: 12px;\n transition: all 0.1s linear;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number-handler-up-inner > *,\n.ant-input-number-handler-down-inner > * {\n line-height: 1;\n}\n.ant-input-number-handler-up-inner svg,\n.ant-input-number-handler-down-inner svg {\n display: inline-block;\n}\n.ant-input-number-handler-up-inner::before,\n.ant-input-number-handler-down-inner::before {\n display: none;\n}\n.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon,\n.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,\n.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,\n.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon {\n display: block;\n}\n.ant-input-number:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-input-number:hover + .ant-form-item-children-icon {\n opacity: 0;\n transition: opacity 0.24s linear 0.24s;\n}\n.ant-input-number-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-number-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-number-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-number-disabled .ant-input-number-input {\n cursor: not-allowed;\n}\n.ant-input-number-disabled .ant-input-number-handler-wrap {\n display: none;\n}\n.ant-input-number-readonly .ant-input-number-handler-wrap {\n display: none;\n}\n.ant-input-number-input {\n width: 100%;\n height: 30px;\n padding: 0 11px;\n text-align: left;\n background-color: transparent;\n border: 0;\n border-radius: 2px;\n outline: 0;\n transition: all 0.3s linear;\n -webkit-appearance: textfield !important;\n -moz-appearance: textfield !important;\n appearance: textfield !important;\n}\n.ant-input-number-input::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-input-number-input:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number-input::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-number-input:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number-input:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-input-number-input:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-number-input[type='number']::-webkit-inner-spin-button,\n.ant-input-number-input[type='number']::-webkit-outer-spin-button {\n margin: 0;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-appearance: none;\n appearance: none;\n}\n.ant-input-number-lg {\n padding: 0;\n font-size: 16px;\n}\n.ant-input-number-lg input {\n height: 38px;\n}\n.ant-input-number-sm {\n padding: 0;\n}\n.ant-input-number-sm input {\n height: 22px;\n padding: 0 7px;\n}\n.ant-input-number-handler-wrap {\n position: absolute;\n top: 0;\n right: 0;\n width: 22px;\n height: 100%;\n background: #fff;\n border-radius: 0 2px 2px 0;\n opacity: 0;\n transition: opacity 0.24s linear 0.1s;\n}\n.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner,\n.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: auto;\n margin-right: 0;\n font-size: 7px;\n}\n.ant-input-number-borderless .ant-input-number-handler-wrap {\n border-left-width: 0;\n}\n.ant-input-number-handler-wrap:hover .ant-input-number-handler {\n height: 40%;\n}\n.ant-input-number:hover .ant-input-number-handler-wrap,\n.ant-input-number-focused .ant-input-number-handler-wrap {\n opacity: 1;\n}\n.ant-input-number-handler-up {\n border-top-right-radius: 2px;\n cursor: pointer;\n}\n.ant-input-number-handler-up-inner {\n top: 50%;\n margin-top: -5px;\n text-align: center;\n}\n.ant-input-number-handler-up:hover {\n height: 60% !important;\n}\n.ant-input-number-handler-down {\n top: 0;\n border-top: 1px solid #d9d9d9;\n border-bottom-right-radius: 2px;\n cursor: pointer;\n}\n.ant-input-number-handler-down-inner {\n top: 50%;\n text-align: center;\n transform: translateY(-50%);\n}\n.ant-input-number-handler-down:hover {\n height: 60% !important;\n}\n.ant-input-number-borderless .ant-input-number-handler-down {\n border-top-width: 0;\n}\n.ant-input-number-handler-up-disabled,\n.ant-input-number-handler-down-disabled {\n cursor: not-allowed;\n}\n.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,\n.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-input-number-borderless {\n box-shadow: none;\n}\n.ant-input-number-out-of-range input {\n color: #ff4d4f;\n}\n.ant-input-number-rtl {\n direction: rtl;\n}\n.ant-input-number-rtl .ant-input-number-handler {\n border-right: 1px solid #d9d9d9;\n border-left: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-wrap {\n right: auto;\n left: 0;\n}\n.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap {\n border-right-width: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-up {\n border-top-right-radius: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-down {\n border-bottom-right-radius: 0;\n}\n.ant-input-number-rtl .ant-input-number-input {\n direction: ltr;\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-input-affix-wrapper {\n position: relative;\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n display: inline-flex;\n}\n.ant-input-affix-wrapper::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-input-affix-wrapper:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-affix-wrapper::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input-affix-wrapper:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-affix-wrapper:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-input-affix-wrapper:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input-affix-wrapper:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-input-rtl .ant-input-affix-wrapper:hover {\n border-right-width: 0;\n border-left-width: 1px !important;\n}\n.ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-rtl .ant-input-affix-wrapper:focus,\n.ant-input-rtl .ant-input-affix-wrapper-focused {\n border-right-width: 0;\n border-left-width: 1px !important;\n}\n.ant-input-affix-wrapper-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-affix-wrapper-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-affix-wrapper[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-affix-wrapper[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-affix-wrapper-borderless,\n.ant-input-affix-wrapper-borderless:hover,\n.ant-input-affix-wrapper-borderless:focus,\n.ant-input-affix-wrapper-borderless-focused,\n.ant-input-affix-wrapper-borderless-disabled,\n.ant-input-affix-wrapper-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-input-affix-wrapper {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-input-affix-wrapper-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-affix-wrapper-sm {\n padding: 0px 7px;\n}\n.ant-input-affix-wrapper-rtl {\n direction: rtl;\n}\n.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n z-index: 1;\n}\n.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n border-right-width: 0;\n border-left-width: 1px !important;\n}\n.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n z-index: 0;\n}\n.ant-input-affix-wrapper-focused,\n.ant-input-affix-wrapper:focus {\n z-index: 1;\n}\n.ant-input-affix-wrapper-disabled .ant-input[disabled] {\n background: transparent;\n}\n.ant-input-affix-wrapper > input.ant-input {\n padding: 0;\n border: none;\n outline: none;\n}\n.ant-input-affix-wrapper > input.ant-input:focus {\n box-shadow: none !important;\n}\n.ant-input-affix-wrapper::before {\n width: 0;\n visibility: hidden;\n content: '\\a0';\n}\n.ant-input-prefix,\n.ant-input-suffix {\n display: flex;\n flex: none;\n align-items: center;\n}\n.ant-input-prefix > *:not(:last-child),\n.ant-input-suffix > *:not(:last-child) {\n margin-right: 8px;\n}\n.ant-input-show-count-suffix {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-input-show-count-has-suffix {\n margin-right: 2px;\n}\n.ant-input-prefix {\n margin-right: 4px;\n}\n.ant-input-suffix {\n margin-left: 4px;\n}\n.anticon.ant-input-clear-icon,\n.ant-input-clear-icon {\n margin: 0;\n color: rgba(0, 0, 0, 0.25);\n font-size: 12px;\n vertical-align: -1px;\n cursor: pointer;\n transition: color 0.3s;\n}\n.anticon.ant-input-clear-icon:hover,\n.ant-input-clear-icon:hover {\n color: rgba(0, 0, 0, 0.45);\n}\n.anticon.ant-input-clear-icon:active,\n.ant-input-clear-icon:active {\n color: rgba(0, 0, 0, 0.85);\n}\n.anticon.ant-input-clear-icon-hidden,\n.ant-input-clear-icon-hidden {\n visibility: hidden;\n}\n.anticon.ant-input-clear-icon-has-suffix,\n.ant-input-clear-icon-has-suffix {\n margin: 0 4px;\n}\n.ant-input-affix-wrapper-textarea-with-clear-btn {\n padding: 0 !important;\n border: 0 !important;\n}\n.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 1;\n}\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover {\n background: #fff;\n border-color: #ff4d4f;\n}\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-status-error .ant-input-prefix {\n color: #ff4d4f;\n}\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover {\n background: #fff;\n border-color: #faad14;\n}\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-status-warning .ant-input-prefix {\n color: #faad14;\n}\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover {\n background: #fff;\n border-color: #ff4d4f;\n}\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-affix-wrapper-status-error .ant-input-prefix {\n color: #ff4d4f;\n}\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover {\n background: #fff;\n border-color: #faad14;\n}\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-affix-wrapper-status-warning .ant-input-prefix {\n color: #faad14;\n}\n.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input {\n padding-right: 24px;\n}\n.ant-input-group-wrapper-status-error .ant-input-group-addon {\n color: #ff4d4f;\n border-color: #ff4d4f;\n}\n.ant-input-group-wrapper-status-warning .ant-input-group-addon {\n color: #faad14;\n border-color: #faad14;\n}\n.ant-input {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n font-variant: tabular-nums;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n}\n.ant-input::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-input:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-input:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-input:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-input:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-input-rtl .ant-input:hover {\n border-right-width: 0;\n border-left-width: 1px !important;\n}\n.ant-input:focus,\n.ant-input-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-input-rtl .ant-input:focus,\n.ant-input-rtl .ant-input-focused {\n border-right-width: 0;\n border-left-width: 1px !important;\n}\n.ant-input-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-input[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-input-borderless,\n.ant-input-borderless:hover,\n.ant-input-borderless:focus,\n.ant-input-borderless-focused,\n.ant-input-borderless-disabled,\n.ant-input-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-input {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-input-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-sm {\n padding: 0px 7px;\n}\n.ant-input-rtl {\n direction: rtl;\n}\n.ant-input-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: table;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n}\n.ant-input-group[class*='col-'] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.ant-input-group > [class*='col-'] {\n padding-right: 8px;\n}\n.ant-input-group > [class*='col-']:last-child {\n padding-right: 0;\n}\n.ant-input-group-addon,\n.ant-input-group-wrap,\n.ant-input-group > .ant-input {\n display: table-cell;\n}\n.ant-input-group-addon:not(:first-child):not(:last-child),\n.ant-input-group-wrap:not(:first-child):not(:last-child),\n.ant-input-group > .ant-input:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.ant-input-group-addon,\n.ant-input-group-wrap {\n width: 1px;\n white-space: nowrap;\n vertical-align: middle;\n}\n.ant-input-group-wrap > * {\n display: block !important;\n}\n.ant-input-group .ant-input {\n float: left;\n width: 100%;\n margin-bottom: 0;\n text-align: inherit;\n}\n.ant-input-group .ant-input:focus {\n z-index: 1;\n border-right-width: 1px;\n}\n.ant-input-group .ant-input:hover {\n z-index: 1;\n border-right-width: 1px;\n}\n.ant-input-search-with-button .ant-input-group .ant-input:hover {\n z-index: 0;\n}\n.ant-input-group-addon {\n position: relative;\n padding: 0 11px;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n font-size: 14px;\n text-align: center;\n background-color: #fafafa;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n}\n.ant-input-group-addon .ant-select {\n margin: -5px -11px;\n}\n.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n background-color: inherit;\n border: 1px solid transparent;\n box-shadow: none;\n}\n.ant-input-group-addon .ant-select-open .ant-select-selector,\n.ant-input-group-addon .ant-select-focused .ant-select-selector {\n color: #1890ff;\n}\n.ant-input-group-addon .ant-cascader-picker {\n margin: -9px -12px;\n background-color: transparent;\n}\n.ant-input-group-addon .ant-cascader-picker .ant-cascader-input {\n text-align: left;\n border: 0;\n box-shadow: none;\n}\n.ant-input-group > .ant-input:first-child,\n.ant-input-group-addon:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-group > .ant-input:first-child .ant-select .ant-select-selector,\n.ant-input-group-addon:first-child .ant-select .ant-select-selector {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-group-addon:first-child {\n border-right: 0;\n}\n.ant-input-group-addon:last-child {\n border-left: 0;\n}\n.ant-input-group > .ant-input:last-child,\n.ant-input-group-addon:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-group > .ant-input:last-child .ant-select .ant-select-selector,\n.ant-input-group-addon:last-child .ant-select .ant-select-selector {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-group-lg .ant-input,\n.ant-input-group-lg > .ant-input-group-addon {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-input-group-sm .ant-input,\n.ant-input-group-sm > .ant-input-group-addon {\n padding: 0px 7px;\n}\n.ant-input-group-lg .ant-select-single .ant-select-selector {\n height: 40px;\n}\n.ant-input-group-sm .ant-select-single .ant-select-selector {\n height: 24px;\n}\n.ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-input-group .ant-input-affix-wrapper:not(:first-child),\n.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ant-input-group.ant-input-group-compact {\n display: block;\n}\n.ant-input-group.ant-input-group-compact::before {\n display: table;\n content: '';\n}\n.ant-input-group.ant-input-group-compact::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) {\n border-right-width: 1px;\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > * {\n display: inline-block;\n float: none;\n vertical-align: top;\n border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact > .ant-input-affix-wrapper {\n display: inline-flex;\n}\n.ant-input-group.ant-input-group-compact > .ant-picker-range {\n display: inline-flex;\n}\n.ant-input-group.ant-input-group-compact > *:not(:last-child) {\n margin-right: -1px;\n border-right-width: 1px;\n}\n.ant-input-group.ant-input-group-compact .ant-input {\n float: none;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input {\n border-right-width: 1px;\n border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:hover,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:hover {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:focus,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:focus {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select-focused {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-arrow {\n z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > *:first-child,\n.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input {\n border-top-left-radius: 2px;\n border-bottom-left-radius: 2px;\n}\n.ant-input-group.ant-input-group-compact > *:last-child,\n.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n border-right-width: 1px;\n border-top-right-radius: 2px;\n border-bottom-right-radius: 2px;\n}\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input {\n vertical-align: top;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper {\n margin-left: -1px;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper .ant-input-affix-wrapper {\n border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input-group-addon > .ant-input-search-button {\n border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n border-radius: 2px 0 0 2px;\n}\n.ant-input-group > .ant-input-rtl:first-child,\n.ant-input-group-rtl .ant-input-group-addon:first-child {\n border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl .ant-input-group-addon:first-child {\n border-right: 1px solid #d9d9d9;\n border-left: 0;\n}\n.ant-input-group-rtl .ant-input-group-addon:last-child {\n border-right: 0;\n border-left: 1px solid #d9d9d9;\n border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group > .ant-input:last-child,\n.ant-input-group-rtl.ant-input-group-addon:last-child {\n border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child) {\n border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:not(:last-child) {\n margin-right: 0;\n margin-left: -1px;\n border-left-width: 1px;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:first-child,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input {\n border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:last-child,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n border-left-width: 1px;\n border-radius: 2px 0 0 2px;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl + .ant-input-group-wrapper-rtl {\n margin-right: -1px;\n margin-left: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n border-radius: 0 2px 2px 0;\n}\n.ant-input-group-wrapper {\n display: inline-block;\n width: 100%;\n text-align: start;\n vertical-align: top;\n}\n.ant-input-password-icon.anticon {\n color: rgba(0, 0, 0, 0.45);\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-input-password-icon.anticon:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-input[type='color'] {\n height: 32px;\n}\n.ant-input[type='color'].ant-input-lg {\n height: 40px;\n}\n.ant-input[type='color'].ant-input-sm {\n height: 24px;\n padding-top: 3px;\n padding-bottom: 3px;\n}\n.ant-input-textarea-show-count > .ant-input {\n height: 100%;\n}\n.ant-input-textarea-show-count::after {\n float: right;\n color: rgba(0, 0, 0, 0.45);\n white-space: nowrap;\n content: attr(data-count);\n pointer-events: none;\n}\n.ant-input-textarea-show-count.ant-input-textarea-in-form-item::after {\n margin-bottom: -22px;\n}\n.ant-input-textarea-suffix {\n position: absolute;\n top: 0;\n right: 11px;\n bottom: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: auto;\n}\n.ant-input-search .ant-input:hover,\n.ant-input-search .ant-input:focus {\n border-color: #40a9ff;\n}\n.ant-input-search .ant-input:hover + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),\n.ant-input-search .ant-input:focus + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary) {\n border-left-color: #40a9ff;\n}\n.ant-input-search .ant-input-affix-wrapper {\n border-radius: 0;\n}\n.ant-input-search .ant-input-lg {\n line-height: 1.5713;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child {\n left: -1px;\n padding: 0;\n border: 0;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button {\n padding-top: 0;\n padding-bottom: 0;\n border-radius: 0 2px 2px 0;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary) {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading::before {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.ant-input-search-button {\n height: 32px;\n}\n.ant-input-search-button:hover,\n.ant-input-search-button:focus {\n z-index: 1;\n}\n.ant-input-search-large .ant-input-search-button {\n height: 40px;\n}\n.ant-input-search-small .ant-input-search-button {\n height: 24px;\n}\n.ant-input-group-wrapper-rtl {\n direction: rtl;\n}\n.ant-input-group-rtl {\n direction: rtl;\n}\n.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl > input.ant-input {\n border: none;\n outline: none;\n}\n.ant-input-affix-wrapper-rtl .ant-input-prefix {\n margin: 0 0 0 4px;\n}\n.ant-input-affix-wrapper-rtl .ant-input-suffix {\n margin: 0 4px 0 0;\n}\n.ant-input-textarea-rtl {\n direction: rtl;\n}\n.ant-input-textarea-rtl.ant-input-textarea-show-count::after {\n text-align: left;\n}\n.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix {\n margin-right: 0;\n margin-left: 4px;\n}\n.ant-input-affix-wrapper-rtl .ant-input-clear-icon {\n right: auto;\n left: 8px;\n}\n.ant-input-search-rtl {\n direction: rtl;\n}\n.ant-input-search-rtl .ant-input:hover + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),\n.ant-input-search-rtl .ant-input:focus + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary) {\n border-right-color: #40a9ff;\n border-left-color: #d9d9d9;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-affix-wrapper:hover,\n.ant-input-search-rtl > .ant-input-group > .ant-input-affix-wrapper-focused {\n border-right-color: #40a9ff;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-group-addon {\n right: -1px;\n left: auto;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-group-addon .ant-input-search-button {\n border-radius: 2px 0 0 2px;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .ant-input {\n height: 32px;\n }\n .ant-input-lg {\n height: 40px;\n }\n .ant-input-sm {\n height: 24px;\n }\n .ant-input-affix-wrapper > input.ant-input {\n height: auto;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-layout {\n display: flex;\n flex: auto;\n flex-direction: column;\n /* fix firefox can't set height smaller than content on flex item */\n min-height: 0;\n background: #f0f2f5;\n}\n.ant-layout,\n.ant-layout * {\n box-sizing: border-box;\n}\n.ant-layout.ant-layout-has-sider {\n flex-direction: row;\n}\n.ant-layout.ant-layout-has-sider > .ant-layout,\n.ant-layout.ant-layout-has-sider > .ant-layout-content {\n width: 0;\n}\n.ant-layout-header,\n.ant-layout-footer {\n flex: 0 0 auto;\n}\n.ant-layout-header {\n height: 64px;\n padding: 0 50px;\n color: rgba(0, 0, 0, 0.85);\n line-height: 64px;\n background: #001529;\n}\n.ant-layout-footer {\n padding: 24px 50px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n background: #f0f2f5;\n}\n.ant-layout-content {\n flex: auto;\n /* fix firefox can't set height smaller than content on flex item */\n min-height: 0;\n}\n.ant-layout-sider {\n position: relative;\n /* fix firefox can't set width smaller than content on flex item */\n min-width: 0;\n background: #001529;\n transition: all 0.2s;\n}\n.ant-layout-sider-children {\n height: 100%;\n margin-top: -0.1px;\n padding-top: 0.1px;\n}\n.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed {\n width: auto;\n}\n.ant-layout-sider-has-trigger {\n padding-bottom: 48px;\n}\n.ant-layout-sider-right {\n order: 1;\n}\n.ant-layout-sider-trigger {\n position: fixed;\n bottom: 0;\n z-index: 1;\n height: 48px;\n color: #fff;\n line-height: 48px;\n text-align: center;\n background: #002140;\n cursor: pointer;\n transition: all 0.2s;\n}\n.ant-layout-sider-zero-width > * {\n overflow: hidden;\n}\n.ant-layout-sider-zero-width-trigger {\n position: absolute;\n top: 64px;\n right: -36px;\n z-index: 1;\n width: 36px;\n height: 42px;\n color: #fff;\n font-size: 18px;\n line-height: 42px;\n text-align: center;\n background: #001529;\n border-radius: 0 2px 2px 0;\n cursor: pointer;\n transition: background 0.3s ease;\n}\n.ant-layout-sider-zero-width-trigger::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n transition: all 0.3s;\n content: '';\n}\n.ant-layout-sider-zero-width-trigger:hover::after {\n background: rgba(255, 255, 255, 0.1);\n}\n.ant-layout-sider-zero-width-trigger-right {\n left: -36px;\n border-radius: 2px 0 0 2px;\n}\n.ant-layout-sider-light {\n background: #fff;\n}\n.ant-layout-sider-light .ant-layout-sider-trigger {\n color: rgba(0, 0, 0, 0.85);\n background: #fff;\n}\n.ant-layout-sider-light .ant-layout-sider-zero-width-trigger {\n color: rgba(0, 0, 0, 0.85);\n background: #fff;\n}\n.ant-layout-rtl {\n direction: rtl;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-list {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n}\n.ant-list * {\n outline: none;\n}\n.ant-list-pagination {\n margin-top: 24px;\n text-align: right;\n}\n.ant-list-pagination .ant-pagination-options {\n text-align: left;\n}\n.ant-list-more {\n margin-top: 12px;\n text-align: center;\n}\n.ant-list-more button {\n padding-right: 32px;\n padding-left: 32px;\n}\n.ant-list-spin {\n min-height: 40px;\n text-align: center;\n}\n.ant-list-empty-text {\n padding: 16px;\n color: rgba(0, 0, 0, 0.25);\n font-size: 14px;\n text-align: center;\n}\n.ant-list-items {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.ant-list-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-list-item-meta {\n display: flex;\n flex: 1;\n align-items: flex-start;\n max-width: 100%;\n}\n.ant-list-item-meta-avatar {\n margin-right: 16px;\n}\n.ant-list-item-meta-content {\n flex: 1 0;\n width: 0;\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-list-item-meta-title {\n margin-bottom: 4px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n}\n.ant-list-item-meta-title > a {\n color: rgba(0, 0, 0, 0.85);\n transition: all 0.3s;\n}\n.ant-list-item-meta-title > a:hover {\n color: #1890ff;\n}\n.ant-list-item-meta-description {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.5715;\n}\n.ant-list-item-action {\n flex: 0 0 auto;\n margin-left: 48px;\n padding: 0;\n font-size: 0;\n list-style: none;\n}\n.ant-list-item-action > li {\n position: relative;\n display: inline-block;\n padding: 0 8px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.5715;\n text-align: center;\n}\n.ant-list-item-action > li:first-child {\n padding-left: 0;\n}\n.ant-list-item-action-split {\n position: absolute;\n top: 50%;\n right: 0;\n width: 1px;\n height: 14px;\n margin-top: -7px;\n background-color: #f0f0f0;\n}\n.ant-list-header {\n background: transparent;\n}\n.ant-list-footer {\n background: transparent;\n}\n.ant-list-header,\n.ant-list-footer {\n padding-top: 12px;\n padding-bottom: 12px;\n}\n.ant-list-empty {\n padding: 16px 0;\n color: rgba(0, 0, 0, 0.45);\n font-size: 12px;\n text-align: center;\n}\n.ant-list-split .ant-list-item {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-list-split .ant-list-item:last-child {\n border-bottom: none;\n}\n.ant-list-split .ant-list-header {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-list-split.ant-list-empty .ant-list-footer {\n border-top: 1px solid #f0f0f0;\n}\n.ant-list-loading .ant-list-spin-nested-loading {\n min-height: 32px;\n}\n.ant-list-split.ant-list-something-after-last-item .ant-spin-container > .ant-list-items > .ant-list-item:last-child {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-list-lg .ant-list-item {\n padding: 16px 24px;\n}\n.ant-list-sm .ant-list-item {\n padding: 8px 16px;\n}\n.ant-list-vertical .ant-list-item {\n align-items: initial;\n}\n.ant-list-vertical .ant-list-item-main {\n display: block;\n flex: 1;\n}\n.ant-list-vertical .ant-list-item-extra {\n margin-left: 40px;\n}\n.ant-list-vertical .ant-list-item-meta {\n margin-bottom: 16px;\n}\n.ant-list-vertical .ant-list-item-meta-title {\n margin-bottom: 12px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 16px;\n line-height: 24px;\n}\n.ant-list-vertical .ant-list-item-action {\n margin-top: 16px;\n margin-left: auto;\n}\n.ant-list-vertical .ant-list-item-action > li {\n padding: 0 16px;\n}\n.ant-list-vertical .ant-list-item-action > li:first-child {\n padding-left: 0;\n}\n.ant-list-grid .ant-col > .ant-list-item {\n display: block;\n max-width: 100%;\n margin-bottom: 16px;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: none;\n}\n.ant-list-item-no-flex {\n display: block;\n}\n.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action {\n float: right;\n}\n.ant-list-bordered {\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n}\n.ant-list-bordered .ant-list-header {\n padding-right: 24px;\n padding-left: 24px;\n}\n.ant-list-bordered .ant-list-footer {\n padding-right: 24px;\n padding-left: 24px;\n}\n.ant-list-bordered .ant-list-item {\n padding-right: 24px;\n padding-left: 24px;\n}\n.ant-list-bordered .ant-list-pagination {\n margin: 16px 24px;\n}\n.ant-list-bordered.ant-list-sm .ant-list-item {\n padding: 8px 16px;\n}\n.ant-list-bordered.ant-list-sm .ant-list-header,\n.ant-list-bordered.ant-list-sm .ant-list-footer {\n padding: 8px 16px;\n}\n.ant-list-bordered.ant-list-lg .ant-list-item {\n padding: 16px 24px;\n}\n.ant-list-bordered.ant-list-lg .ant-list-header,\n.ant-list-bordered.ant-list-lg .ant-list-footer {\n padding: 16px 24px;\n}\n@media screen and (max-width: 768px) {\n .ant-list-item-action {\n margin-left: 24px;\n }\n .ant-list-vertical .ant-list-item-extra {\n margin-left: 24px;\n }\n}\n@media screen and (max-width: 576px) {\n .ant-list-item {\n flex-wrap: wrap;\n }\n .ant-list-item-action {\n margin-left: 12px;\n }\n .ant-list-vertical .ant-list-item {\n flex-wrap: wrap-reverse;\n }\n .ant-list-vertical .ant-list-item-main {\n min-width: 220px;\n }\n .ant-list-vertical .ant-list-item-extra {\n margin: auto auto 16px;\n }\n}\n.ant-list-rtl {\n direction: rtl;\n text-align: right;\n}\n.ant-list-rtl .ReactVirtualized__List .ant-list-item {\n direction: rtl;\n}\n.ant-list-rtl .ant-list-pagination {\n text-align: left;\n}\n.ant-list-rtl .ant-list-item-meta-avatar {\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-list-rtl .ant-list-item-action {\n margin-right: 48px;\n margin-left: 0;\n}\n.ant-list.ant-list-rtl .ant-list-item-action > li:first-child {\n padding-right: 0;\n padding-left: 16px;\n}\n.ant-list-rtl .ant-list-item-action-split {\n right: auto;\n left: 0;\n}\n.ant-list-rtl.ant-list-vertical .ant-list-item-extra {\n margin-right: 40px;\n margin-left: 0;\n}\n.ant-list-rtl.ant-list-vertical .ant-list-item-action {\n margin-right: auto;\n}\n.ant-list-rtl .ant-list-vertical .ant-list-item-action > li:first-child {\n padding-right: 0;\n padding-left: 16px;\n}\n.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action {\n float: left;\n}\n@media screen and (max-width: 768px) {\n .ant-list-rtl .ant-list-item-action {\n margin-right: 24px;\n margin-left: 0;\n }\n .ant-list-rtl .ant-list-vertical .ant-list-item-extra {\n margin-right: 24px;\n margin-left: 0;\n }\n}\n@media screen and (max-width: 576px) {\n .ant-list-rtl .ant-list-item-action {\n margin-right: 22px;\n margin-left: 0;\n }\n .ant-list-rtl.ant-list-vertical .ant-list-item-extra {\n margin: auto auto 16px;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-pagination {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n}\n.ant-pagination ul,\n.ant-pagination ol {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.ant-pagination::after {\n display: block;\n clear: both;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n content: ' ';\n}\n.ant-pagination-total-text {\n display: inline-block;\n height: 32px;\n margin-right: 8px;\n line-height: 30px;\n vertical-align: middle;\n}\n.ant-pagination-item {\n display: inline-block;\n min-width: 32px;\n height: 32px;\n margin-right: 8px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n line-height: 30px;\n text-align: center;\n vertical-align: middle;\n list-style: none;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n outline: 0;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-pagination-item a {\n display: block;\n padding: 0 6px;\n color: rgba(0, 0, 0, 0.85);\n transition: none;\n}\n.ant-pagination-item a:hover {\n text-decoration: none;\n}\n.ant-pagination-item:hover {\n border-color: #1890ff;\n transition: all 0.3s;\n}\n.ant-pagination-item:hover a {\n color: #1890ff;\n}\n.ant-pagination-item:focus-visible {\n border-color: #1890ff;\n transition: all 0.3s;\n}\n.ant-pagination-item:focus-visible a {\n color: #1890ff;\n}\n.ant-pagination-item-active {\n font-weight: 500;\n background: #fff;\n border-color: #1890ff;\n}\n.ant-pagination-item-active a {\n color: #1890ff;\n}\n.ant-pagination-item-active:hover {\n border-color: #40a9ff;\n}\n.ant-pagination-item-active:focus-visible {\n border-color: #40a9ff;\n}\n.ant-pagination-item-active:hover a {\n color: #40a9ff;\n}\n.ant-pagination-item-active:focus-visible a {\n color: #40a9ff;\n}\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n outline: 0;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container,\n.ant-pagination-jump-next .ant-pagination-item-container {\n position: relative;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon {\n color: #1890ff;\n font-size: 12px;\n letter-spacing: -1px;\n opacity: 0;\n transition: all 0.2s;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n margin: auto;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n margin: auto;\n color: rgba(0, 0, 0, 0.25);\n font-family: Arial, Helvetica, sans-serif;\n letter-spacing: 2px;\n text-align: center;\n text-indent: 0.13em;\n opacity: 1;\n transition: all 0.2s;\n}\n.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon,\n.ant-pagination-jump-next:hover .ant-pagination-item-link-icon {\n opacity: 1;\n}\n.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis {\n opacity: 0;\n}\n.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon,\n.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon {\n opacity: 1;\n}\n.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis {\n opacity: 0;\n}\n.ant-pagination-prev,\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n margin-right: 8px;\n}\n.ant-pagination-prev,\n.ant-pagination-next,\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n display: inline-block;\n min-width: 32px;\n height: 32px;\n color: rgba(0, 0, 0, 0.85);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n line-height: 32px;\n text-align: center;\n vertical-align: middle;\n list-style: none;\n border-radius: 2px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-pagination-prev,\n.ant-pagination-next {\n font-family: Arial, Helvetica, sans-serif;\n outline: 0;\n}\n.ant-pagination-prev button,\n.ant-pagination-next button {\n color: rgba(0, 0, 0, 0.85);\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-pagination-prev:hover button,\n.ant-pagination-next:hover button {\n border-color: #40a9ff;\n}\n.ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination-next .ant-pagination-item-link {\n display: block;\n width: 100%;\n height: 100%;\n padding: 0;\n font-size: 12px;\n text-align: center;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n outline: none;\n transition: all 0.3s;\n}\n.ant-pagination-prev:focus-visible .ant-pagination-item-link,\n.ant-pagination-next:focus-visible .ant-pagination-item-link {\n color: #1890ff;\n border-color: #1890ff;\n}\n.ant-pagination-prev:hover .ant-pagination-item-link,\n.ant-pagination-next:hover .ant-pagination-item-link {\n color: #1890ff;\n border-color: #1890ff;\n}\n.ant-pagination-disabled,\n.ant-pagination-disabled:hover {\n cursor: not-allowed;\n}\n.ant-pagination-disabled .ant-pagination-item-link,\n.ant-pagination-disabled:hover .ant-pagination-item-link {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-pagination-disabled:focus-visible {\n cursor: not-allowed;\n}\n.ant-pagination-disabled:focus-visible .ant-pagination-item-link {\n color: rgba(0, 0, 0, 0.25);\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-pagination-slash {\n margin: 0 10px 0 5px;\n}\n.ant-pagination-options {\n display: inline-block;\n margin-left: 16px;\n vertical-align: middle;\n}\n@media all and (-ms-high-contrast: none) {\n .ant-pagination-options *::-ms-backdrop,\n .ant-pagination-options {\n vertical-align: top;\n }\n}\n.ant-pagination-options-size-changer.ant-select {\n display: inline-block;\n width: auto;\n}\n.ant-pagination-options-quick-jumper {\n display: inline-block;\n height: 32px;\n margin-left: 8px;\n line-height: 32px;\n vertical-align: top;\n}\n.ant-pagination-options-quick-jumper input {\n position: relative;\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n line-height: 1.5715;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n width: 50px;\n height: 32px;\n margin: 0 8px;\n}\n.ant-pagination-options-quick-jumper input::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-pagination-options-quick-jumper input:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-pagination-options-quick-jumper input::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-pagination-options-quick-jumper input:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-pagination-options-quick-jumper input:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-pagination-options-quick-jumper input:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-pagination-options-quick-jumper input:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-pagination-options-quick-jumper input:focus,\n.ant-pagination-options-quick-jumper input-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-pagination-options-quick-jumper input-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-pagination-options-quick-jumper input-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-pagination-options-quick-jumper input[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-pagination-options-quick-jumper input[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-pagination-options-quick-jumper input-borderless,\n.ant-pagination-options-quick-jumper input-borderless:hover,\n.ant-pagination-options-quick-jumper input-borderless:focus,\n.ant-pagination-options-quick-jumper input-borderless-focused,\n.ant-pagination-options-quick-jumper input-borderless-disabled,\n.ant-pagination-options-quick-jumper input-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-pagination-options-quick-jumper input {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-pagination-options-quick-jumper input-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-pagination-options-quick-jumper input-sm {\n padding: 0px 7px;\n}\n.ant-pagination-simple .ant-pagination-prev,\n.ant-pagination-simple .ant-pagination-next {\n height: 24px;\n line-height: 24px;\n vertical-align: top;\n}\n.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link {\n height: 24px;\n background-color: transparent;\n border: 0;\n}\n.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link::after,\n.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link::after {\n height: 24px;\n line-height: 24px;\n}\n.ant-pagination-simple .ant-pagination-simple-pager {\n display: inline-block;\n height: 24px;\n margin-right: 8px;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input {\n box-sizing: border-box;\n height: 100%;\n margin-right: 8px;\n padding: 0 6px;\n text-align: center;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n outline: none;\n transition: border-color 0.3s;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input:hover {\n border-color: #1890ff;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input:focus {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n}\n.ant-pagination-simple .ant-pagination-simple-pager input[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background: #f5f5f5;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-total-text,\n.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager {\n height: 24px;\n line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-item {\n min-width: 24px;\n height: 24px;\n margin: 0;\n line-height: 22px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active) {\n background: transparent;\n border-color: transparent;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev,\n.ant-pagination.ant-pagination-mini .ant-pagination-next {\n min-width: 24px;\n height: 24px;\n margin: 0;\n line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link {\n background: transparent;\n border-color: transparent;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link::after,\n.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link::after {\n height: 24px;\n line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev,\n.ant-pagination.ant-pagination-mini .ant-pagination-jump-next {\n height: 24px;\n margin-right: 0;\n line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options {\n margin-left: 2px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer {\n top: 0px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper {\n height: 24px;\n line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input {\n padding: 0px 7px;\n width: 44px;\n height: 24px;\n}\n.ant-pagination.ant-pagination-disabled {\n cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item {\n background: #f5f5f5;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item a {\n color: rgba(0, 0, 0, 0.25);\n background: transparent;\n border: none;\n cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-active {\n background: #e6e6e6;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-link {\n color: rgba(0, 0, 0, 0.25);\n background: #f5f5f5;\n border-color: #d9d9d9;\n cursor: not-allowed;\n}\n.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link {\n background: transparent;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon {\n opacity: 0;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis {\n opacity: 1;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager {\n color: rgba(0, 0, 0, 0.25);\n}\n@media only screen and (max-width: 992px) {\n .ant-pagination-item-after-jump-prev,\n .ant-pagination-item-before-jump-next {\n display: none;\n }\n}\n@media only screen and (max-width: 576px) {\n .ant-pagination-options {\n display: none;\n }\n}\n.ant-pagination-rtl .ant-pagination-total-text {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-item,\n.ant-pagination-rtl .ant-pagination-prev,\n.ant-pagination-rtl .ant-pagination-jump-prev,\n.ant-pagination-rtl .ant-pagination-jump-next {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-slash {\n margin: 0 5px 0 10px;\n}\n.ant-pagination-rtl .ant-pagination-options {\n margin-right: 16px;\n margin-left: 0;\n}\n.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper {\n margin-left: 0;\n}\n.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options {\n margin-right: 2px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-spin {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n display: none;\n color: #1890ff;\n text-align: center;\n vertical-align: middle;\n opacity: 0;\n transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-spin-spinning {\n position: static;\n display: inline-block;\n opacity: 1;\n}\n.ant-spin-nested-loading {\n position: relative;\n}\n.ant-spin-nested-loading > div > .ant-spin {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 4;\n display: block;\n width: 100%;\n height: 100%;\n max-height: 400px;\n}\n.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -10px;\n}\n.ant-spin-nested-loading > div > .ant-spin .ant-spin-text {\n position: absolute;\n top: 50%;\n width: 100%;\n padding-top: 5px;\n text-shadow: 0 1px 2px #fff;\n}\n.ant-spin-nested-loading > div > .ant-spin.ant-spin-show-text .ant-spin-dot {\n margin-top: -20px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-dot {\n margin: -7px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-text {\n padding-top: 2px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm.ant-spin-show-text .ant-spin-dot {\n margin-top: -17px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-dot {\n margin: -16px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-text {\n padding-top: 11px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg.ant-spin-show-text .ant-spin-dot {\n margin-top: -26px;\n}\n.ant-spin-container {\n position: relative;\n transition: opacity 0.3s;\n}\n.ant-spin-container::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10;\n display: none \\9;\n width: 100%;\n height: 100%;\n background: #fff;\n opacity: 0;\n transition: all 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-spin-blur {\n clear: both;\n opacity: 0.5;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n pointer-events: none;\n}\n.ant-spin-blur::after {\n opacity: 0.4;\n pointer-events: auto;\n}\n.ant-spin-tip {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-spin-dot {\n position: relative;\n display: inline-block;\n font-size: 20px;\n width: 1em;\n height: 1em;\n}\n.ant-spin-dot-item {\n position: absolute;\n display: block;\n width: 9px;\n height: 9px;\n background-color: #1890ff;\n border-radius: 100%;\n transform: scale(0.75);\n transform-origin: 50% 50%;\n opacity: 0.3;\n -webkit-animation: antSpinMove 1s infinite linear alternate;\n animation: antSpinMove 1s infinite linear alternate;\n}\n.ant-spin-dot-item:nth-child(1) {\n top: 0;\n left: 0;\n}\n.ant-spin-dot-item:nth-child(2) {\n top: 0;\n right: 0;\n -webkit-animation-delay: 0.4s;\n animation-delay: 0.4s;\n}\n.ant-spin-dot-item:nth-child(3) {\n right: 0;\n bottom: 0;\n -webkit-animation-delay: 0.8s;\n animation-delay: 0.8s;\n}\n.ant-spin-dot-item:nth-child(4) {\n bottom: 0;\n left: 0;\n -webkit-animation-delay: 1.2s;\n animation-delay: 1.2s;\n}\n.ant-spin-dot-spin {\n transform: rotate(0deg);\n -webkit-animation: antRotate 1.2s infinite linear;\n animation: antRotate 1.2s infinite linear;\n}\n.ant-spin-sm .ant-spin-dot {\n font-size: 14px;\n}\n.ant-spin-sm .ant-spin-dot i {\n width: 6px;\n height: 6px;\n}\n.ant-spin-lg .ant-spin-dot {\n font-size: 32px;\n}\n.ant-spin-lg .ant-spin-dot i {\n width: 14px;\n height: 14px;\n}\n.ant-spin.ant-spin-show-text .ant-spin-text {\n display: block;\n}\n@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n /* IE10+ */\n .ant-spin-blur {\n background: #fff;\n opacity: 0.5;\n }\n}\n@-webkit-keyframes antSpinMove {\n to {\n opacity: 1;\n }\n}\n@keyframes antSpinMove {\n to {\n opacity: 1;\n }\n}\n@-webkit-keyframes antRotate {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes antRotate {\n to {\n transform: rotate(360deg);\n }\n}\n.ant-spin-rtl {\n direction: rtl;\n}\n.ant-spin-rtl .ant-spin-dot-spin {\n transform: rotate(-45deg);\n -webkit-animation-name: antRotateRtl;\n animation-name: antRotateRtl;\n}\n@-webkit-keyframes antRotateRtl {\n to {\n transform: rotate(-405deg);\n }\n}\n@keyframes antRotateRtl {\n to {\n transform: rotate(-405deg);\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover {\n background: #fff;\n border-color: #ff4d4f;\n}\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused {\n border-color: #ff7875;\n box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-mentions-status-error .ant-input-prefix {\n color: #ff4d4f;\n}\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover {\n background: #fff;\n border-color: #faad14;\n}\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused {\n border-color: #ffc53d;\n box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-mentions-status-warning .ant-input-prefix {\n color: #faad14;\n}\n.ant-mentions {\n box-sizing: border-box;\n margin: 0;\n font-variant: tabular-nums;\n list-style: none;\n font-feature-settings: 'tnum';\n width: 100%;\n min-width: 0;\n padding: 4px 11px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n background-color: #fff;\n background-image: none;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n transition: all 0.3s;\n position: relative;\n display: inline-block;\n height: auto;\n padding: 0;\n overflow: hidden;\n line-height: 1.5715;\n white-space: pre-wrap;\n vertical-align: bottom;\n}\n.ant-mentions::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-mentions:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-mentions::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-mentions:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-mentions:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-mentions:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-mentions:hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-mentions:focus,\n.ant-mentions-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-mentions-disabled {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-mentions-disabled:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-mentions[disabled] {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-mentions[disabled]:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-mentions-borderless,\n.ant-mentions-borderless:hover,\n.ant-mentions-borderless:focus,\n.ant-mentions-borderless-focused,\n.ant-mentions-borderless-disabled,\n.ant-mentions-borderless[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n}\ntextarea.ant-mentions {\n max-width: 100%;\n height: auto;\n min-height: 32px;\n line-height: 1.5715;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n}\n.ant-mentions-lg {\n padding: 6.5px 11px;\n font-size: 16px;\n}\n.ant-mentions-sm {\n padding: 0px 7px;\n}\n.ant-mentions-disabled > textarea {\n color: rgba(0, 0, 0, 0.25);\n background-color: #f5f5f5;\n border-color: #d9d9d9;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n}\n.ant-mentions-disabled > textarea:hover {\n border-color: #d9d9d9;\n border-right-width: 1px;\n}\n.ant-mentions-focused {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-mentions > textarea,\n.ant-mentions-measure {\n min-height: 30px;\n margin: 0;\n padding: 4px 11px;\n overflow: inherit;\n overflow-x: hidden;\n overflow-y: auto;\n /* stylelint-disable declaration-block-no-redundant-longhand-properties */\n font-weight: inherit;\n font-size: inherit;\n font-family: inherit;\n font-style: inherit;\n font-variant: inherit;\n font-size-adjust: inherit;\n font-stretch: inherit;\n line-height: inherit;\n /* stylelint-enable declaration-block-no-redundant-longhand-properties */\n direction: inherit;\n letter-spacing: inherit;\n white-space: inherit;\n text-align: inherit;\n vertical-align: top;\n word-wrap: break-word;\n word-break: inherit;\n -moz-tab-size: inherit;\n -o-tab-size: inherit;\n tab-size: inherit;\n}\n.ant-mentions > textarea {\n width: 100%;\n border: none;\n outline: none;\n resize: none;\n}\n.ant-mentions > textarea::-moz-placeholder {\n color: #bfbfbf;\n -moz-user-select: none;\n user-select: none;\n}\n.ant-mentions > textarea:-ms-input-placeholder {\n color: #bfbfbf;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-mentions > textarea::placeholder {\n color: #bfbfbf;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-mentions > textarea:-moz-placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-mentions > textarea:-ms-input-placeholder {\n text-overflow: ellipsis;\n}\n.ant-mentions > textarea:placeholder-shown {\n text-overflow: ellipsis;\n}\n.ant-mentions-measure {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n color: transparent;\n pointer-events: none;\n}\n.ant-mentions-measure > span {\n display: inline-block;\n min-height: 1em;\n}\n.ant-mentions-dropdown {\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: 1050;\n box-sizing: border-box;\n font-size: 14px;\n font-variant: initial;\n background-color: #fff;\n border-radius: 2px;\n outline: none;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-mentions-dropdown-hidden {\n display: none;\n}\n.ant-mentions-dropdown-menu {\n max-height: 250px;\n margin-bottom: 0;\n padding-left: 0;\n overflow: auto;\n list-style: none;\n outline: none;\n}\n.ant-mentions-dropdown-menu-item {\n position: relative;\n display: block;\n min-width: 100px;\n padding: 5px 12px;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: normal;\n line-height: 1.5715;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: background 0.3s ease;\n}\n.ant-mentions-dropdown-menu-item:hover {\n background-color: #f5f5f5;\n}\n.ant-mentions-dropdown-menu-item:first-child {\n border-radius: 2px 2px 0 0;\n}\n.ant-mentions-dropdown-menu-item:last-child {\n border-radius: 0 0 2px 2px;\n}\n.ant-mentions-dropdown-menu-item-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-mentions-dropdown-menu-item-disabled:hover {\n color: rgba(0, 0, 0, 0.25);\n background-color: #fff;\n cursor: not-allowed;\n}\n.ant-mentions-dropdown-menu-item-selected {\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n background-color: #fafafa;\n}\n.ant-mentions-dropdown-menu-item-active {\n background-color: #f5f5f5;\n}\n.ant-mentions-suffix {\n position: absolute;\n top: 0;\n right: 11px;\n bottom: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: auto;\n}\n.ant-mentions-rtl {\n direction: rtl;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-message {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: fixed;\n top: 8px;\n left: 0;\n z-index: 1010;\n width: 100%;\n pointer-events: none;\n}\n.ant-message-notice {\n padding: 8px;\n text-align: center;\n}\n.ant-message-notice-content {\n display: inline-block;\n padding: 10px 16px;\n background: #fff;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n pointer-events: all;\n}\n.ant-message-success .anticon {\n color: #52c41a;\n}\n.ant-message-error .anticon {\n color: #ff4d4f;\n}\n.ant-message-warning .anticon {\n color: #faad14;\n}\n.ant-message-info .anticon,\n.ant-message-loading .anticon {\n color: #1890ff;\n}\n.ant-message .anticon {\n position: relative;\n top: 1px;\n margin-right: 8px;\n font-size: 16px;\n}\n.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active {\n -webkit-animation-name: MessageMoveOut;\n animation-name: MessageMoveOut;\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n}\n@-webkit-keyframes MessageMoveOut {\n 0% {\n max-height: 150px;\n padding: 8px;\n opacity: 1;\n }\n 100% {\n max-height: 0;\n padding: 0;\n opacity: 0;\n }\n}\n@keyframes MessageMoveOut {\n 0% {\n max-height: 150px;\n padding: 8px;\n opacity: 1;\n }\n 100% {\n max-height: 0;\n padding: 0;\n opacity: 0;\n }\n}\n.ant-message-rtl {\n direction: rtl;\n}\n.ant-message-rtl span {\n direction: rtl;\n}\n.ant-message-rtl .anticon {\n margin-right: 0;\n margin-left: 8px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-modal {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n pointer-events: none;\n position: relative;\n top: 100px;\n width: auto;\n max-width: calc(100vw - 32px);\n margin: 0 auto;\n padding-bottom: 24px;\n}\n.ant-modal.ant-zoom-enter,\n.ant-modal.ant-zoom-appear {\n transform: none;\n opacity: 0;\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-modal-mask {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1000;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-modal-mask-hidden {\n display: none;\n}\n.ant-modal-wrap {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n outline: 0;\n}\n.ant-modal-wrap {\n z-index: 1000;\n}\n.ant-modal-title {\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n word-wrap: break-word;\n}\n.ant-modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n pointer-events: auto;\n}\n.ant-modal-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 10;\n padding: 0;\n color: rgba(0, 0, 0, 0.45);\n font-weight: 700;\n line-height: 1;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color 0.3s;\n}\n.ant-modal-close-x {\n display: block;\n width: 54px;\n height: 54px;\n font-size: 16px;\n font-style: normal;\n line-height: 54px;\n text-align: center;\n text-transform: none;\n text-rendering: auto;\n}\n.ant-modal-close:focus,\n.ant-modal-close:hover {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n}\n.ant-modal-header {\n padding: 16px 24px;\n color: rgba(0, 0, 0, 0.85);\n background: #fff;\n border-bottom: 1px solid #f0f0f0;\n border-radius: 2px 2px 0 0;\n}\n.ant-modal-body {\n padding: 24px;\n font-size: 14px;\n line-height: 1.5715;\n word-wrap: break-word;\n}\n.ant-modal-footer {\n padding: 10px 16px;\n text-align: right;\n background: transparent;\n border-top: 1px solid #f0f0f0;\n border-radius: 0 0 2px 2px;\n}\n.ant-modal-footer .ant-btn + .ant-btn:not(.ant-dropdown-trigger) {\n margin-bottom: 0;\n margin-left: 8px;\n}\n.ant-modal-open {\n overflow: hidden;\n}\n.ant-modal-centered {\n text-align: center;\n}\n.ant-modal-centered::before {\n display: inline-block;\n width: 0;\n height: 100%;\n vertical-align: middle;\n content: '';\n}\n.ant-modal-centered .ant-modal {\n top: 0;\n display: inline-block;\n padding-bottom: 0;\n text-align: left;\n vertical-align: middle;\n}\n@media (max-width: 767px) {\n .ant-modal {\n max-width: calc(100vw - 16px);\n margin: 8px auto;\n }\n .ant-modal-centered .ant-modal {\n flex: 1;\n }\n}\n.ant-modal-confirm .ant-modal-header {\n display: none;\n}\n.ant-modal-confirm .ant-modal-body {\n padding: 32px 32px 24px;\n}\n.ant-modal-confirm-body-wrapper::before {\n display: table;\n content: '';\n}\n.ant-modal-confirm-body-wrapper::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-modal-confirm-body .ant-modal-confirm-title {\n display: block;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 1.4;\n}\n.ant-modal-confirm-body .ant-modal-confirm-content {\n margin-top: 8px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-modal-confirm-body > .anticon {\n float: left;\n margin-right: 16px;\n font-size: 22px;\n}\n.ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n margin-left: 38px;\n}\n.ant-modal-confirm .ant-modal-confirm-btns {\n margin-top: 24px;\n text-align: right;\n}\n.ant-modal-confirm .ant-modal-confirm-btns .ant-btn + .ant-btn {\n margin-bottom: 0;\n margin-left: 8px;\n}\n.ant-modal-confirm-error .ant-modal-confirm-body > .anticon {\n color: #ff4d4f;\n}\n.ant-modal-confirm-warning .ant-modal-confirm-body > .anticon,\n.ant-modal-confirm-confirm .ant-modal-confirm-body > .anticon {\n color: #faad14;\n}\n.ant-modal-confirm-info .ant-modal-confirm-body > .anticon {\n color: #1890ff;\n}\n.ant-modal-confirm-success .ant-modal-confirm-body > .anticon {\n color: #52c41a;\n}\n.ant-modal-wrap-rtl {\n direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-close {\n right: initial;\n left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-footer {\n text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-footer .ant-btn + .ant-btn {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body {\n direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n margin-right: 38px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns {\n text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn + .ant-btn {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl.ant-modal-centered .ant-modal {\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-notification {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: fixed;\n z-index: 1010;\n margin-right: 24px;\n}\n.ant-notification-close-icon {\n font-size: 14px;\n cursor: pointer;\n}\n.ant-notification-hook-holder {\n position: relative;\n}\n.ant-notification-notice {\n position: relative;\n width: 384px;\n max-width: calc(100vw - 24px * 2);\n margin-bottom: 16px;\n margin-left: auto;\n padding: 16px 24px;\n overflow: hidden;\n line-height: 1.5715;\n word-wrap: break-word;\n background: #fff;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-notification-top .ant-notification-notice,\n.ant-notification-bottom .ant-notification-notice {\n margin-right: auto;\n margin-left: auto;\n}\n.ant-notification-topLeft .ant-notification-notice,\n.ant-notification-bottomLeft .ant-notification-notice {\n margin-right: auto;\n margin-left: 0;\n}\n.ant-notification-notice-message {\n margin-bottom: 8px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 16px;\n line-height: 24px;\n}\n.ant-notification-notice-message-single-line-auto-margin {\n display: block;\n width: calc(384px - 24px * 2 - 24px - 48px - 100%);\n max-width: 4px;\n background-color: transparent;\n pointer-events: none;\n}\n.ant-notification-notice-message-single-line-auto-margin::before {\n display: block;\n content: '';\n}\n.ant-notification-notice-description {\n font-size: 14px;\n}\n.ant-notification-notice-closable .ant-notification-notice-message {\n padding-right: 24px;\n}\n.ant-notification-notice-with-icon .ant-notification-notice-message {\n margin-bottom: 4px;\n margin-left: 48px;\n font-size: 16px;\n}\n.ant-notification-notice-with-icon .ant-notification-notice-description {\n margin-left: 48px;\n font-size: 14px;\n}\n.ant-notification-notice-icon {\n position: absolute;\n margin-left: 4px;\n font-size: 24px;\n line-height: 24px;\n}\n.anticon.ant-notification-notice-icon-success {\n color: #52c41a;\n}\n.anticon.ant-notification-notice-icon-info {\n color: #1890ff;\n}\n.anticon.ant-notification-notice-icon-warning {\n color: #faad14;\n}\n.anticon.ant-notification-notice-icon-error {\n color: #ff4d4f;\n}\n.ant-notification-notice-close {\n position: absolute;\n top: 16px;\n right: 22px;\n color: rgba(0, 0, 0, 0.45);\n outline: none;\n}\n.ant-notification-notice-close:hover {\n color: rgba(0, 0, 0, 0.67);\n}\n.ant-notification-notice-btn {\n float: right;\n margin-top: 16px;\n}\n.ant-notification .notification-fade-effect {\n -webkit-animation-duration: 0.24s;\n animation-duration: 0.24s;\n -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n.ant-notification-fade-enter,\n.ant-notification-fade-appear {\n -webkit-animation-duration: 0.24s;\n animation-duration: 0.24s;\n -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n opacity: 0;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-notification-fade-leave {\n -webkit-animation-duration: 0.24s;\n animation-duration: 0.24s;\n -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-duration: 0.2s;\n animation-duration: 0.2s;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-fade-appear.ant-notification-fade-appear-active {\n -webkit-animation-name: NotificationFadeIn;\n animation-name: NotificationFadeIn;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n.ant-notification-fade-leave.ant-notification-fade-leave-active {\n -webkit-animation-name: NotificationFadeOut;\n animation-name: NotificationFadeOut;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n@-webkit-keyframes NotificationFadeIn {\n 0% {\n left: 384px;\n opacity: 0;\n }\n 100% {\n left: 0;\n opacity: 1;\n }\n}\n@keyframes NotificationFadeIn {\n 0% {\n left: 384px;\n opacity: 0;\n }\n 100% {\n left: 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes NotificationFadeOut {\n 0% {\n max-height: 150px;\n margin-bottom: 16px;\n opacity: 1;\n }\n 100% {\n max-height: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n}\n@keyframes NotificationFadeOut {\n 0% {\n max-height: 150px;\n margin-bottom: 16px;\n opacity: 1;\n }\n 100% {\n max-height: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n}\n.ant-notification-rtl {\n direction: rtl;\n}\n.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message {\n padding-right: 0;\n padding-left: 24px;\n}\n.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message {\n margin-right: 48px;\n margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description {\n margin-right: 48px;\n margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-icon {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-close {\n right: auto;\n left: 22px;\n}\n.ant-notification-rtl .ant-notification-notice-btn {\n float: left;\n}\n.ant-notification-top,\n.ant-notification-bottom {\n margin-right: 0;\n margin-left: 0;\n}\n.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active {\n -webkit-animation-name: NotificationTopFadeIn;\n animation-name: NotificationTopFadeIn;\n}\n.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active {\n -webkit-animation-name: NotificationBottomFadeIn;\n animation-name: NotificationBottomFadeIn;\n}\n.ant-notification-topLeft,\n.ant-notification-bottomLeft {\n margin-right: 0;\n margin-left: 24px;\n}\n.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,\n.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active {\n -webkit-animation-name: NotificationLeftFadeIn;\n animation-name: NotificationLeftFadeIn;\n}\n@-webkit-keyframes NotificationTopFadeIn {\n 0% {\n margin-top: -100%;\n opacity: 0;\n }\n 100% {\n margin-top: 0;\n opacity: 1;\n }\n}\n@keyframes NotificationTopFadeIn {\n 0% {\n margin-top: -100%;\n opacity: 0;\n }\n 100% {\n margin-top: 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes NotificationBottomFadeIn {\n 0% {\n margin-bottom: -100%;\n opacity: 0;\n }\n 100% {\n margin-bottom: 0;\n opacity: 1;\n }\n}\n@keyframes NotificationBottomFadeIn {\n 0% {\n margin-bottom: -100%;\n opacity: 0;\n }\n 100% {\n margin-bottom: 0;\n opacity: 1;\n }\n}\n@-webkit-keyframes NotificationLeftFadeIn {\n 0% {\n right: 384px;\n opacity: 0;\n }\n 100% {\n right: 0;\n opacity: 1;\n }\n}\n@keyframes NotificationLeftFadeIn {\n 0% {\n right: 384px;\n opacity: 0;\n }\n 100% {\n right: 0;\n opacity: 1;\n }\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-page-header {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n padding: 16px 24px;\n background-color: #fff;\n}\n.ant-page-header-ghost {\n background-color: inherit;\n}\n.ant-page-header.has-breadcrumb {\n padding-top: 12px;\n}\n.ant-page-header.has-footer {\n padding-bottom: 0;\n}\n.ant-page-header-back {\n margin-right: 16px;\n font-size: 16px;\n line-height: 1;\n}\n.ant-page-header-back-button {\n color: #1890ff;\n text-decoration: none;\n outline: none;\n transition: color 0.3s;\n color: #000;\n cursor: pointer;\n}\n.ant-page-header-back-button:focus,\n.ant-page-header-back-button:hover {\n color: #40a9ff;\n}\n.ant-page-header-back-button:active {\n color: #096dd9;\n}\n.ant-page-header .ant-divider-vertical {\n height: 14px;\n margin: 0 12px;\n vertical-align: middle;\n}\n.ant-breadcrumb + .ant-page-header-heading {\n margin-top: 8px;\n}\n.ant-page-header-heading {\n display: flex;\n justify-content: space-between;\n}\n.ant-page-header-heading-left {\n display: flex;\n align-items: center;\n margin: 4px 0;\n overflow: hidden;\n}\n.ant-page-header-heading-title {\n margin-right: 12px;\n margin-bottom: 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 20px;\n line-height: 32px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-page-header-heading .ant-avatar {\n margin-right: 12px;\n}\n.ant-page-header-heading-sub-title {\n margin-right: 12px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.5715;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-page-header-heading-extra {\n margin: 4px 0;\n white-space: nowrap;\n}\n.ant-page-header-heading-extra > * {\n white-space: unset;\n}\n.ant-page-header-content {\n padding-top: 12px;\n}\n.ant-page-header-footer {\n margin-top: 16px;\n}\n.ant-page-header-footer .ant-tabs > .ant-tabs-nav {\n margin: 0;\n}\n.ant-page-header-footer .ant-tabs > .ant-tabs-nav::before {\n border: none;\n}\n.ant-page-header-footer .ant-tabs .ant-tabs-tab {\n padding-top: 8px;\n padding-bottom: 8px;\n font-size: 16px;\n}\n.ant-page-header-compact .ant-page-header-heading {\n flex-wrap: wrap;\n}\n.ant-page-header-rtl {\n direction: rtl;\n}\n.ant-page-header-rtl .ant-page-header-back {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-page-header-rtl .ant-page-header-heading-title {\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading .ant-avatar {\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading-sub-title {\n float: right;\n margin-right: 0;\n margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading-tags {\n float: right;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra {\n float: left;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra > * {\n margin-right: 12px;\n margin-left: 0;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra > *:first-child {\n margin-right: 0;\n}\n.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav {\n float: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-space {\n display: inline-flex;\n}\n.ant-space-vertical {\n flex-direction: column;\n}\n.ant-space-align-center {\n align-items: center;\n}\n.ant-space-align-start {\n align-items: flex-start;\n}\n.ant-space-align-end {\n align-items: flex-end;\n}\n.ant-space-align-baseline {\n align-items: baseline;\n}\n.ant-space-item:empty {\n display: none;\n}\n.ant-space-rtl {\n direction: rtl;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-popconfirm {\n z-index: 1060;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-progress {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-progress-line {\n position: relative;\n width: 100%;\n font-size: 14px;\n}\n.ant-progress-steps {\n display: inline-block;\n}\n.ant-progress-steps-outer {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n.ant-progress-steps-item {\n flex-shrink: 0;\n min-width: 2px;\n margin-right: 2px;\n background: #f3f3f3;\n transition: all 0.3s;\n}\n.ant-progress-steps-item-active {\n background: #1890ff;\n}\n.ant-progress-small.ant-progress-line,\n.ant-progress-small.ant-progress-line .ant-progress-text .anticon {\n font-size: 12px;\n}\n.ant-progress-outer {\n display: inline-block;\n width: 100%;\n margin-right: 0;\n padding-right: 0;\n}\n.ant-progress-show-info .ant-progress-outer {\n margin-right: calc(-2em - 8px);\n padding-right: calc(2em + 8px);\n}\n.ant-progress-inner {\n position: relative;\n display: inline-block;\n width: 100%;\n overflow: hidden;\n vertical-align: middle;\n background-color: #f5f5f5;\n border-radius: 100px;\n}\n.ant-progress-circle-trail {\n stroke: #f5f5f5;\n}\n.ant-progress-circle-path {\n -webkit-animation: ant-progress-appear 0.3s;\n animation: ant-progress-appear 0.3s;\n}\n.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n stroke: #1890ff;\n}\n.ant-progress-success-bg,\n.ant-progress-bg {\n position: relative;\n background-color: #1890ff;\n border-radius: 100px;\n transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;\n}\n.ant-progress-success-bg {\n position: absolute;\n top: 0;\n left: 0;\n background-color: #52c41a;\n}\n.ant-progress-text {\n display: inline-block;\n width: 2em;\n margin-left: 8px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 1em;\n line-height: 1;\n white-space: nowrap;\n text-align: left;\n vertical-align: middle;\n word-break: normal;\n}\n.ant-progress-text .anticon {\n font-size: 14px;\n}\n.ant-progress-status-active .ant-progress-bg::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: #fff;\n border-radius: 10px;\n opacity: 0;\n -webkit-animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;\n animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;\n content: '';\n}\n.ant-progress-status-exception .ant-progress-bg {\n background-color: #ff4d4f;\n}\n.ant-progress-status-exception .ant-progress-text {\n color: #ff4d4f;\n}\n.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n stroke: #ff4d4f;\n}\n.ant-progress-status-success .ant-progress-bg {\n background-color: #52c41a;\n}\n.ant-progress-status-success .ant-progress-text {\n color: #52c41a;\n}\n.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n stroke: #52c41a;\n}\n.ant-progress-circle .ant-progress-inner {\n position: relative;\n line-height: 1;\n background-color: transparent;\n}\n.ant-progress-circle .ant-progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 100%;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 1em;\n line-height: 1;\n white-space: normal;\n text-align: center;\n transform: translate(-50%, -50%);\n}\n.ant-progress-circle .ant-progress-text .anticon {\n font-size: 1.16666667em;\n}\n.ant-progress-circle.ant-progress-status-exception .ant-progress-text {\n color: #ff4d4f;\n}\n.ant-progress-circle.ant-progress-status-success .ant-progress-text {\n color: #52c41a;\n}\n@-webkit-keyframes ant-progress-active {\n 0% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.1;\n }\n 20% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.5;\n }\n 100% {\n transform: translateX(0) scaleX(1);\n opacity: 0;\n }\n}\n@keyframes ant-progress-active {\n 0% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.1;\n }\n 20% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.5;\n }\n 100% {\n transform: translateX(0) scaleX(1);\n opacity: 0;\n }\n}\n.ant-progress-rtl {\n direction: rtl;\n}\n.ant-progress-rtl.ant-progress-show-info .ant-progress-outer {\n margin-right: 0;\n margin-left: calc(-2em - 8px);\n padding-right: 0;\n padding-left: calc(2em + 8px);\n}\n.ant-progress-rtl .ant-progress-success-bg {\n right: 0;\n left: auto;\n}\n.ant-progress-rtl.ant-progress-line .ant-progress-text,\n.ant-progress-rtl.ant-progress-steps .ant-progress-text {\n margin-right: 8px;\n margin-left: 0;\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-rate {\n box-sizing: border-box;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n font-feature-settings: 'tnum';\n display: inline-block;\n margin: 0;\n padding: 0;\n color: #fadb14;\n font-size: 20px;\n line-height: unset;\n list-style: none;\n outline: none;\n}\n.ant-rate-disabled .ant-rate-star {\n cursor: default;\n}\n.ant-rate-disabled .ant-rate-star > div:hover {\n transform: scale(1);\n}\n.ant-rate-star {\n position: relative;\n display: inline-block;\n color: inherit;\n cursor: pointer;\n}\n.ant-rate-star:not(:last-child) {\n margin-right: 8px;\n}\n.ant-rate-star > div {\n transition: all 0.3s, outline 0s;\n}\n.ant-rate-star > div:hover {\n transform: scale(1.1);\n}\n.ant-rate-star > div:focus {\n outline: 0;\n}\n.ant-rate-star > div:focus-visible {\n outline: 1px dashed #fadb14;\n transform: scale(1.1);\n}\n.ant-rate-star-first,\n.ant-rate-star-second {\n color: #f0f0f0;\n transition: all 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-rate-star-first .anticon,\n.ant-rate-star-second .anticon {\n vertical-align: middle;\n}\n.ant-rate-star-first {\n position: absolute;\n top: 0;\n left: 0;\n width: 50%;\n height: 100%;\n overflow: hidden;\n opacity: 0;\n}\n.ant-rate-star-half .ant-rate-star-first,\n.ant-rate-star-half .ant-rate-star-second {\n opacity: 1;\n}\n.ant-rate-star-half .ant-rate-star-first,\n.ant-rate-star-full .ant-rate-star-second {\n color: inherit;\n}\n.ant-rate-text {\n display: inline-block;\n margin: 0 8px;\n font-size: 14px;\n}\n.ant-rate-rtl {\n direction: rtl;\n}\n.ant-rate-rtl .ant-rate-star:not(:last-child) {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-rate-rtl .ant-rate-star-first {\n right: 0;\n left: auto;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-result {\n padding: 48px 32px;\n}\n.ant-result-success .ant-result-icon > .anticon {\n color: #52c41a;\n}\n.ant-result-error .ant-result-icon > .anticon {\n color: #ff4d4f;\n}\n.ant-result-info .ant-result-icon > .anticon {\n color: #1890ff;\n}\n.ant-result-warning .ant-result-icon > .anticon {\n color: #faad14;\n}\n.ant-result-image {\n width: 250px;\n height: 295px;\n margin: auto;\n}\n.ant-result-icon {\n margin-bottom: 24px;\n text-align: center;\n}\n.ant-result-icon > .anticon {\n font-size: 72px;\n}\n.ant-result-title {\n color: rgba(0, 0, 0, 0.85);\n font-size: 24px;\n line-height: 1.8;\n text-align: center;\n}\n.ant-result-subtitle {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n line-height: 1.6;\n text-align: center;\n}\n.ant-result-extra {\n margin: 24px 0 0 0;\n text-align: center;\n}\n.ant-result-extra > * {\n margin-right: 8px;\n}\n.ant-result-extra > *:last-child {\n margin-right: 0;\n}\n.ant-result-content {\n margin-top: 24px;\n padding: 24px 40px;\n background-color: #fafafa;\n}\n.ant-result-rtl {\n direction: rtl;\n}\n.ant-result-rtl .ant-result-extra > * {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-result-rtl .ant-result-extra > *:last-child {\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.segmented-disabled-item,\n.segmented-disabled-item:hover,\n.segmented-disabled-item:focus {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.segmented-item-selected {\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n}\n.segmented-text-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: keep-all;\n}\n.ant-segmented {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n padding: 2px;\n color: rgba(0, 0, 0, 0.65);\n background-color: rgba(0, 0, 0, 0.04);\n border-radius: 2px;\n transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-segmented-group {\n position: relative;\n display: flex;\n align-items: stretch;\n justify-items: flex-start;\n width: 100%;\n}\n.ant-segmented.ant-segmented-block {\n display: flex;\n}\n.ant-segmented.ant-segmented-block .ant-segmented-item {\n flex: 1;\n min-width: 0;\n}\n.ant-segmented:not(.ant-segmented-disabled):hover,\n.ant-segmented:not(.ant-segmented-disabled):focus {\n background-color: rgba(0, 0, 0, 0.06);\n}\n.ant-segmented-item {\n position: relative;\n text-align: center;\n cursor: pointer;\n transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-segmented-item-selected {\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n color: #262626;\n}\n.ant-segmented-item:hover,\n.ant-segmented-item:focus {\n color: #262626;\n}\n.ant-segmented-item-label {\n min-height: 28px;\n padding: 0 11px;\n line-height: 28px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: keep-all;\n}\n.ant-segmented-item-icon + * {\n margin-left: 6px;\n}\n.ant-segmented-item-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n}\n.ant-segmented.ant-segmented-lg .ant-segmented-item-label {\n min-height: 36px;\n padding: 0 11px;\n font-size: 16px;\n line-height: 36px;\n}\n.ant-segmented.ant-segmented-sm .ant-segmented-item-label {\n min-height: 20px;\n padding: 0 7px;\n line-height: 20px;\n}\n.ant-segmented-item-disabled,\n.ant-segmented-item-disabled:hover,\n.ant-segmented-item-disabled:focus {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-segmented-thumb {\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n padding: 4px 0;\n}\n.ant-segmented-thumb-motion-appear-active {\n transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n will-change: transform, width;\n}\n.ant-segmented.ant-segmented-rtl {\n direction: rtl;\n}\n.ant-segmented.ant-segmented-rtl .ant-segmented-item-icon {\n margin-right: 0;\n margin-left: 6px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-slider {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n height: 12px;\n margin: 10px 6px 10px;\n padding: 4px 0;\n cursor: pointer;\n touch-action: none;\n}\n.ant-slider-vertical {\n width: 12px;\n height: 100%;\n margin: 6px 10px;\n padding: 0 4px;\n}\n.ant-slider-vertical .ant-slider-rail {\n width: 4px;\n height: 100%;\n}\n.ant-slider-vertical .ant-slider-track {\n width: 4px;\n}\n.ant-slider-vertical .ant-slider-handle {\n margin-top: -6px;\n margin-left: -5px;\n}\n.ant-slider-vertical .ant-slider-mark {\n top: 0;\n left: 12px;\n width: 18px;\n height: 100%;\n}\n.ant-slider-vertical .ant-slider-mark-text {\n left: 4px;\n white-space: nowrap;\n}\n.ant-slider-vertical .ant-slider-step {\n width: 4px;\n height: 100%;\n}\n.ant-slider-vertical .ant-slider-dot {\n top: auto;\n margin-left: -2px;\n}\n.ant-slider-tooltip .ant-tooltip-inner {\n min-width: unset;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-handle {\n margin-right: -5px;\n margin-left: 0;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-mark {\n right: 12px;\n left: auto;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text {\n right: 4px;\n left: auto;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-dot {\n right: 2px;\n left: auto;\n}\n.ant-slider-with-marks {\n margin-bottom: 28px;\n}\n.ant-slider-rail {\n position: absolute;\n width: 100%;\n height: 4px;\n background-color: #f5f5f5;\n border-radius: 2px;\n transition: background-color 0.3s;\n}\n.ant-slider-track {\n position: absolute;\n height: 4px;\n background-color: #91d5ff;\n border-radius: 2px;\n transition: background-color 0.3s;\n}\n.ant-slider-handle {\n position: absolute;\n width: 14px;\n height: 14px;\n margin-top: -5px;\n background-color: #fff;\n border: solid 2px #91d5ff;\n border-radius: 50%;\n box-shadow: 0;\n cursor: pointer;\n transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n}\n.ant-slider-handle-dragging {\n z-index: 1;\n}\n.ant-slider-handle:focus {\n border-color: #46a6ff;\n outline: none;\n box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.12);\n}\n.ant-slider-handle.ant-tooltip-open {\n border-color: #1890ff;\n}\n.ant-slider-handle::after {\n position: absolute;\n top: -6px;\n right: -6px;\n bottom: -6px;\n left: -6px;\n content: '';\n}\n.ant-slider:hover .ant-slider-rail {\n background-color: #e1e1e1;\n}\n.ant-slider:hover .ant-slider-track {\n background-color: #69c0ff;\n}\n.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {\n border-color: #69c0ff;\n}\n.ant-slider-mark {\n position: absolute;\n top: 14px;\n left: 0;\n width: 100%;\n font-size: 14px;\n}\n.ant-slider-mark-text {\n position: absolute;\n display: inline-block;\n color: rgba(0, 0, 0, 0.45);\n text-align: center;\n word-break: keep-all;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-slider-mark-text-active {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-slider-step {\n position: absolute;\n width: 100%;\n height: 4px;\n background: transparent;\n pointer-events: none;\n}\n.ant-slider-dot {\n position: absolute;\n top: -2px;\n width: 8px;\n height: 8px;\n background-color: #fff;\n border: 2px solid #f0f0f0;\n border-radius: 50%;\n cursor: pointer;\n}\n.ant-slider-dot-active {\n border-color: #8cc8ff;\n}\n.ant-slider-disabled {\n cursor: not-allowed;\n}\n.ant-slider-disabled .ant-slider-rail {\n background-color: #f5f5f5 !important;\n}\n.ant-slider-disabled .ant-slider-track {\n background-color: rgba(0, 0, 0, 0.25) !important;\n}\n.ant-slider-disabled .ant-slider-handle,\n.ant-slider-disabled .ant-slider-dot {\n background-color: #fff;\n border-color: rgba(0, 0, 0, 0.25) !important;\n box-shadow: none;\n cursor: not-allowed;\n}\n.ant-slider-disabled .ant-slider-mark-text,\n.ant-slider-disabled .ant-slider-dot {\n cursor: not-allowed !important;\n}\n.ant-slider-rtl {\n direction: rtl;\n}\n.ant-slider-rtl .ant-slider-mark {\n right: 0;\n left: auto;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-statistic {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n}\n.ant-statistic-title {\n margin-bottom: 4px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-statistic-skeleton {\n padding-top: 16px;\n}\n.ant-statistic-content {\n color: rgba(0, 0, 0, 0.85);\n font-size: 24px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n}\n.ant-statistic-content-value {\n display: inline-block;\n direction: ltr;\n}\n.ant-statistic-content-prefix,\n.ant-statistic-content-suffix {\n display: inline-block;\n}\n.ant-statistic-content-prefix {\n margin-right: 4px;\n}\n.ant-statistic-content-suffix {\n margin-left: 4px;\n}\n.ant-statistic-rtl {\n direction: rtl;\n}\n.ant-statistic-rtl .ant-statistic-content-prefix {\n margin-right: 0;\n margin-left: 4px;\n}\n.ant-statistic-rtl .ant-statistic-content-suffix {\n margin-right: 4px;\n margin-left: 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-steps {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: flex;\n width: 100%;\n font-size: 0;\n text-align: initial;\n}\n.ant-steps-item {\n position: relative;\n display: inline-block;\n flex: 1;\n overflow: hidden;\n vertical-align: top;\n}\n.ant-steps-item-container {\n outline: none;\n}\n.ant-steps-item:last-child {\n flex: none;\n}\n.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-tail,\n.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n display: none;\n}\n.ant-steps-item-icon,\n.ant-steps-item-content {\n display: inline-block;\n vertical-align: top;\n}\n.ant-steps-item-icon {\n width: 32px;\n height: 32px;\n margin: 0 8px 0 0;\n font-size: 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n line-height: 32px;\n text-align: center;\n border: 1px solid rgba(0, 0, 0, 0.25);\n border-radius: 32px;\n transition: background-color 0.3s, border-color 0.3s;\n}\n.ant-steps-item-icon .ant-steps-icon {\n position: relative;\n top: -0.5px;\n color: #1890ff;\n line-height: 1;\n}\n.ant-steps-item-tail {\n position: absolute;\n top: 12px;\n left: 0;\n width: 100%;\n padding: 0 10px;\n}\n.ant-steps-item-tail::after {\n display: inline-block;\n width: 100%;\n height: 1px;\n background: #f0f0f0;\n border-radius: 1px;\n transition: background 0.3s;\n content: '';\n}\n.ant-steps-item-title {\n position: relative;\n display: inline-block;\n padding-right: 16px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 16px;\n line-height: 32px;\n}\n.ant-steps-item-title::after {\n position: absolute;\n top: 16px;\n left: 100%;\n display: block;\n width: 9999px;\n height: 1px;\n background: #f0f0f0;\n content: '';\n}\n.ant-steps-item-subtitle {\n display: inline;\n margin-left: 8px;\n color: rgba(0, 0, 0, 0.45);\n font-weight: normal;\n font-size: 14px;\n}\n.ant-steps-item-description {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-steps-item-wait .ant-steps-item-icon {\n background-color: #fff;\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n background: rgba(0, 0, 0, 0.25);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-tail::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item-process .ant-steps-item-icon {\n background-color: #fff;\n border-color: #1890ff;\n}\n.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {\n color: #1890ff;\n}\n.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n background: #1890ff;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-tail::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-icon {\n background: #1890ff;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-icon .ant-steps-icon {\n color: #fff;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-title {\n font-weight: 500;\n}\n.ant-steps-item-finish .ant-steps-item-icon {\n background-color: #fff;\n border-color: #1890ff;\n}\n.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon {\n color: #1890ff;\n}\n.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n background: #1890ff;\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n background-color: #1890ff;\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-tail::after {\n background-color: #1890ff;\n}\n.ant-steps-item-error .ant-steps-item-icon {\n background-color: #fff;\n border-color: #ff4d4f;\n}\n.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon {\n color: #ff4d4f;\n}\n.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n background: #ff4d4f;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n color: #ff4d4f;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n color: #ff4d4f;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-tail::after {\n background-color: #f0f0f0;\n}\n.ant-steps-item.ant-steps-next-error .ant-steps-item-title::after {\n background: #ff4d4f;\n}\n.ant-steps-item-disabled {\n cursor: not-allowed;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] {\n cursor: pointer;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-title,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-subtitle,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-description,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-icon .ant-steps-icon {\n transition: color 0.3s;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-title,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-subtitle,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-description {\n color: #1890ff;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon {\n border-color: #1890ff;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon .ant-steps-icon {\n color: #1890ff;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n padding-left: 16px;\n white-space: nowrap;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n padding-left: 0;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title {\n padding-right: 0;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail {\n display: none;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description {\n max-width: 140px;\n white-space: normal;\n}\n.ant-steps-item-custom > .ant-steps-item-container > .ant-steps-item-icon {\n height: auto;\n background: none;\n border: 0;\n}\n.ant-steps-item-custom > .ant-steps-item-container > .ant-steps-item-icon > .ant-steps-icon {\n top: 0px;\n left: 0.5px;\n width: 32px;\n height: 32px;\n font-size: 24px;\n line-height: 32px;\n}\n.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {\n color: #1890ff;\n}\n.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon {\n width: auto;\n background: none;\n}\n.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n padding-left: 12px;\n}\n.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n padding-left: 0;\n}\n.ant-steps-small .ant-steps-item-icon {\n width: 24px;\n height: 24px;\n margin: 0 8px 0 0;\n font-size: 12px;\n line-height: 24px;\n text-align: center;\n border-radius: 24px;\n}\n.ant-steps-small .ant-steps-item-title {\n padding-right: 12px;\n font-size: 14px;\n line-height: 24px;\n}\n.ant-steps-small .ant-steps-item-title::after {\n top: 12px;\n}\n.ant-steps-small .ant-steps-item-description {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-steps-small .ant-steps-item-tail {\n top: 8px;\n}\n.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon {\n width: inherit;\n height: inherit;\n line-height: inherit;\n background: none;\n border: 0;\n border-radius: 0;\n}\n.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {\n font-size: 24px;\n line-height: 24px;\n transform: none;\n}\n.ant-steps-vertical {\n display: flex;\n flex-direction: column;\n}\n.ant-steps-vertical > .ant-steps-item {\n display: block;\n flex: 1 0 auto;\n padding-left: 0;\n overflow: visible;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-icon {\n float: left;\n margin-right: 16px;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-content {\n display: block;\n min-height: 48px;\n overflow: hidden;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-title {\n line-height: 32px;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-description {\n padding-bottom: 12px;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n position: absolute;\n top: 0;\n left: 16px;\n width: 1px;\n height: 100%;\n padding: 38px 0 6px;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail::after {\n width: 1px;\n height: 100%;\n}\n.ant-steps-vertical > .ant-steps-item:not(:last-child) > .ant-steps-item-container > .ant-steps-item-tail {\n display: block;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n display: none;\n}\n.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail {\n position: absolute;\n top: 0;\n left: 12px;\n padding: 30px 0 6px;\n}\n.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title {\n line-height: 24px;\n}\n.ant-steps-label-vertical .ant-steps-item {\n overflow: visible;\n}\n.ant-steps-label-vertical .ant-steps-item-tail {\n margin-left: 58px;\n padding: 3.5px 24px;\n}\n.ant-steps-label-vertical .ant-steps-item-content {\n display: block;\n width: 116px;\n margin-top: 8px;\n text-align: center;\n}\n.ant-steps-label-vertical .ant-steps-item-icon {\n display: inline-block;\n margin-left: 42px;\n}\n.ant-steps-label-vertical .ant-steps-item-title {\n padding-right: 0;\n padding-left: 0;\n}\n.ant-steps-label-vertical .ant-steps-item-title::after {\n display: none;\n}\n.ant-steps-label-vertical .ant-steps-item-subtitle {\n display: block;\n margin-bottom: 4px;\n margin-left: 0;\n line-height: 1.5715;\n}\n.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon {\n margin-left: 46px;\n}\n.ant-steps-dot .ant-steps-item-title,\n.ant-steps-dot.ant-steps-small .ant-steps-item-title {\n line-height: 1.5715;\n}\n.ant-steps-dot .ant-steps-item-tail,\n.ant-steps-dot.ant-steps-small .ant-steps-item-tail {\n top: 2px;\n width: 100%;\n margin: 0 0 0 70px;\n padding: 0;\n}\n.ant-steps-dot .ant-steps-item-tail::after,\n.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after {\n width: calc(100% - 20px);\n height: 3px;\n margin-left: 12px;\n}\n.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot {\n left: 2px;\n}\n.ant-steps-dot .ant-steps-item-icon,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n width: 8px;\n height: 8px;\n margin-left: 67px;\n padding-right: 0;\n line-height: 8px;\n background: transparent;\n border: 0;\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n position: relative;\n float: left;\n width: 100%;\n height: 100%;\n border-radius: 100px;\n transition: all 0.3s;\n /* expand hover area */\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after {\n position: absolute;\n top: -12px;\n left: -26px;\n width: 60px;\n height: 32px;\n background: rgba(0, 0, 0, 0.001);\n content: '';\n}\n.ant-steps-dot .ant-steps-item-content,\n.ant-steps-dot.ant-steps-small .ant-steps-item-content {\n width: 140px;\n}\n.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,\n.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon {\n position: relative;\n top: -1px;\n width: 10px;\n height: 10px;\n line-height: 10px;\n background: none;\n}\n.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot {\n left: 0;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon {\n margin-top: 13px;\n margin-left: 0;\n background: none;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n top: 6.5px;\n left: -9px;\n margin: 0;\n padding: 22px 0 4px;\n}\n.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n margin-top: 10px;\n}\n.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n top: 3.5px;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {\n left: 0;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-content {\n width: inherit;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot {\n top: -1px;\n left: -1px;\n}\n.ant-steps-navigation {\n padding-top: 12px;\n}\n.ant-steps-navigation.ant-steps-small .ant-steps-item-container {\n margin-left: -12px;\n}\n.ant-steps-navigation .ant-steps-item {\n overflow: visible;\n text-align: center;\n}\n.ant-steps-navigation .ant-steps-item-container {\n display: inline-block;\n height: 100%;\n margin-left: -16px;\n padding-bottom: 12px;\n text-align: left;\n transition: opacity 0.3s;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content {\n max-width: auto;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title {\n max-width: 100%;\n padding-right: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title::after {\n display: none;\n}\n.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button'] {\n cursor: pointer;\n}\n.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button']:hover {\n opacity: 0.85;\n}\n.ant-steps-navigation .ant-steps-item:last-child {\n flex: 1;\n}\n.ant-steps-navigation .ant-steps-item:last-child::after {\n display: none;\n}\n.ant-steps-navigation .ant-steps-item::after {\n position: absolute;\n top: 50%;\n left: 100%;\n display: inline-block;\n width: 12px;\n height: 12px;\n margin-top: -14px;\n margin-left: -2px;\n border: 1px solid rgba(0, 0, 0, 0.25);\n border-bottom: none;\n border-left: none;\n transform: rotate(45deg);\n content: '';\n}\n.ant-steps-navigation .ant-steps-item::before {\n position: absolute;\n bottom: 0;\n left: 50%;\n display: inline-block;\n width: 0;\n height: 2px;\n background-color: #1890ff;\n transition: width 0.3s, left 0.3s;\n transition-timing-function: ease-out;\n content: '';\n}\n.ant-steps-navigation .ant-steps-item.ant-steps-item-active::before {\n left: 0;\n width: 100%;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item {\n margin-right: 0 !important;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item::before {\n display: none;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item.ant-steps-item-active::before {\n top: 0;\n right: 0;\n left: unset;\n display: block;\n width: 3px;\n height: calc(100% - 24px);\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item::after {\n position: relative;\n top: -2px;\n left: 50%;\n display: block;\n width: 8px;\n height: 8px;\n margin-bottom: 8px;\n text-align: center;\n transform: rotate(135deg);\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n visibility: hidden;\n}\n.ant-steps-navigation.ant-steps-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n visibility: hidden;\n}\n.ant-steps-rtl {\n direction: rtl;\n}\n.ant-steps.ant-steps-rtl .ant-steps-item-icon {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-steps-rtl .ant-steps-item-tail {\n right: 0;\n left: auto;\n}\n.ant-steps-rtl .ant-steps-item-title {\n padding-right: 0;\n padding-left: 16px;\n}\n.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle {\n float: left;\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-steps-rtl .ant-steps-item-title::after {\n right: 100%;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n padding-right: 16px;\n padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n padding-right: 0;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title {\n padding-left: 0;\n}\n.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {\n right: 0.5px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container {\n margin-right: -12px;\n margin-left: 0;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container {\n margin-right: -16px;\n margin-left: 0;\n text-align: right;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title {\n padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item::after {\n right: 100%;\n left: auto;\n margin-right: -2px;\n margin-left: 0;\n transform: rotate(225deg);\n}\n.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n padding-right: 12px;\n padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n padding-right: 0;\n}\n.ant-steps-rtl.ant-steps-small .ant-steps-item-title {\n padding-right: 0;\n padding-left: 12px;\n}\n.ant-steps-rtl.ant-steps-vertical > .ant-steps-item .ant-steps-item-icon {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-steps-rtl.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n right: 16px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail {\n right: 12px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title {\n padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail {\n margin: 0 70px 0 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail::after,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after {\n margin-right: 12px;\n margin-left: 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot {\n right: 2px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n margin-right: 67px;\n margin-left: 0;\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n /* expand hover area */\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n float: right;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after {\n right: -26px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon {\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n right: -9px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {\n right: 0;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot {\n right: -2px;\n left: auto;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child {\n padding-right: 4px;\n padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active {\n padding-right: 4px;\n}\n.ant-steps-with-progress .ant-steps-item {\n padding-top: 4px;\n}\n.ant-steps-with-progress .ant-steps-item .ant-steps-item-tail {\n top: 4px !important;\n}\n.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child {\n padding-bottom: 4px;\n padding-left: 4px;\n}\n.ant-steps-with-progress .ant-steps-item-icon {\n position: relative;\n}\n.ant-steps-with-progress .ant-steps-item-icon .ant-progress {\n position: absolute;\n top: -5px;\n right: -5px;\n bottom: -5px;\n left: -5px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-switch {\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: inline-block;\n box-sizing: border-box;\n min-width: 44px;\n height: 22px;\n line-height: 22px;\n vertical-align: middle;\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.25)), linear-gradient(to right, #fff, #fff);\n border: 0;\n border-radius: 100px;\n cursor: pointer;\n transition: all 0.2s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-switch:focus {\n outline: 0;\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);\n}\n.ant-switch-checked:focus {\n box-shadow: 0 0 0 2px #e6f7ff;\n}\n.ant-switch:focus:hover {\n box-shadow: none;\n}\n.ant-switch-checked {\n background: #1890ff;\n}\n.ant-switch-loading,\n.ant-switch-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n.ant-switch-loading *,\n.ant-switch-disabled * {\n box-shadow: none;\n cursor: not-allowed;\n}\n.ant-switch-inner {\n display: block;\n margin: 0 7px 0 25px;\n color: #fff;\n font-size: 12px;\n transition: margin 0.2s;\n}\n.ant-switch-checked .ant-switch-inner {\n margin: 0 25px 0 7px;\n}\n.ant-switch-handle {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n transition: all 0.2s ease-in-out;\n}\n.ant-switch-handle::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: #fff;\n border-radius: 9px;\n box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);\n transition: all 0.2s ease-in-out;\n content: '';\n}\n.ant-switch-checked .ant-switch-handle {\n left: calc(100% - 18px - 2px);\n}\n.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle::before {\n right: -30%;\n left: 0;\n}\n.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle::before {\n right: 0;\n left: -30%;\n}\n.ant-switch-loading-icon.anticon {\n position: relative;\n top: 2px;\n color: rgba(0, 0, 0, 0.65);\n vertical-align: top;\n}\n.ant-switch-checked .ant-switch-loading-icon {\n color: #1890ff;\n}\n.ant-switch-small {\n min-width: 28px;\n height: 16px;\n line-height: 16px;\n}\n.ant-switch-small .ant-switch-inner {\n margin: 0 5px 0 18px;\n font-size: 12px;\n}\n.ant-switch-small .ant-switch-handle {\n width: 12px;\n height: 12px;\n}\n.ant-switch-small .ant-switch-loading-icon {\n top: 1.5px;\n font-size: 9px;\n}\n.ant-switch-small.ant-switch-checked .ant-switch-inner {\n margin: 0 18px 0 5px;\n}\n.ant-switch-small.ant-switch-checked .ant-switch-handle {\n left: calc(100% - 12px - 2px);\n}\n.ant-switch-rtl {\n direction: rtl;\n}\n.ant-switch-rtl .ant-switch-inner {\n margin: 0 25px 0 7px;\n}\n.ant-switch-rtl .ant-switch-handle {\n right: 2px;\n left: auto;\n}\n.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle::before {\n right: 0;\n left: -30%;\n}\n.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle::before {\n right: -30%;\n left: 0;\n}\n.ant-switch-rtl.ant-switch-checked .ant-switch-inner {\n margin: 0 7px 0 25px;\n}\n.ant-switch-rtl.ant-switch-checked .ant-switch-handle {\n right: calc(100% - 18px - 2px);\n}\n.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle {\n right: calc(100% - 12px - 2px);\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-table.ant-table-middle {\n font-size: 14px;\n}\n.ant-table.ant-table-middle .ant-table-title,\n.ant-table.ant-table-middle .ant-table-footer,\n.ant-table.ant-table-middle .ant-table-thead > tr > th,\n.ant-table.ant-table-middle .ant-table-tbody > tr > td,\n.ant-table.ant-table-middle tfoot > tr > th,\n.ant-table.ant-table-middle tfoot > tr > td {\n padding: 12px 8px;\n}\n.ant-table.ant-table-middle .ant-table-filter-trigger {\n margin-right: -4px;\n}\n.ant-table.ant-table-middle .ant-table-expanded-row-fixed {\n margin: -12px -8px;\n}\n.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table {\n margin: -12px -8px -12px 40px;\n}\n.ant-table.ant-table-middle .ant-table-selection-column {\n -webkit-padding-start: 2px;\n padding-inline-start: 2px;\n}\n.ant-table.ant-table-small {\n font-size: 14px;\n}\n.ant-table.ant-table-small .ant-table-title,\n.ant-table.ant-table-small .ant-table-footer,\n.ant-table.ant-table-small .ant-table-thead > tr > th,\n.ant-table.ant-table-small .ant-table-tbody > tr > td,\n.ant-table.ant-table-small tfoot > tr > th,\n.ant-table.ant-table-small tfoot > tr > td {\n padding: 8px 8px;\n}\n.ant-table.ant-table-small .ant-table-filter-trigger {\n margin-right: -4px;\n}\n.ant-table.ant-table-small .ant-table-expanded-row-fixed {\n margin: -8px -8px;\n}\n.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table {\n margin: -8px -8px -8px 40px;\n}\n.ant-table.ant-table-small .ant-table-selection-column {\n -webkit-padding-start: 2px;\n padding-inline-start: 2px;\n}\n.ant-table.ant-table-bordered > .ant-table-title {\n border: 1px solid #f0f0f0;\n border-bottom: 0;\n}\n.ant-table.ant-table-bordered > .ant-table-container {\n border-left: 1px solid #f0f0f0;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > td {\n border-right: 1px solid #f0f0f0;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr:not(:last-child) > th {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th::before {\n background-color: transparent !important;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > .ant-table-cell-fix-right-first::after {\n border-right: 1px solid #f0f0f0;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n margin: -16px -17px;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed::after {\n position: absolute;\n top: 0;\n right: 1px;\n bottom: 0;\n border-right: 1px solid #f0f0f0;\n content: '';\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n border-top: 1px solid #f0f0f0;\n}\n.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-expanded-row > td,\n.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-placeholder > td {\n border-right: 0;\n}\n.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n margin: -12px -9px;\n}\n.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n margin: -8px -9px;\n}\n.ant-table.ant-table-bordered > .ant-table-footer {\n border: 1px solid #f0f0f0;\n border-top: 0;\n}\n.ant-table-cell .ant-table-container:first-child {\n border-top: 0;\n}\n.ant-table-cell-scrollbar:not([rowspan]) {\n box-shadow: 0 1px 0 1px #fafafa;\n}\n.ant-table-wrapper {\n clear: both;\n max-width: 100%;\n}\n.ant-table-wrapper::before {\n display: table;\n content: '';\n}\n.ant-table-wrapper::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-table {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n font-size: 14px;\n background: #fff;\n border-radius: 2px;\n}\n.ant-table table {\n width: 100%;\n text-align: left;\n border-radius: 2px 2px 0 0;\n border-collapse: separate;\n border-spacing: 0;\n}\n.ant-table-thead > tr > th,\n.ant-table-tbody > tr > td,\n.ant-table tfoot > tr > th,\n.ant-table tfoot > tr > td {\n position: relative;\n padding: 16px 16px;\n overflow-wrap: break-word;\n}\n.ant-table-cell-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: keep-all;\n}\n.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,\n.ant-table-cell-ellipsis.ant-table-cell-fix-right-first {\n overflow: visible;\n}\n.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,\n.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ant-table-cell-ellipsis .ant-table-column-title {\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: keep-all;\n}\n.ant-table-title {\n padding: 16px 16px;\n}\n.ant-table-footer {\n padding: 16px 16px;\n color: rgba(0, 0, 0, 0.85);\n background: #fafafa;\n}\n.ant-table-thead > tr > th {\n position: relative;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n text-align: left;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.3s ease;\n}\n.ant-table-thead > tr > th[colspan]:not([colspan='1']) {\n text-align: center;\n}\n.ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before {\n position: absolute;\n top: 50%;\n right: 0;\n width: 1px;\n height: 1.6em;\n background-color: rgba(0, 0, 0, 0.06);\n transform: translateY(-50%);\n transition: background-color 0.3s;\n content: '';\n}\n.ant-table-thead > tr:not(:last-child) > th[colspan] {\n border-bottom: 0;\n}\n.ant-table-tbody > tr > td {\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.3s;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table {\n margin: -16px -16px -16px 32px;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td {\n border-bottom: 0;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child,\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child {\n border-radius: 0;\n}\n.ant-table-tbody > tr.ant-table-row:hover > td,\n.ant-table-tbody > tr > td.ant-table-cell-row-hover {\n background: #fafafa;\n}\n.ant-table-tbody > tr.ant-table-row-selected > td {\n background: #e6f7ff;\n border-color: rgba(0, 0, 0, 0.03);\n}\n.ant-table-tbody > tr.ant-table-row-selected:hover > td {\n background: #dcf4ff;\n}\n.ant-table-summary {\n position: relative;\n z-index: 2;\n background: #fff;\n}\ndiv.ant-table-summary {\n box-shadow: 0 -1px 0 #f0f0f0;\n}\n.ant-table-summary > tr > th,\n.ant-table-summary > tr > td {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-table-pagination.ant-pagination {\n margin: 16px 0;\n}\n.ant-table-pagination {\n display: flex;\n flex-wrap: wrap;\n row-gap: 8px;\n}\n.ant-table-pagination > * {\n flex: none;\n}\n.ant-table-pagination-left {\n justify-content: flex-start;\n}\n.ant-table-pagination-center {\n justify-content: center;\n}\n.ant-table-pagination-right {\n justify-content: flex-end;\n}\n.ant-table-thead th.ant-table-column-has-sorters {\n outline: none;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-table-thead th.ant-table-column-has-sorters:hover {\n background: rgba(0, 0, 0, 0.04);\n}\n.ant-table-thead th.ant-table-column-has-sorters:hover::before {\n background-color: transparent !important;\n}\n.ant-table-thead th.ant-table-column-has-sorters:focus-visible {\n color: #1890ff;\n}\n.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,\n.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover {\n background: #f5f5f5;\n}\n.ant-table-thead th.ant-table-column-sort {\n background: #f5f5f5;\n}\n.ant-table-thead th.ant-table-column-sort::before {\n background-color: transparent !important;\n}\ntd.ant-table-column-sort {\n background: #fafafa;\n}\n.ant-table-column-title {\n position: relative;\n z-index: 1;\n flex: 1;\n}\n.ant-table-column-sorters {\n display: flex;\n flex: auto;\n align-items: center;\n justify-content: space-between;\n}\n.ant-table-column-sorters::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n content: '';\n}\n.ant-table-column-sorter {\n margin-left: 4px;\n color: #bfbfbf;\n font-size: 0;\n transition: color 0.3s;\n}\n.ant-table-column-sorter-inner {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n}\n.ant-table-column-sorter-up,\n.ant-table-column-sorter-down {\n font-size: 11px;\n}\n.ant-table-column-sorter-up.active,\n.ant-table-column-sorter-down.active {\n color: #1890ff;\n}\n.ant-table-column-sorter-up + .ant-table-column-sorter-down {\n margin-top: -0.3em;\n}\n.ant-table-column-sorters:hover .ant-table-column-sorter {\n color: #a6a6a6;\n}\n.ant-table-filter-column {\n display: flex;\n justify-content: space-between;\n}\n.ant-table-filter-trigger {\n position: relative;\n display: flex;\n align-items: center;\n margin: -4px -8px -4px 4px;\n padding: 0 4px;\n color: #bfbfbf;\n font-size: 12px;\n border-radius: 2px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-table-filter-trigger:hover {\n color: rgba(0, 0, 0, 0.45);\n background: rgba(0, 0, 0, 0.04);\n}\n.ant-table-filter-trigger.active {\n color: #1890ff;\n}\n.ant-table-filter-dropdown {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n min-width: 120px;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n.ant-table-filter-dropdown .ant-dropdown-menu {\n max-height: 264px;\n overflow-x: hidden;\n border: 0;\n box-shadow: none;\n}\n.ant-table-filter-dropdown .ant-dropdown-menu:empty::after {\n display: block;\n padding: 8px 0;\n color: rgba(0, 0, 0, 0.25);\n font-size: 12px;\n text-align: center;\n content: 'Not Found';\n}\n.ant-table-filter-dropdown-tree {\n padding: 8px 8px 0;\n}\n.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover {\n background-color: #f5f5f5;\n}\n.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,\n.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover {\n background-color: #bae7ff;\n}\n.ant-table-filter-dropdown-search {\n padding: 8px;\n border-bottom: 1px #f0f0f0 solid;\n}\n.ant-table-filter-dropdown-search-input input {\n min-width: 140px;\n}\n.ant-table-filter-dropdown-search-input .anticon {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-table-filter-dropdown-checkall {\n width: 100%;\n margin-bottom: 4px;\n margin-left: 4px;\n}\n.ant-table-filter-dropdown-submenu > ul {\n max-height: calc(100vh - 130px);\n overflow-x: hidden;\n overflow-y: auto;\n}\n.ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span {\n padding-left: 8px;\n}\n.ant-table-filter-dropdown-btns {\n display: flex;\n justify-content: space-between;\n padding: 7px 8px;\n overflow: hidden;\n background-color: inherit;\n border-top: 1px solid #f0f0f0;\n}\n.ant-table-selection-col {\n width: 32px;\n}\n.ant-table-bordered .ant-table-selection-col {\n width: 50px;\n}\ntable tr th.ant-table-selection-column,\ntable tr td.ant-table-selection-column {\n padding-right: 8px;\n padding-left: 8px;\n text-align: center;\n}\ntable tr th.ant-table-selection-column .ant-radio-wrapper,\ntable tr td.ant-table-selection-column .ant-radio-wrapper {\n margin-right: 0;\n}\ntable tr th.ant-table-selection-column.ant-table-cell-fix-left {\n z-index: 3;\n}\ntable tr th.ant-table-selection-column::after {\n background-color: transparent !important;\n}\n.ant-table-selection {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n}\n.ant-table-selection-extra {\n position: absolute;\n top: 0;\n z-index: 1;\n cursor: pointer;\n transition: all 0.3s;\n -webkit-margin-start: 100%;\n margin-inline-start: 100%;\n -webkit-padding-start: 4px;\n padding-inline-start: 4px;\n}\n.ant-table-selection-extra .anticon {\n color: #bfbfbf;\n font-size: 10px;\n}\n.ant-table-selection-extra .anticon:hover {\n color: #a6a6a6;\n}\n.ant-table-expand-icon-col {\n width: 48px;\n}\n.ant-table-row-expand-icon-cell {\n text-align: center;\n}\n.ant-table-row-expand-icon-cell .ant-table-row-expand-icon {\n display: inline-flex;\n float: none;\n vertical-align: sub;\n}\n.ant-table-row-indent {\n float: left;\n height: 1px;\n}\n.ant-table-row-expand-icon {\n color: #1890ff;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.3s;\n position: relative;\n float: left;\n box-sizing: border-box;\n width: 17px;\n height: 17px;\n padding: 0;\n color: inherit;\n line-height: 17px;\n background: #fff;\n border: 1px solid #f0f0f0;\n border-radius: 2px;\n outline: none;\n transform: scale(0.94117647);\n transition: all 0.3s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-table-row-expand-icon:focus,\n.ant-table-row-expand-icon:hover {\n color: #40a9ff;\n}\n.ant-table-row-expand-icon:active {\n color: #096dd9;\n}\n.ant-table-row-expand-icon:focus,\n.ant-table-row-expand-icon:hover,\n.ant-table-row-expand-icon:active {\n border-color: currentcolor;\n}\n.ant-table-row-expand-icon::before,\n.ant-table-row-expand-icon::after {\n position: absolute;\n background: currentcolor;\n transition: transform 0.3s ease-out;\n content: '';\n}\n.ant-table-row-expand-icon::before {\n top: 7px;\n right: 3px;\n left: 3px;\n height: 1px;\n}\n.ant-table-row-expand-icon::after {\n top: 3px;\n bottom: 3px;\n left: 7px;\n width: 1px;\n transform: rotate(90deg);\n}\n.ant-table-row-expand-icon-collapsed::before {\n transform: rotate(-180deg);\n}\n.ant-table-row-expand-icon-collapsed::after {\n transform: rotate(0deg);\n}\n.ant-table-row-expand-icon-spaced {\n background: transparent;\n border: 0;\n visibility: hidden;\n}\n.ant-table-row-expand-icon-spaced::before,\n.ant-table-row-expand-icon-spaced::after {\n display: none;\n content: none;\n}\n.ant-table-row-indent + .ant-table-row-expand-icon {\n margin-top: 2.5005px;\n margin-right: 8px;\n}\ntr.ant-table-expanded-row > td,\ntr.ant-table-expanded-row:hover > td {\n background: #fbfbfb;\n}\ntr.ant-table-expanded-row .ant-descriptions-view {\n display: flex;\n}\ntr.ant-table-expanded-row .ant-descriptions-view table {\n flex: auto;\n width: auto;\n}\n.ant-table .ant-table-expanded-row-fixed {\n position: relative;\n margin: -16px -16px;\n padding: 16px 16px;\n}\n.ant-table-tbody > tr.ant-table-placeholder {\n text-align: center;\n}\n.ant-table-empty .ant-table-tbody > tr.ant-table-placeholder {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-table-tbody > tr.ant-table-placeholder:hover > td {\n background: #fff;\n}\n.ant-table-cell-fix-left,\n.ant-table-cell-fix-right {\n position: -webkit-sticky !important;\n position: sticky !important;\n z-index: 2;\n background: #fff;\n}\n.ant-table-cell-fix-left-first::after,\n.ant-table-cell-fix-left-last::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n width: 30px;\n transform: translateX(100%);\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-table-cell-fix-left-all::after {\n display: none;\n}\n.ant-table-cell-fix-right-first::after,\n.ant-table-cell-fix-right-last::after {\n position: absolute;\n top: 0;\n bottom: -1px;\n left: 0;\n width: 30px;\n transform: translateX(-100%);\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-table .ant-table-container::before,\n.ant-table .ant-table-container::after {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 2;\n width: 30px;\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-table .ant-table-container::before {\n left: 0;\n}\n.ant-table .ant-table-container::after {\n right: 0;\n}\n.ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container {\n position: relative;\n}\n.ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container::before {\n box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15);\n}\n.ant-table-ping-left .ant-table-cell-fix-left-first::after,\n.ant-table-ping-left .ant-table-cell-fix-left-last::after {\n box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15);\n}\n.ant-table-ping-left .ant-table-cell-fix-left-last::before {\n background-color: transparent !important;\n}\n.ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container {\n position: relative;\n}\n.ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container::after {\n box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15);\n}\n.ant-table-ping-right .ant-table-cell-fix-right-first::after,\n.ant-table-ping-right .ant-table-cell-fix-right-last::after {\n box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15);\n}\n.ant-table-sticky-holder {\n position: -webkit-sticky;\n position: sticky;\n z-index: calc(2 + 1);\n background: #fff;\n}\n.ant-table-sticky-scroll {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: calc(2 + 1);\n display: flex;\n align-items: center;\n background: #ffffff;\n border-top: 1px solid #f0f0f0;\n opacity: 0.6;\n}\n.ant-table-sticky-scroll:hover {\n transform-origin: center bottom;\n}\n.ant-table-sticky-scroll-bar {\n height: 8px;\n background-color: rgba(0, 0, 0, 0.35);\n border-radius: 4px;\n}\n.ant-table-sticky-scroll-bar:hover {\n background-color: rgba(0, 0, 0, 0.8);\n}\n.ant-table-sticky-scroll-bar-active {\n background-color: rgba(0, 0, 0, 0.8);\n}\n@media all and (-ms-high-contrast: none) {\n .ant-table-ping-left .ant-table-cell-fix-left-last::after {\n box-shadow: none !important;\n }\n .ant-table-ping-right .ant-table-cell-fix-right-first::after {\n box-shadow: none !important;\n }\n}\n.ant-table {\n /* title + table */\n /* table */\n /* table + footer */\n}\n.ant-table-title {\n border-radius: 2px 2px 0 0;\n}\n.ant-table-title + .ant-table-container {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.ant-table-title + .ant-table-container table {\n border-radius: 0;\n}\n.ant-table-title + .ant-table-container table > thead > tr:first-child th:first-child {\n border-radius: 0;\n}\n.ant-table-title + .ant-table-container table > thead > tr:first-child th:last-child {\n border-radius: 0;\n}\n.ant-table-container {\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n}\n.ant-table-container table > thead > tr:first-child th:first-child {\n border-top-left-radius: 2px;\n}\n.ant-table-container table > thead > tr:first-child th:last-child {\n border-top-right-radius: 2px;\n}\n.ant-table-footer {\n border-radius: 0 0 2px 2px;\n}\n.ant-table-wrapper-rtl {\n direction: rtl;\n}\n.ant-table-rtl {\n direction: rtl;\n}\n.ant-table-wrapper-rtl .ant-table table {\n text-align: right;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th[colspan]:not([colspan='1']) {\n text-align: center;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before {\n right: auto;\n left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th {\n text-align: right;\n}\n.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl {\n margin: -16px 33px -16px -16px;\n}\n.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left {\n justify-content: flex-end;\n}\n.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right {\n justify-content: flex-start;\n}\n.ant-table-wrapper-rtl .ant-table-column-sorter {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-filter-column-title {\n padding: 16px 16px 16px 2.3em;\n}\n.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title {\n padding: 0 0 0 2.3em;\n}\n.ant-table-wrapper-rtl .ant-table-filter-trigger {\n margin: -4px 4px -4px -8px;\n}\n.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span,\n.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span {\n padding-right: 8px;\n padding-left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-selection {\n text-align: center;\n}\n.ant-table-wrapper-rtl .ant-table-row-indent {\n float: right;\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon {\n float: right;\n}\n.ant-table-wrapper-rtl .ant-table-row-indent + .ant-table-row-expand-icon {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon::after {\n transform: rotate(-90deg);\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::before {\n transform: rotate(180deg);\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::after {\n transform: rotate(0deg);\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@-webkit-keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@-webkit-keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode {\n position: relative;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n transition: background-color 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode:hover::before {\n background: #f5f5f5;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode > * {\n z-index: 1;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher {\n transition: color 0.3s;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper {\n border-radius: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover {\n background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected {\n color: #fff;\n background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before,\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected::before {\n background: #1890ff;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher {\n color: #fff;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper {\n color: #fff;\n background: transparent;\n}\n.ant-tree-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-tree-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n -webkit-animation: antCheckboxEffect 0.36s ease-in-out;\n animation: antCheckboxEffect 0.36s ease-in-out;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-tree-checkbox:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox::after {\n visibility: visible;\n}\n.ant-tree-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-tree-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-tree-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-tree-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-tree-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-tree-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-tree-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-tree-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-tree-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-tree-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-tree-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item {\n margin-left: 0;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-tree {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n background: #fff;\n border-radius: 2px;\n transition: background-color 0.3s;\n}\n.ant-tree-focused:not(:hover):not(.ant-tree-active-focused) {\n background: #e6f7ff;\n}\n.ant-tree-list-holder-inner {\n align-items: flex-start;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner {\n align-items: stretch;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper {\n flex: auto;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging {\n position: relative;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n border: 1px solid #1890ff;\n opacity: 0;\n -webkit-animation: ant-tree-node-fx-do-not-use 0.3s;\n animation: ant-tree-node-fx-do-not-use 0.3s;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n -webkit-animation-fill-mode: forwards;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n.ant-tree .ant-tree-treenode {\n display: flex;\n align-items: flex-start;\n padding: 0 0 4px 0;\n outline: none;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover {\n background: transparent;\n}\n.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper {\n background: #f5f5f5;\n}\n.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title {\n color: inherit;\n font-weight: 500;\n}\n.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n width: 24px;\n line-height: 24px;\n text-align: center;\n visibility: visible;\n opacity: 0.2;\n transition: opacity 0.3s;\n}\n.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n opacity: 0.45;\n}\n.ant-tree-indent {\n align-self: stretch;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-tree-indent-unit {\n display: inline-block;\n width: 24px;\n}\n.ant-tree-draggable-icon {\n visibility: hidden;\n}\n.ant-tree-switcher {\n position: relative;\n flex: none;\n align-self: stretch;\n width: 24px;\n margin: 0;\n line-height: 24px;\n text-align: center;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-tree-switcher .ant-tree-switcher-icon,\n.ant-tree-switcher .ant-select-tree-switcher-icon {\n display: inline-block;\n font-size: 10px;\n vertical-align: baseline;\n}\n.ant-tree-switcher .ant-tree-switcher-icon svg,\n.ant-tree-switcher .ant-select-tree-switcher-icon svg {\n transition: transform 0.3s;\n}\n.ant-tree-switcher-noop {\n cursor: default;\n}\n.ant-tree-switcher_close .ant-tree-switcher-icon svg {\n transform: rotate(-90deg);\n}\n.ant-tree-switcher-loading-icon {\n color: #1890ff;\n}\n.ant-tree-switcher-leaf-line {\n position: relative;\n z-index: 1;\n display: inline-block;\n width: 100%;\n height: 100%;\n}\n.ant-tree-switcher-leaf-line::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n margin-left: -1px;\n border-right: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-tree-switcher-leaf-line::after {\n position: absolute;\n width: 10px;\n height: 14px;\n border-bottom: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-tree-checkbox {\n top: initial;\n margin: 4px 8px 0 0;\n}\n.ant-tree .ant-tree-node-content-wrapper {\n position: relative;\n z-index: auto;\n min-height: 24px;\n margin: 0;\n padding: 0 4px;\n color: inherit;\n line-height: 24px;\n background: transparent;\n border-radius: 2px;\n cursor: pointer;\n transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n}\n.ant-tree .ant-tree-node-content-wrapper:hover {\n background-color: #f5f5f5;\n}\n.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected {\n background-color: #bae7ff;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle {\n display: inline-block;\n width: 24px;\n height: 24px;\n line-height: 24px;\n text-align: center;\n vertical-align: top;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty {\n display: none;\n}\n.ant-tree-unselectable .ant-tree-node-content-wrapper:hover {\n background-color: transparent;\n}\n.ant-tree-node-content-wrapper {\n line-height: 24px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator {\n position: absolute;\n z-index: 1;\n height: 2px;\n background-color: #1890ff;\n border-radius: 1px;\n pointer-events: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator::after {\n position: absolute;\n top: -3px;\n left: -6px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n border: 2px solid #1890ff;\n border-radius: 50%;\n content: '';\n}\n.ant-tree .ant-tree-treenode.drop-container > [draggable] {\n box-shadow: 0 0 0 2px #1890ff;\n}\n.ant-tree-show-line .ant-tree-indent-unit {\n position: relative;\n height: 100%;\n}\n.ant-tree-show-line .ant-tree-indent-unit::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n border-right: 1px solid #d9d9d9;\n content: '';\n}\n.ant-tree-show-line .ant-tree-indent-unit-end::before {\n display: none;\n}\n.ant-tree-show-line .ant-tree-switcher {\n background: #fff;\n}\n.ant-tree-show-line .ant-tree-switcher-line-icon {\n vertical-align: -0.15em;\n}\n.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line::before {\n top: auto !important;\n bottom: auto !important;\n height: 14px !important;\n}\n.ant-tree-rtl {\n direction: rtl;\n}\n.ant-tree-rtl .ant-tree-node-content-wrapper[draggable='true'] .ant-tree-drop-indicator::after {\n right: -6px;\n left: unset;\n}\n.ant-tree .ant-tree-treenode-rtl {\n direction: rtl;\n}\n.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg {\n transform: rotate(90deg);\n}\n.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit::before {\n right: auto;\n left: -13px;\n border-right: none;\n border-left: 1px solid #d9d9d9;\n}\n.ant-tree-rtl .ant-tree-checkbox {\n margin: 4px 0 0 8px;\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox {\n margin: 4px 0 0 8px;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-timeline {\n box-sizing: border-box;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n font-feature-settings: 'tnum';\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.ant-timeline-item {\n position: relative;\n margin: 0;\n padding-bottom: 20px;\n font-size: 14px;\n list-style: none;\n}\n.ant-timeline-item-tail {\n position: absolute;\n top: 10px;\n left: 4px;\n height: calc(100% - 10px);\n border-left: 2px solid #f0f0f0;\n}\n.ant-timeline-item-pending .ant-timeline-item-head {\n font-size: 12px;\n background-color: transparent;\n}\n.ant-timeline-item-pending .ant-timeline-item-tail {\n display: none;\n}\n.ant-timeline-item-head {\n position: absolute;\n width: 10px;\n height: 10px;\n background-color: #fff;\n border: 2px solid transparent;\n border-radius: 100px;\n}\n.ant-timeline-item-head-blue {\n color: #1890ff;\n border-color: #1890ff;\n}\n.ant-timeline-item-head-red {\n color: #ff4d4f;\n border-color: #ff4d4f;\n}\n.ant-timeline-item-head-green {\n color: #52c41a;\n border-color: #52c41a;\n}\n.ant-timeline-item-head-gray {\n color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-timeline-item-head-custom {\n position: absolute;\n top: 5.5px;\n left: 5px;\n width: auto;\n height: auto;\n margin-top: 0;\n padding: 3px 1px;\n line-height: 1;\n text-align: center;\n border: 0;\n border-radius: 0;\n transform: translate(-50%, -50%);\n}\n.ant-timeline-item-content {\n position: relative;\n top: -7.001px;\n margin: 0 0 0 26px;\n word-break: break-word;\n}\n.ant-timeline-item-last > .ant-timeline-item-tail {\n display: none;\n}\n.ant-timeline-item-last > .ant-timeline-item-content {\n min-height: 48px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-right .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-label .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head,\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n left: 50%;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head {\n margin-left: -4px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n margin-left: 1px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content {\n left: calc(50% - 4px);\n width: calc(50% - 14px);\n text-align: left;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content {\n width: calc(50% - 12px);\n margin: 0;\n text-align: right;\n}\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom {\n left: calc(100% - 4px - 2px);\n}\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content {\n width: calc(100% - 18px);\n}\n.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {\n display: block;\n height: calc(100% - 14px);\n border-left: 2px dotted #f0f0f0;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail {\n display: none;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail {\n top: 15px;\n display: block;\n height: calc(100% - 15px);\n border-left: 2px dotted #f0f0f0;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content {\n min-height: 48px;\n}\n.ant-timeline.ant-timeline-label .ant-timeline-item-label {\n position: absolute;\n top: -7.001px;\n width: calc(50% - 12px);\n text-align: right;\n}\n.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label {\n left: calc(50% + 14px);\n width: calc(50% - 14px);\n text-align: left;\n}\n.ant-timeline-rtl {\n direction: rtl;\n}\n.ant-timeline-rtl .ant-timeline-item-tail {\n right: 4px;\n left: auto;\n border-right: 2px solid #f0f0f0;\n border-left: none;\n}\n.ant-timeline-rtl .ant-timeline-item-head-custom {\n right: 5px;\n left: auto;\n transform: translate(50%, -50%);\n}\n.ant-timeline-rtl .ant-timeline-item-content {\n margin: 0 18px 0 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n right: 50%;\n left: auto;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head {\n margin-right: -4px;\n margin-left: 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n margin-right: 1px;\n margin-left: 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content {\n right: calc(50% - 4px);\n left: auto;\n text-align: right;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content {\n text-align: left;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom {\n right: 0;\n left: auto;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content {\n width: 100%;\n margin-right: 18px;\n text-align: right;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {\n border-right: 2px dotted #f0f0f0;\n border-left: none;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail {\n border-right: 2px dotted #f0f0f0;\n border-left: none;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label {\n text-align: left;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label {\n right: calc(50% + 14px);\n text-align: right;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@-webkit-keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-transfer-customize-list .ant-transfer-list {\n flex: 1 1 50%;\n width: auto;\n height: auto;\n min-height: 200px;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small {\n border: 0;\n border-radius: 0;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column {\n width: 40px;\n min-width: 40px;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th {\n background: #fafafa;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content .ant-table-row:last-child td {\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body {\n margin: 0;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination {\n margin: 16px 0 4px;\n}\n.ant-transfer-customize-list .ant-input[disabled] {\n background-color: transparent;\n}\n.ant-transfer-status-error .ant-transfer-list {\n border-color: #ff4d4f;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]) {\n border-color: #d9d9d9;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-transfer-status-warning .ant-transfer-list {\n border-color: #faad14;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]) {\n border-color: #d9d9d9;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover {\n border-color: #40a9ff;\n border-right-width: 1px;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus {\n border-color: #40a9ff;\n box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n border-right-width: 1px;\n outline: 0;\n}\n.ant-transfer {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n display: flex;\n align-items: stretch;\n}\n.ant-transfer-disabled .ant-transfer-list {\n background: #f5f5f5;\n}\n.ant-transfer-list {\n display: flex;\n flex-direction: column;\n width: 180px;\n height: 200px;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n}\n.ant-transfer-list-with-pagination {\n width: 250px;\n height: auto;\n}\n.ant-transfer-list-search .anticon-search {\n color: rgba(0, 0, 0, 0.25);\n}\n.ant-transfer-list-header {\n display: flex;\n flex: none;\n align-items: center;\n height: 40px;\n padding: 8px 12px 9px;\n color: rgba(0, 0, 0, 0.85);\n background: #fff;\n border-bottom: 1px solid #f0f0f0;\n border-radius: 2px 2px 0 0;\n}\n.ant-transfer-list-header > *:not(:last-child) {\n margin-right: 4px;\n}\n.ant-transfer-list-header > * {\n flex: none;\n}\n.ant-transfer-list-header-title {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-align: right;\n text-overflow: ellipsis;\n}\n.ant-transfer-list-header-dropdown {\n font-size: 10px;\n transform: translateY(10%);\n cursor: pointer;\n}\n.ant-transfer-list-header-dropdown[disabled] {\n cursor: not-allowed;\n}\n.ant-transfer-list-body {\n display: flex;\n flex: auto;\n flex-direction: column;\n overflow: hidden;\n font-size: 14px;\n}\n.ant-transfer-list-body-search-wrapper {\n position: relative;\n flex: none;\n padding: 12px;\n}\n.ant-transfer-list-content {\n flex: auto;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n}\n.ant-transfer-list-content-item {\n display: flex;\n align-items: center;\n min-height: 32px;\n padding: 6px 12px;\n line-height: 20px;\n transition: all 0.3s;\n}\n.ant-transfer-list-content-item > *:not(:last-child) {\n margin-right: 8px;\n}\n.ant-transfer-list-content-item > * {\n flex: none;\n}\n.ant-transfer-list-content-item-text {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-transfer-list-content-item-remove {\n color: #1890ff;\n text-decoration: none;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n position: relative;\n color: #d9d9d9;\n}\n.ant-transfer-list-content-item-remove:focus,\n.ant-transfer-list-content-item-remove:hover {\n color: #40a9ff;\n}\n.ant-transfer-list-content-item-remove:active {\n color: #096dd9;\n}\n.ant-transfer-list-content-item-remove::after {\n position: absolute;\n top: -6px;\n right: -50%;\n bottom: -6px;\n left: -50%;\n content: '';\n}\n.ant-transfer-list-content-item-remove:hover {\n color: #40a9ff;\n}\n.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n background-color: #f5f5f5;\n cursor: pointer;\n}\n.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover {\n background-color: #dcf4ff;\n}\n.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n background: transparent;\n cursor: default;\n}\n.ant-transfer-list-content-item-checked {\n background-color: #e6f7ff;\n}\n.ant-transfer-list-content-item-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-transfer-list-pagination {\n padding: 8px 0;\n text-align: right;\n border-top: 1px solid #f0f0f0;\n}\n.ant-transfer-list-body-not-found {\n flex: none;\n width: 100%;\n margin: auto 0;\n color: rgba(0, 0, 0, 0.25);\n text-align: center;\n}\n.ant-transfer-list-footer {\n border-top: 1px solid #f0f0f0;\n}\n.ant-transfer-operation {\n display: flex;\n flex: none;\n flex-direction: column;\n align-self: center;\n margin: 0 8px;\n vertical-align: middle;\n}\n.ant-transfer-operation .ant-btn {\n display: block;\n}\n.ant-transfer-operation .ant-btn:first-child {\n margin-bottom: 4px;\n}\n.ant-transfer-operation .ant-btn .anticon {\n font-size: 12px;\n}\n.ant-transfer .ant-empty-image {\n max-height: -2px;\n}\n.ant-transfer-rtl {\n direction: rtl;\n}\n.ant-transfer-rtl .ant-transfer-list-search {\n padding-right: 8px;\n padding-left: 24px;\n}\n.ant-transfer-rtl .ant-transfer-list-search-action {\n right: auto;\n left: 12px;\n}\n.ant-transfer-rtl .ant-transfer-list-header > *:not(:last-child) {\n margin-right: 0;\n margin-left: 4px;\n}\n.ant-transfer-rtl .ant-transfer-list-header {\n right: 0;\n left: auto;\n}\n.ant-transfer-rtl .ant-transfer-list-header-title {\n text-align: left;\n}\n.ant-transfer-rtl .ant-transfer-list-content-item > *:not(:last-child) {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-transfer-rtl .ant-transfer-list-pagination {\n text-align: left;\n}\n.ant-transfer-rtl .ant-transfer-list-footer {\n right: 0;\n left: auto;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@-webkit-keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@-webkit-keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-select-tree-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,\n.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner,\n.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-select-tree-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n -webkit-animation: antCheckboxEffect 0.36s ease-in-out;\n animation: antCheckboxEffect 0.36s ease-in-out;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-select-tree-checkbox:hover::after,\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox::after {\n visibility: visible;\n}\n.ant-select-tree-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-select-tree-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-select-tree-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-select-tree-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n -webkit-animation-name: none;\n animation-name: none;\n}\n.ant-select-tree-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-select-tree-checkbox-disabled:hover::after,\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-select-tree-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-select-tree-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-select-tree-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-select-tree-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-select-tree-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-select-tree-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item {\n margin-left: 0;\n}\n.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-tree-select-dropdown {\n padding: 8px 4px;\n}\n.ant-tree-select-dropdown-rtl {\n direction: rtl;\n}\n.ant-tree-select-dropdown .ant-select-tree {\n border-radius: 0;\n}\n.ant-tree-select-dropdown .ant-select-tree-list-holder-inner {\n align-items: stretch;\n}\n.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper {\n flex: auto;\n}\n.ant-select-tree {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n background: #fff;\n border-radius: 2px;\n transition: background-color 0.3s;\n}\n.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused) {\n background: #e6f7ff;\n}\n.ant-select-tree-list-holder-inner {\n align-items: flex-start;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner {\n align-items: stretch;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper {\n flex: auto;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging {\n position: relative;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n border: 1px solid #1890ff;\n opacity: 0;\n -webkit-animation: ant-tree-node-fx-do-not-use 0.3s;\n animation: ant-tree-node-fx-do-not-use 0.3s;\n -webkit-animation-play-state: running;\n animation-play-state: running;\n -webkit-animation-fill-mode: forwards;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n.ant-select-tree .ant-select-tree-treenode {\n display: flex;\n align-items: flex-start;\n padding: 0 0 4px 0;\n outline: none;\n}\n.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover {\n background: transparent;\n}\n.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper {\n background: #f5f5f5;\n}\n.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title {\n color: inherit;\n font-weight: 500;\n}\n.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon {\n width: 24px;\n line-height: 24px;\n text-align: center;\n visibility: visible;\n opacity: 0.2;\n transition: opacity 0.3s;\n}\n.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon {\n opacity: 0.45;\n}\n.ant-select-tree-indent {\n align-self: stretch;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-select-tree-indent-unit {\n display: inline-block;\n width: 24px;\n}\n.ant-select-tree-draggable-icon {\n visibility: hidden;\n}\n.ant-select-tree-switcher {\n position: relative;\n flex: none;\n align-self: stretch;\n width: 24px;\n margin: 0;\n line-height: 24px;\n text-align: center;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-select-tree-switcher .ant-tree-switcher-icon,\n.ant-select-tree-switcher .ant-select-tree-switcher-icon {\n display: inline-block;\n font-size: 10px;\n vertical-align: baseline;\n}\n.ant-select-tree-switcher .ant-tree-switcher-icon svg,\n.ant-select-tree-switcher .ant-select-tree-switcher-icon svg {\n transition: transform 0.3s;\n}\n.ant-select-tree-switcher-noop {\n cursor: default;\n}\n.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg {\n transform: rotate(-90deg);\n}\n.ant-select-tree-switcher-loading-icon {\n color: #1890ff;\n}\n.ant-select-tree-switcher-leaf-line {\n position: relative;\n z-index: 1;\n display: inline-block;\n width: 100%;\n height: 100%;\n}\n.ant-select-tree-switcher-leaf-line::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n margin-left: -1px;\n border-right: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-select-tree-switcher-leaf-line::after {\n position: absolute;\n width: 10px;\n height: 14px;\n border-bottom: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-select-tree-checkbox {\n top: initial;\n margin: 4px 8px 0 0;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper {\n position: relative;\n z-index: auto;\n min-height: 24px;\n margin: 0;\n padding: 0 4px;\n color: inherit;\n line-height: 24px;\n background: transparent;\n border-radius: 2px;\n cursor: pointer;\n transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper:hover {\n background-color: #f5f5f5;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {\n background-color: #bae7ff;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle {\n display: inline-block;\n width: 24px;\n height: 24px;\n line-height: 24px;\n text-align: center;\n vertical-align: top;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty {\n display: none;\n}\n.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover {\n background-color: transparent;\n}\n.ant-select-tree-node-content-wrapper {\n line-height: 24px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator {\n position: absolute;\n z-index: 1;\n height: 2px;\n background-color: #1890ff;\n border-radius: 1px;\n pointer-events: none;\n}\n.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator::after {\n position: absolute;\n top: -3px;\n left: -6px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n border: 2px solid #1890ff;\n border-radius: 50%;\n content: '';\n}\n.ant-select-tree .ant-select-tree-treenode.drop-container > [draggable] {\n box-shadow: 0 0 0 2px #1890ff;\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit {\n position: relative;\n height: 100%;\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n border-right: 1px solid #d9d9d9;\n content: '';\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit-end::before {\n display: none;\n}\n.ant-select-tree-show-line .ant-select-tree-switcher {\n background: #fff;\n}\n.ant-select-tree-show-line .ant-select-tree-switcher-line-icon {\n vertical-align: -0.15em;\n}\n.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line::before {\n top: auto !important;\n bottom: auto !important;\n height: 14px !important;\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg {\n transform: rotate(90deg);\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon {\n transform: scaleY(-1);\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-typography {\n color: rgba(0, 0, 0, 0.85);\n overflow-wrap: break-word;\n}\n.ant-typography.ant-typography-secondary {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-typography.ant-typography-success {\n color: #52c41a;\n}\n.ant-typography.ant-typography-warning {\n color: #faad14;\n}\n.ant-typography.ant-typography-danger {\n color: #ff4d4f;\n}\na.ant-typography.ant-typography-danger:active,\na.ant-typography.ant-typography-danger:focus {\n color: #d9363e;\n}\na.ant-typography.ant-typography-danger:hover {\n color: #ff7875;\n}\n.ant-typography.ant-typography-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\ndiv.ant-typography,\n.ant-typography p {\n margin-bottom: 1em;\n}\nh1.ant-typography,\ndiv.ant-typography-h1,\ndiv.ant-typography-h1 > textarea,\n.ant-typography h1 {\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 38px;\n line-height: 1.23;\n}\nh2.ant-typography,\ndiv.ant-typography-h2,\ndiv.ant-typography-h2 > textarea,\n.ant-typography h2 {\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 30px;\n line-height: 1.35;\n}\nh3.ant-typography,\ndiv.ant-typography-h3,\ndiv.ant-typography-h3 > textarea,\n.ant-typography h3 {\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 24px;\n line-height: 1.35;\n}\nh4.ant-typography,\ndiv.ant-typography-h4,\ndiv.ant-typography-h4 > textarea,\n.ant-typography h4 {\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 20px;\n line-height: 1.4;\n}\nh5.ant-typography,\ndiv.ant-typography-h5,\ndiv.ant-typography-h5 > textarea,\n.ant-typography h5 {\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 16px;\n line-height: 1.5;\n}\n.ant-typography + h1.ant-typography,\n.ant-typography + h2.ant-typography,\n.ant-typography + h3.ant-typography,\n.ant-typography + h4.ant-typography,\n.ant-typography + h5.ant-typography {\n margin-top: 1.2em;\n}\n.ant-typography div + h1,\n.ant-typography ul + h1,\n.ant-typography li + h1,\n.ant-typography p + h1,\n.ant-typography h1 + h1,\n.ant-typography h2 + h1,\n.ant-typography h3 + h1,\n.ant-typography h4 + h1,\n.ant-typography h5 + h1,\n.ant-typography div + h2,\n.ant-typography ul + h2,\n.ant-typography li + h2,\n.ant-typography p + h2,\n.ant-typography h1 + h2,\n.ant-typography h2 + h2,\n.ant-typography h3 + h2,\n.ant-typography h4 + h2,\n.ant-typography h5 + h2,\n.ant-typography div + h3,\n.ant-typography ul + h3,\n.ant-typography li + h3,\n.ant-typography p + h3,\n.ant-typography h1 + h3,\n.ant-typography h2 + h3,\n.ant-typography h3 + h3,\n.ant-typography h4 + h3,\n.ant-typography h5 + h3,\n.ant-typography div + h4,\n.ant-typography ul + h4,\n.ant-typography li + h4,\n.ant-typography p + h4,\n.ant-typography h1 + h4,\n.ant-typography h2 + h4,\n.ant-typography h3 + h4,\n.ant-typography h4 + h4,\n.ant-typography h5 + h4,\n.ant-typography div + h5,\n.ant-typography ul + h5,\n.ant-typography li + h5,\n.ant-typography p + h5,\n.ant-typography h1 + h5,\n.ant-typography h2 + h5,\n.ant-typography h3 + h5,\n.ant-typography h4 + h5,\n.ant-typography h5 + h5 {\n margin-top: 1.2em;\n}\na.ant-typography-ellipsis,\nspan.ant-typography-ellipsis {\n display: inline-block;\n max-width: 100%;\n}\na.ant-typography,\n.ant-typography a {\n color: #1890ff;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n text-decoration: none;\n}\na.ant-typography:focus,\n.ant-typography a:focus,\na.ant-typography:hover,\n.ant-typography a:hover {\n color: #40a9ff;\n}\na.ant-typography:active,\n.ant-typography a:active {\n color: #096dd9;\n}\na.ant-typography:active,\n.ant-typography a:active,\na.ant-typography:hover,\n.ant-typography a:hover {\n text-decoration: none;\n}\na.ant-typography[disabled],\n.ant-typography a[disabled],\na.ant-typography.ant-typography-disabled,\n.ant-typography a.ant-typography-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\na.ant-typography[disabled]:active,\n.ant-typography a[disabled]:active,\na.ant-typography.ant-typography-disabled:active,\n.ant-typography a.ant-typography-disabled:active,\na.ant-typography[disabled]:hover,\n.ant-typography a[disabled]:hover,\na.ant-typography.ant-typography-disabled:hover,\n.ant-typography a.ant-typography-disabled:hover {\n color: rgba(0, 0, 0, 0.25);\n}\na.ant-typography[disabled]:active,\n.ant-typography a[disabled]:active,\na.ant-typography.ant-typography-disabled:active,\n.ant-typography a.ant-typography-disabled:active {\n pointer-events: none;\n}\n.ant-typography code {\n margin: 0 0.2em;\n padding: 0.2em 0.4em 0.1em;\n font-size: 85%;\n background: rgba(150, 150, 150, 0.1);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-radius: 3px;\n}\n.ant-typography kbd {\n margin: 0 0.2em;\n padding: 0.15em 0.4em 0.1em;\n font-size: 90%;\n background: rgba(150, 150, 150, 0.06);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-bottom-width: 2px;\n border-radius: 3px;\n}\n.ant-typography mark {\n padding: 0;\n background-color: #ffe58f;\n}\n.ant-typography u,\n.ant-typography ins {\n text-decoration: underline;\n -webkit-text-decoration-skip: ink;\n text-decoration-skip-ink: auto;\n}\n.ant-typography s,\n.ant-typography del {\n text-decoration: line-through;\n}\n.ant-typography strong {\n font-weight: 600;\n}\n.ant-typography-expand,\n.ant-typography-edit,\n.ant-typography-copy {\n color: #1890ff;\n text-decoration: none;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n margin-left: 4px;\n}\n.ant-typography-expand:focus,\n.ant-typography-edit:focus,\n.ant-typography-copy:focus,\n.ant-typography-expand:hover,\n.ant-typography-edit:hover,\n.ant-typography-copy:hover {\n color: #40a9ff;\n}\n.ant-typography-expand:active,\n.ant-typography-edit:active,\n.ant-typography-copy:active {\n color: #096dd9;\n}\n.ant-typography-copy-success,\n.ant-typography-copy-success:hover,\n.ant-typography-copy-success:focus {\n color: #52c41a;\n}\n.ant-typography-edit-content {\n position: relative;\n}\ndiv.ant-typography-edit-content {\n left: -12px;\n margin-top: -5px;\n margin-bottom: calc(1em - 4px - 1px);\n}\n.ant-typography-edit-content-confirm {\n position: absolute;\n right: 10px;\n bottom: 8px;\n color: rgba(0, 0, 0, 0.45);\n font-weight: normal;\n font-size: 14px;\n font-style: normal;\n pointer-events: none;\n}\n.ant-typography-edit-content textarea {\n height: 1em;\n margin: 0 !important;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -moz-transition: none;\n}\n.ant-typography ul,\n.ant-typography ol {\n margin: 0 0 1em;\n padding: 0;\n}\n.ant-typography ul li,\n.ant-typography ol li {\n margin: 0 0 0 20px;\n padding: 0 0 0 4px;\n}\n.ant-typography ul {\n list-style-type: circle;\n}\n.ant-typography ul ul {\n list-style-type: disc;\n}\n.ant-typography ol {\n list-style-type: decimal;\n}\n.ant-typography pre,\n.ant-typography blockquote {\n margin: 1em 0;\n}\n.ant-typography pre {\n padding: 0.4em 0.6em;\n white-space: pre-wrap;\n word-wrap: break-word;\n background: rgba(150, 150, 150, 0.1);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-radius: 3px;\n}\n.ant-typography pre code {\n display: inline;\n margin: 0;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border: 0;\n}\n.ant-typography blockquote {\n padding: 0 0 0 0.6em;\n border-left: 4px solid rgba(100, 100, 100, 0.2);\n opacity: 0.85;\n}\n.ant-typography-single-line {\n white-space: nowrap;\n}\n.ant-typography-ellipsis-single-line {\n overflow: hidden;\n text-overflow: ellipsis;\n}\na.ant-typography-ellipsis-single-line,\nspan.ant-typography-ellipsis-single-line {\n vertical-align: bottom;\n}\n.ant-typography-ellipsis-multiple-line {\n /* stylelint-disable-next-line value-no-vendor-prefix */\n display: -webkit-box;\n overflow: hidden;\n -webkit-line-clamp: 3;\n /*! autoprefixer: ignore next */\n -webkit-box-orient: vertical;\n}\n.ant-typography-rtl {\n direction: rtl;\n}\n.ant-typography-rtl .ant-typography-expand,\n.ant-typography-rtl .ant-typography-edit,\n.ant-typography-rtl .ant-typography-copy {\n margin-right: 4px;\n margin-left: 0;\n}\n.ant-typography-rtl .ant-typography-expand {\n float: left;\n}\ndiv.ant-typography-edit-content.ant-typography-rtl {\n right: -12px;\n left: auto;\n}\n.ant-typography-rtl .ant-typography-edit-content-confirm {\n right: auto;\n left: 10px;\n}\n.ant-typography-rtl.ant-typography ul li,\n.ant-typography-rtl.ant-typography ol li {\n margin: 0 20px 0 0;\n padding: 0 4px 0 0;\n}\n\n/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-upload {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n outline: 0;\n}\n.ant-upload p {\n margin: 0;\n}\n.ant-upload-btn {\n display: block;\n width: 100%;\n outline: none;\n}\n.ant-upload input[type='file'] {\n cursor: pointer;\n}\n.ant-upload.ant-upload-select {\n display: inline-block;\n}\n.ant-upload.ant-upload-disabled {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-upload.ant-upload-select-picture-card {\n width: 104px;\n height: 104px;\n margin-right: 8px;\n margin-bottom: 8px;\n text-align: center;\n vertical-align: top;\n background-color: #fafafa;\n border: 1px dashed #d9d9d9;\n border-radius: 2px;\n cursor: pointer;\n transition: border-color 0.3s;\n}\n.ant-upload.ant-upload-select-picture-card > .ant-upload {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n}\n.ant-upload.ant-upload-select-picture-card:hover {\n border-color: #1890ff;\n}\n.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover {\n border-color: #d9d9d9;\n}\n.ant-upload.ant-upload-drag {\n position: relative;\n width: 100%;\n height: 100%;\n text-align: center;\n background: #fafafa;\n border: 1px dashed #d9d9d9;\n border-radius: 2px;\n cursor: pointer;\n transition: border-color 0.3s;\n}\n.ant-upload.ant-upload-drag .ant-upload {\n padding: 16px 0;\n}\n.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) {\n border-color: #096dd9;\n}\n.ant-upload.ant-upload-drag.ant-upload-disabled {\n cursor: not-allowed;\n}\n.ant-upload.ant-upload-drag .ant-upload-btn {\n display: table;\n height: 100%;\n}\n.ant-upload.ant-upload-drag .ant-upload-drag-container {\n display: table-cell;\n vertical-align: middle;\n}\n.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover {\n border-color: #40a9ff;\n}\n.ant-upload.ant-upload-drag p.ant-upload-drag-icon {\n margin-bottom: 20px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon {\n color: #40a9ff;\n font-size: 48px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-text {\n margin: 0 0 4px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 16px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-hint {\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-upload.ant-upload-drag .anticon-plus {\n color: rgba(0, 0, 0, 0.25);\n font-size: 30px;\n transition: all 0.3s;\n}\n.ant-upload.ant-upload-drag .anticon-plus:hover {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-upload.ant-upload-drag:hover .anticon-plus {\n color: rgba(0, 0, 0, 0.45);\n}\n.ant-upload-picture-card-wrapper {\n display: inline-block;\n width: 100%;\n}\n.ant-upload-picture-card-wrapper::before {\n display: table;\n content: '';\n}\n.ant-upload-picture-card-wrapper::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-upload-list {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n list-style: none;\n font-feature-settings: 'tnum';\n line-height: 1.5715;\n}\n.ant-upload-list::before {\n display: table;\n content: '';\n}\n.ant-upload-list::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-upload-list-item {\n position: relative;\n height: 22.001px;\n margin-top: 8px;\n font-size: 14px;\n}\n.ant-upload-list-item-name {\n display: inline-block;\n width: 100%;\n padding-left: 22px;\n overflow: hidden;\n line-height: 1.5715;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ant-upload-list-item-card-actions {\n position: absolute;\n right: 0;\n}\n.ant-upload-list-item-card-actions-btn {\n opacity: 0;\n}\n.ant-upload-list-item-card-actions-btn.ant-btn-sm {\n height: 22.001px;\n line-height: 1;\n vertical-align: top;\n}\n.ant-upload-list-item-card-actions.picture {\n top: 22px;\n line-height: 0;\n}\n.ant-upload-list-item-card-actions-btn:focus,\n.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn {\n opacity: 1;\n}\n.ant-upload-list-item-card-actions .anticon {\n color: rgba(0, 0, 0, 0.45);\n transition: all 0.3s;\n}\n.ant-upload-list-item-card-actions:hover .anticon {\n color: rgba(0, 0, 0, 0.85);\n}\n.ant-upload-list-item-info {\n height: 100%;\n transition: background-color 0.3s;\n}\n.ant-upload-list-item-info > span {\n display: block;\n width: 100%;\n height: 100%;\n}\n.ant-upload-list-item-info .anticon-loading .anticon,\n.ant-upload-list-item-info .ant-upload-text-icon .anticon {\n position: absolute;\n top: 5px;\n color: rgba(0, 0, 0, 0.45);\n font-size: 14px;\n}\n.ant-upload-list-item:hover .ant-upload-list-item-info {\n background-color: #f5f5f5;\n}\n.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn {\n opacity: 1;\n}\n.ant-upload-list-item-error,\n.ant-upload-list-item-error .ant-upload-text-icon > .anticon,\n.ant-upload-list-item-error .ant-upload-list-item-name {\n color: #ff4d4f;\n}\n.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon {\n color: #ff4d4f;\n}\n.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn {\n opacity: 1;\n}\n.ant-upload-list-item-progress {\n position: absolute;\n bottom: -12px;\n width: 100%;\n padding-left: 26px;\n font-size: 14px;\n line-height: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item,\n.ant-upload-list-picture-card .ant-upload-list-item {\n position: relative;\n height: 66px;\n padding: 8px;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n}\n.ant-upload-list-picture .ant-upload-list-item:hover,\n.ant-upload-list-picture-card .ant-upload-list-item:hover {\n background: transparent;\n}\n.ant-upload-list-picture .ant-upload-list-item-error,\n.ant-upload-list-picture-card .ant-upload-list-item-error {\n border-color: #ff4d4f;\n}\n.ant-upload-list-picture .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n padding: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info {\n background: transparent;\n}\n.ant-upload-list-picture .ant-upload-list-item-uploading,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading {\n border-style: dashed;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail {\n width: 48px;\n height: 48px;\n line-height: 60px;\n text-align: center;\n opacity: 0.8;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon {\n font-size: 26px;\n}\n.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'],\n.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'] {\n fill: #fff2f0;\n}\n.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'],\n.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'] {\n fill: #ff4d4f;\n}\n.ant-upload-list-picture .ant-upload-list-item-icon,\n.ant-upload-list-picture-card .ant-upload-list-item-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n font-size: 26px;\n transform: translate(-50%, -50%);\n}\n.ant-upload-list-picture .ant-upload-list-item-icon .anticon,\n.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon {\n font-size: 26px;\n}\n.ant-upload-list-picture .ant-upload-list-item-image,\n.ant-upload-list-picture-card .ant-upload-list-item-image {\n max-width: 100%;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail img,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {\n display: block;\n width: 48px;\n height: 48px;\n overflow: hidden;\n}\n.ant-upload-list-picture .ant-upload-list-item-name,\n.ant-upload-list-picture-card .ant-upload-list-item-name {\n display: inline-block;\n box-sizing: border-box;\n max-width: 100%;\n margin: 0 0 0 8px;\n padding-right: 8px;\n padding-left: 48px;\n overflow: hidden;\n line-height: 44px;\n white-space: nowrap;\n text-overflow: ellipsis;\n transition: all 0.3s;\n}\n.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name {\n margin-bottom: 12px;\n}\n.ant-upload-list-picture .ant-upload-list-item-progress,\n.ant-upload-list-picture-card .ant-upload-list-item-progress {\n bottom: 14px;\n width: calc(100% - 24px);\n margin-top: 0;\n padding-left: 56px;\n}\n.ant-upload-list-picture-card-container {\n display: inline-block;\n width: 104px;\n height: 104px;\n margin: 0 8px 8px 0;\n vertical-align: top;\n}\n.ant-upload-list-picture-card .ant-upload-list-item {\n height: 100%;\n margin: 0;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n position: relative;\n height: 100%;\n overflow: hidden;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info::before {\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: all 0.3s;\n content: ' ';\n}\n.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info::before {\n opacity: 1;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 10;\n white-space: nowrap;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: all 0.3s;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete {\n z-index: 10;\n width: 16px;\n margin: 0 4px;\n color: rgba(255, 255, 255, 0.85);\n font-size: 16px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover {\n color: #fff;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info:hover + .ant-upload-list-item-actions,\n.ant-upload-list-picture-card .ant-upload-list-item-actions:hover {\n opacity: 1;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {\n position: static;\n display: block;\n width: 100%;\n height: 100%;\n -o-object-fit: contain;\n object-fit: contain;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-name {\n display: none;\n margin: 8px 0 0;\n padding: 0;\n line-height: 1.5715;\n text-align: center;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name {\n position: absolute;\n bottom: 10px;\n display: block;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item {\n background-color: #fafafa;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info {\n height: auto;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info::before,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete {\n display: none;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-progress {\n bottom: 32px;\n width: calc(100% - 14px);\n padding-left: 0;\n}\n.ant-upload-list-text-container,\n.ant-upload-list-picture-container {\n transition: opacity 0.3s, height 0.3s;\n}\n.ant-upload-list-text-container::before,\n.ant-upload-list-picture-container::before {\n display: table;\n width: 0;\n height: 0;\n content: '';\n}\n.ant-upload-list-text-container .ant-upload-span,\n.ant-upload-list-picture-container .ant-upload-span {\n display: block;\n flex: auto;\n}\n.ant-upload-list-text .ant-upload-span,\n.ant-upload-list-picture .ant-upload-span {\n display: flex;\n align-items: center;\n}\n.ant-upload-list-text .ant-upload-span > *,\n.ant-upload-list-picture .ant-upload-span > * {\n flex: none;\n}\n.ant-upload-list-text .ant-upload-list-item-name,\n.ant-upload-list-picture .ant-upload-list-item-name {\n flex: auto;\n margin: 0;\n padding: 0 8px;\n}\n.ant-upload-list-text .ant-upload-list-item-card-actions,\n.ant-upload-list-picture .ant-upload-list-item-card-actions {\n position: static;\n}\n.ant-upload-list-text .ant-upload-text-icon .anticon {\n position: static;\n}\n.ant-upload-list .ant-upload-animate-inline-appear,\n.ant-upload-list .ant-upload-animate-inline-enter,\n.ant-upload-list .ant-upload-animate-inline-leave {\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-upload-list .ant-upload-animate-inline-appear,\n.ant-upload-list .ant-upload-animate-inline-enter {\n -webkit-animation-name: uploadAnimateInlineIn;\n animation-name: uploadAnimateInlineIn;\n}\n.ant-upload-list .ant-upload-animate-inline-leave {\n -webkit-animation-name: uploadAnimateInlineOut;\n animation-name: uploadAnimateInlineOut;\n}\n@-webkit-keyframes uploadAnimateInlineIn {\n from {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n@keyframes uploadAnimateInlineIn {\n from {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n@-webkit-keyframes uploadAnimateInlineOut {\n to {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n@keyframes uploadAnimateInlineOut {\n to {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n.ant-upload-rtl {\n direction: rtl;\n}\n.ant-upload-rtl.ant-upload.ant-upload-select-picture-card {\n margin-right: auto;\n margin-left: 8px;\n}\n.ant-upload-list-rtl {\n direction: rtl;\n}\n.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1 {\n padding-right: 22px;\n padding-left: 14px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2 {\n padding-right: 22px;\n padding-left: 28px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-name {\n padding-right: 22px;\n padding-left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1 {\n padding-left: 14px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-card-actions {\n right: auto;\n left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon {\n padding-right: 0;\n padding-left: 5px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-info {\n padding: 0 4px 0 12px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon {\n padding-right: 0;\n padding-left: 5px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-progress {\n padding-right: 26px;\n padding-left: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n padding: 0;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail {\n right: 8px;\n left: auto;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon {\n right: 50%;\n left: auto;\n transform: translate(50%, -50%);\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name {\n margin: 0 8px 0 0;\n padding-right: 48px;\n padding-left: 8px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1 {\n padding-right: 48px;\n padding-left: 18px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2 {\n padding-right: 48px;\n padding-left: 36px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress {\n padding-right: 0;\n padding-left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-picture-card-container {\n margin: 0 0 8px 8px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions {\n right: 50%;\n left: auto;\n transform: translate(50%, -50%);\n}\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name {\n margin: 8px 0 0;\n padding: 0;\n}\n\n\n","// Config global less under antd\n[class^=~'@{ant-prefix}-'],\n[class*=~' @{ant-prefix}-'] {\n // remove the clear button of a text input control in IE10+\n &::-ms-clear,\n input::-ms-clear,\n input::-ms-reveal {\n display: none;\n }\n}\n","/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n[class^=ant-]::-ms-clear,\n[class*= ant-]::-ms-clear,\n[class^=ant-] input::-ms-clear,\n[class*= ant-] input::-ms-clear,\n[class^=ant-] input::-ms-reveal,\n[class*= ant-] input::-ms-reveal {\n display: none;\n}\n/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */\nhtml,\nbody {\n width: 100%;\n height: 100%;\n}\ninput::-ms-clear,\ninput::-ms-reveal {\n display: none;\n}\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n@-ms-viewport {\n width: device-width;\n}\nbody {\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n font-variant: tabular-nums;\n line-height: 1.5715;\n background-color: #fff;\n font-feature-settings: 'tnum';\n}\n[tabindex='-1']:focus {\n outline: none !important;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: 0.5em;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n}\np {\n margin-top: 0;\n margin-bottom: 1em;\n}\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n border-bottom: 0;\n cursor: help;\n}\naddress {\n margin-bottom: 1em;\n font-style: normal;\n line-height: inherit;\n}\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n -webkit-appearance: none;\n}\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1em;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\ndt {\n font-weight: 500;\n}\ndd {\n margin-bottom: 0.5em;\n margin-left: 0;\n}\nblockquote {\n margin: 0 0 1em;\n}\ndfn {\n font-style: italic;\n}\nb,\nstrong {\n font-weight: bolder;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\na {\n color: #1890ff;\n text-decoration: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n -webkit-text-decoration-skip: objects;\n}\na:hover {\n color: #40a9ff;\n}\na:active {\n color: #096dd9;\n}\na:active,\na:hover {\n text-decoration: none;\n outline: 0;\n}\na:focus {\n text-decoration: none;\n outline: 0;\n}\na[disabled] {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\npre,\ncode,\nkbd,\nsamp {\n font-size: 1em;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n}\npre {\n margin-top: 0;\n margin-bottom: 1em;\n overflow: auto;\n}\nfigure {\n margin: 0 0 1em;\n}\nimg {\n vertical-align: middle;\n border-style: none;\n}\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\ntable {\n border-collapse: collapse;\n}\ncaption {\n padding-top: 0.75em;\n padding-bottom: 0.3em;\n color: rgba(0, 0, 0, 0.45);\n text-align: left;\n caption-side: bottom;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\nbutton,\ninput {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\ninput[type='radio'],\ninput[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n -webkit-appearance: listbox;\n}\ntextarea {\n overflow: auto;\n resize: vertical;\n}\nfieldset {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: 0.5em;\n padding: 0;\n color: inherit;\n font-size: 1.5em;\n line-height: inherit;\n white-space: normal;\n}\nprogress {\n vertical-align: baseline;\n}\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n[type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\noutput {\n display: inline-block;\n}\nsummary {\n display: list-item;\n}\ntemplate {\n display: none;\n}\n[hidden] {\n display: none !important;\n}\nmark {\n padding: 0.2em;\n background-color: #feffe6;\n}\n::selection {\n color: #fff;\n background: #1890ff;\n}\n.clearfix::before {\n display: table;\n content: '';\n}\n.clearfix::after {\n display: table;\n clear: both;\n content: '';\n}\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.anticon > * {\n line-height: 1;\n}\n.anticon svg {\n display: inline-block;\n}\n.anticon::before {\n display: none;\n}\n.anticon .anticon-icon {\n display: block;\n}\n.anticon > .anticon {\n line-height: 0;\n vertical-align: 0;\n}\n.anticon[tabindex] {\n cursor: pointer;\n}\n.anticon-spin,\n.anticon-spin::before {\n display: inline-block;\n animation: loadingCircle 1s infinite linear;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-fade-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-fade-enter.ant-fade-enter-active,\n.ant-fade-appear.ant-fade-appear-active {\n animation-name: antFadeIn;\n animation-play-state: running;\n}\n.ant-fade-leave.ant-fade-leave-active {\n animation-name: antFadeOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n opacity: 0;\n animation-timing-function: linear;\n}\n.ant-fade-leave {\n animation-timing-function: linear;\n}\n@keyframes antFadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes antFadeOut {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-up-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-up-enter.ant-move-up-enter-active,\n.ant-move-up-appear.ant-move-up-appear-active {\n animation-name: antMoveUpIn;\n animation-play-state: running;\n}\n.ant-move-up-leave.ant-move-up-leave-active {\n animation-name: antMoveUpOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-up-leave {\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-down-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-down-enter.ant-move-down-enter-active,\n.ant-move-down-appear.ant-move-down-appear-active {\n animation-name: antMoveDownIn;\n animation-play-state: running;\n}\n.ant-move-down-leave.ant-move-down-leave-active {\n animation-name: antMoveDownOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-down-leave {\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-left-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-left-enter.ant-move-left-enter-active,\n.ant-move-left-appear.ant-move-left-appear-active {\n animation-name: antMoveLeftIn;\n animation-play-state: running;\n}\n.ant-move-left-leave.ant-move-left-leave-active {\n animation-name: antMoveLeftOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-left-leave {\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-right-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-move-right-enter.ant-move-right-enter-active,\n.ant-move-right-appear.ant-move-right-appear-active {\n animation-name: antMoveRightIn;\n animation-play-state: running;\n}\n.ant-move-right-leave.ant-move-right-leave-active {\n animation-name: antMoveRightOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-right-leave {\n animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n@keyframes antMoveDownIn {\n 0% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveDownOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveLeftIn {\n 0% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveLeftOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveRightIn {\n 0% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveRightOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes antMoveUpIn {\n 0% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n@keyframes antMoveUpOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n 100% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n@keyframes loadingCircle {\n 100% {\n transform: rotate(360deg);\n }\n}\n[ant-click-animating='true'],\n[ant-click-animating-without-extra-node='true'] {\n position: relative;\n}\nhtml {\n --antd-wave-shadow-color: #1890ff;\n --scroll-bar: 0;\n}\n[ant-click-animating-without-extra-node='true']::after,\n.ant-click-animating-node {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n border-radius: inherit;\n box-shadow: 0 0 0 0 #1890ff;\n box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);\n opacity: 0.2;\n animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n@keyframes waveEffect {\n 100% {\n box-shadow: 0 0 0 #1890ff;\n box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);\n }\n}\n@keyframes fadeEffect {\n 100% {\n opacity: 0;\n }\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-up-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-up-enter.ant-slide-up-enter-active,\n.ant-slide-up-appear.ant-slide-up-appear-active {\n animation-name: antSlideUpIn;\n animation-play-state: running;\n}\n.ant-slide-up-leave.ant-slide-up-leave-active {\n animation-name: antSlideUpOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-up-leave {\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-down-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-down-enter.ant-slide-down-enter-active,\n.ant-slide-down-appear.ant-slide-down-appear-active {\n animation-name: antSlideDownIn;\n animation-play-state: running;\n}\n.ant-slide-down-leave.ant-slide-down-leave-active {\n animation-name: antSlideDownOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-down-leave {\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-left-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-left-enter.ant-slide-left-enter-active,\n.ant-slide-left-appear.ant-slide-left-appear-active {\n animation-name: antSlideLeftIn;\n animation-play-state: running;\n}\n.ant-slide-left-leave.ant-slide-left-leave-active {\n animation-name: antSlideLeftOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-left-leave {\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-right-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-slide-right-enter.ant-slide-right-enter-active,\n.ant-slide-right-appear.ant-slide-right-appear-active {\n animation-name: antSlideRightIn;\n animation-play-state: running;\n}\n.ant-slide-right-leave.ant-slide-right-leave-active {\n animation-name: antSlideRightOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n opacity: 0;\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-right-leave {\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n@keyframes antSlideUpIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideUpOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@keyframes antSlideDownIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n 100% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n}\n@keyframes antSlideDownOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n 100% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n}\n@keyframes antSlideLeftIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideLeftOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n@keyframes antSlideRightIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n 100% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n}\n@keyframes antSlideRightOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n 100% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-enter.ant-zoom-enter-active,\n.ant-zoom-appear.ant-zoom-appear-active {\n animation-name: antZoomIn;\n animation-play-state: running;\n}\n.ant-zoom-leave.ant-zoom-leave-active {\n animation-name: antZoomOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-enter-prepare,\n.ant-zoom-appear-prepare {\n transform: none;\n}\n.ant-zoom-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-big-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-big-enter.ant-zoom-big-enter-active,\n.ant-zoom-big-appear.ant-zoom-big-appear-active {\n animation-name: antZoomBigIn;\n animation-play-state: running;\n}\n.ant-zoom-big-leave.ant-zoom-big-leave-active {\n animation-name: antZoomBigOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-enter-prepare,\n.ant-zoom-big-appear-prepare {\n transform: none;\n}\n.ant-zoom-big-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n animation-duration: 0.1s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-big-fast-leave {\n animation-duration: 0.1s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,\n.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {\n animation-name: antZoomBigIn;\n animation-play-state: running;\n}\n.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {\n animation-name: antZoomBigOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-fast-enter-prepare,\n.ant-zoom-big-fast-appear-prepare {\n transform: none;\n}\n.ant-zoom-big-fast-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-up-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-up-enter.ant-zoom-up-enter-active,\n.ant-zoom-up-appear.ant-zoom-up-appear-active {\n animation-name: antZoomUpIn;\n animation-play-state: running;\n}\n.ant-zoom-up-leave.ant-zoom-up-leave-active {\n animation-name: antZoomUpOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-up-enter-prepare,\n.ant-zoom-up-appear-prepare {\n transform: none;\n}\n.ant-zoom-up-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-down-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-down-enter.ant-zoom-down-enter-active,\n.ant-zoom-down-appear.ant-zoom-down-appear-active {\n animation-name: antZoomDownIn;\n animation-play-state: running;\n}\n.ant-zoom-down-leave.ant-zoom-down-leave-active {\n animation-name: antZoomDownOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-down-enter-prepare,\n.ant-zoom-down-appear-prepare {\n transform: none;\n}\n.ant-zoom-down-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-left-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-left-enter.ant-zoom-left-enter-active,\n.ant-zoom-left-appear.ant-zoom-left-appear-active {\n animation-name: antZoomLeftIn;\n animation-play-state: running;\n}\n.ant-zoom-left-leave.ant-zoom-left-leave-active {\n animation-name: antZoomLeftOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-left-enter-prepare,\n.ant-zoom-left-appear-prepare {\n transform: none;\n}\n.ant-zoom-left-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-right-leave {\n animation-duration: 0.2s;\n animation-fill-mode: both;\n animation-play-state: paused;\n}\n.ant-zoom-right-enter.ant-zoom-right-enter-active,\n.ant-zoom-right-appear.ant-zoom-right-appear-active {\n animation-name: antZoomRightIn;\n animation-play-state: running;\n}\n.ant-zoom-right-leave.ant-zoom-right-leave-active {\n animation-name: antZoomRightOut;\n animation-play-state: running;\n pointer-events: none;\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n transform: scale(0);\n opacity: 0;\n animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-right-enter-prepare,\n.ant-zoom-right-appear-prepare {\n transform: none;\n}\n.ant-zoom-right-leave {\n animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n@keyframes antZoomIn {\n 0% {\n transform: scale(0.2);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes antZoomOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.2);\n opacity: 0;\n }\n}\n@keyframes antZoomBigIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes antZoomBigOut {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0.8);\n opacity: 0;\n }\n}\n@keyframes antZoomUpIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n}\n@keyframes antZoomUpOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n}\n@keyframes antZoomLeftIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n}\n@keyframes antZoomLeftOut {\n 0% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n}\n@keyframes antZoomRightIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n}\n@keyframes antZoomRightOut {\n 0% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n}\n@keyframes antZoomDownIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n}\n@keyframes antZoomDownOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n}\n.ant-motion-collapse-legacy {\n overflow: hidden;\n}\n.ant-motion-collapse-legacy-active {\n transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-motion-collapse {\n overflow: hidden;\n transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n","/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.tinyColorMixin() {\n@functions: ~`(function() {\n// TinyColor v1.4.1\n// https://github.com/bgrins/TinyColor\n// 2016-07-07, Brian Grinstead, MIT License\nvar trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n\nfunction tinycolor (color, opts) {\n\n color = (color) ? color : '';\n opts = opts || { };\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n\n var rgb = inputToRGB(color);\n this._originalInput = color,\n this._r = rgb.r,\n this._g = rgb.g,\n this._b = rgb.b,\n this._a = rgb.a,\n this._roundA = mathRound(100*this._a) / 100,\n this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by inputToRgb\n if (this._r < 1) { this._r = mathRound(this._r); }\n if (this._g < 1) { this._g = mathRound(this._g); }\n if (this._b < 1) { this._b = mathRound(this._b); }\n\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n}\n\ntinycolor.prototype = {\n isDark: function() {\n return this.getBrightness() < 128;\n },\n isLight: function() {\n return !this.isDark();\n },\n isValid: function() {\n return this._ok;\n },\n getOriginalInput: function() {\n return this._originalInput;\n },\n getFormat: function() {\n return this._format;\n },\n getAlpha: function() {\n return this._a;\n },\n getBrightness: function() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r/255;\n GsRGB = rgb.g/255;\n BsRGB = rgb.b/255;\n\n if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}\n if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}\n if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}\n return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);\n },\n setAlpha: function(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100*this._a) / 100;\n return this;\n },\n toHsv: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n },\n toHsvString: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);\n return (this._a == 1) ?\n \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" :\n \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \"+ this._roundA + \")\";\n },\n toHsl: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n },\n toHslString: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);\n return (this._a == 1) ?\n \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" :\n \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \"+ this._roundA + \")\";\n },\n toHex: function(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function(allow3Char) {\n return '#' + this.toHex(allow3Char);\n },\n toHex8: function(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function(allow4Char) {\n return '#' + this.toHex8(allow4Char);\n },\n toRgb: function() {\n return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n },\n toRgbString: function() {\n return (this._a == 1) ?\n \"rgb(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" :\n \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function() {\n return { r: mathRound(bound01(this._r, 255) * 100) + \"%\", g: mathRound(bound01(this._g, 255) * 100) + \"%\", b: mathRound(bound01(this._b, 255) * 100) + \"%\", a: this._a };\n },\n toPercentageRgbString: function() {\n return (this._a == 1) ?\n \"rgb(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" :\n \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function() {\n if (this._a === 0) {\n return \"transparent\";\n }\n\n if (this._a < 1) {\n return false;\n }\n\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function(secondColor) {\n var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n\n return \"progid:DXImageTransform.Microsoft.gradient(\"+gradientType+\"startColorstr=\"+hex8String+\",endColorstr=\"+secondHex8String+\")\";\n },\n toString: function(format) {\n var formatSet = !!format;\n format = format || this._format;\n\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n\n return formattedString || this.toHexString();\n },\n clone: function() {\n return tinycolor(this.toString());\n },\n\n _applyModification: function(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function() {\n return this._applyModification(lighten, arguments);\n },\n brighten: function() {\n return this._applyModification(brighten, arguments);\n },\n darken: function() {\n return this._applyModification(darken, arguments);\n },\n desaturate: function() {\n return this._applyModification(desaturate, arguments);\n },\n saturate: function() {\n return this._applyModification(saturate, arguments);\n },\n greyscale: function() {\n return this._applyModification(greyscale, arguments);\n },\n spin: function() {\n return this._applyModification(spin, arguments);\n },\n\n _applyCombination: function(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function() {\n return this._applyCombination(analogous, arguments);\n },\n complement: function() {\n return this._applyCombination(complement, arguments);\n },\n monochromatic: function() {\n return this._applyCombination(monochromatic, arguments);\n },\n splitcomplement: function() {\n return this._applyCombination(splitcomplement, arguments);\n },\n triad: function() {\n return this._applyCombination(triad, arguments);\n },\n tetrad: function() {\n return this._applyCombination(tetrad, arguments);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function(color, opts) {\n if (typeof color == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n }\n else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n\n if (typeof color == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n\n a = boundAlpha(a);\n\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from:\n// \n\n// rgbToRgb\n// Handle bounds / percentage checking to conform to CSS color spec\n// \n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b){\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// rgbToHsl\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, l = (max + min) / 2;\n\n if(max == min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n}\n\n// hslToRgb\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n if(s === 0) {\n r = g = b = l; // achromatic\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// rgbToHsv\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if(max == min) {\n h = 0; // achromatic\n }\n else {\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n\n// hsvToRgb\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// rgbToHex\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n\n return hex.join(\"\");\n}\n\n// rgbaToHex\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16)),\n pad2(convertDecimalToHex(a))\n ];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n\n return hex.join(\"\");\n}\n\n// rgbaToArgbHex\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n return hex.join(\"\");\n}\n\n// equals\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) { return false; }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\n\ntinycolor.random = function() {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// \n\nfunction desaturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction saturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\n\nfunction lighten (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\nfunction brighten(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));\n return tinycolor(rgb);\n}\n\nfunction darken (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// \n\nfunction complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\n\nfunction triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),\n tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})\n ];\n}\n\nfunction analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n\n for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\n\nfunction monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h, s = hsv.s, v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n\n while (results--) {\n ret.push(tinycolor({ h: h, s: s, v: v}));\n v = (v + modification) % 1;\n }\n\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function(color1, color2, amount) {\n amount = (amount === 0) ? 0 : (amount || 50);\n\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n\n var p = amount / 100;\n\n var rgba = {\n r: ((rgb2.r - rgb1.r) * p) + rgb1.r,\n g: ((rgb2.g - rgb1.g) * p) + rgb1.g,\n b: ((rgb2.b - rgb1.b) * p) + rgb1.b,\n a: ((rgb2.a - rgb1.a) * p) + rgb1.a\n };\n\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function(color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n\n out = false;\n\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n\n};\n\n// mostReadable\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function(baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size ;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors ;\n level = args.level;\n size = args.size;\n\n for (var i= 0; i < colorList.length ; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n\n if (tinycolor.isReadable(baseColor, bestColor, {\"level\":level,\"size\":size}) || !includeFallbackColors) {\n return bestColor;\n }\n else {\n args.includeFallbackColors=false;\n return tinycolor.mostReadable(baseColor,[\"#fff\", \"#000\"],args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// \nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via hexNames[hex]\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// { 'name1': 'val1' } becomes { 'val1': 'name1' }\nfunction flip(o) {\n var flipped = { };\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) { n = \"100%\"; }\n\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if ((Math.abs(n - max) < 0.000001)) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return (n % max) / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return mathMin(1, mathMax(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// \nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? '0' + c : '' + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = (n * 100) + \"%\";\n }\n\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return (parseIntFromHex(h) / 255);\n}\n\nvar matchers = (function() {\n\n // \n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // \n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n})();\n\n// isValidCSSUnit\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see matchers above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// stringInputToObject\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns { r, g, b } or { h, s, l } or { h, s, v}\nfunction stringInputToObject(color) {\n\n color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color == 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if ((match = matchers.rgb.exec(color))) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if ((match = matchers.rgba.exec(color))) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if ((match = matchers.hsl.exec(color))) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if ((match = matchers.hsla.exec(color))) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if ((match = matchers.hsv.exec(color))) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if ((match = matchers.hsva.exec(color))) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if ((match = matchers.hex8.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if ((match = matchers.hex6.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if ((match = matchers.hex4.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n a: convertHexToDecimal(match[4] + '' + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if ((match = matchers.hex3.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n\n return false;\n}\n\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\"level\":\"AA\", \"size\":\"small\"};\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\"level\":level, \"size\":size};\n}\n\nthis.tinycolor = tinycolor;\n\n})()`;\n}\n// It is hacky way to make this function will be compiled preferentially by less\n// resolve error: `ReferenceError: colorPalette is not defined`\n// https://github.com/ant-design/ant-motion/issues/44\n.tinyColorMixin();\n","// Sizing shortcuts\n\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n\n.square(@size) {\n .size(@size; @size);\n}\n","/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n// HTML & Body reset\n@{html-selector},\nbody {\n .square(100%);\n}\n\n// remove the clear button of a text input control in IE10+\ninput::-ms-clear,\ninput::-ms-reveal {\n display: none;\n}\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\n@{html-selector} {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: fade(@black, 0%); // 6\n}\n\n// IE10+ doesn't honor `` in some cases.\n@-ms-viewport {\n width: device-width;\n}\n\n// Body\n//\n// 1. remove the margin in all browsers.\n// 2. As a best practice, apply a default `body-background`.\n\nbody {\n margin: 0; // 1\n color: @text-color;\n font-size: @font-size-base;\n font-family: @font-family;\n font-variant: @font-variant-base;\n line-height: @line-height-base;\n background-color: @body-background; // 2\n font-feature-settings: @font-feature-settings-base;\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex='-1']:focus {\n outline: none !important;\n}\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n//\n// Typography\n//\n\n// remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: 0.5em;\n color: @heading-color;\n font-weight: 500;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `em` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1em;\n}\n\n// Abbreviations\n//\n// 1. remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] {\n // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n border-bottom: 0; // 1\n cursor: help; // 3\n}\n\naddress {\n margin-bottom: 1em;\n font-style: normal;\n line-height: inherit;\n}\n\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n -webkit-appearance: none;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1em;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 500;\n}\n\ndd {\n margin-bottom: 0.5em;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1em;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n//\n// Links\n//\n\na {\n color: @link-color;\n text-decoration: @link-decoration;\n background-color: transparent; // remove the gray background on active links in IE 10.\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n -webkit-text-decoration-skip: objects; // remove gaps in links underline in iOS 8+ and Safari 8+.\n\n &:hover {\n color: @link-hover-color;\n }\n\n &:active {\n color: @link-active-color;\n }\n\n &:active,\n &:hover {\n text-decoration: @link-hover-decoration;\n outline: 0;\n }\n\n // https://github.com/ant-design/ant-design/issues/22503\n &:focus {\n text-decoration: @link-focus-decoration;\n outline: @link-focus-outline;\n }\n\n &[disabled] {\n color: @disabled-color;\n cursor: not-allowed;\n }\n}\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n font-family: @code-family;\n}\n\npre {\n // remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `em`s\n margin-bottom: 1em;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n//\n// Figures\n//\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1em;\n}\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // remove the border on images inside links in IE 10-.\n}\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `` is present.\n// However, they DO support emoving the click delay via `touch-action: manipulation`.\n// See:\n// * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: 0.75em;\n padding-bottom: 0.3em;\n color: @text-color-secondary;\n text-align: left;\n caption-side: bottom;\n}\n\n//\n// Forms\n//\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // remove the margin in Firefox and Safari\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n@{html-selector} [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type='radio'],\ninput[type='checkbox'] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. remove the padding in IE 10-\n}\n\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n // remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n margin: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n margin-bottom: 0.5em;\n padding: 0;\n color: inherit; // 2\n font-size: 1.5em;\n line-height: inherit;\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of incement and decement buttons in Chrome.\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type='search'] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n\nmark {\n padding: 0.2em;\n background-color: @yellow-1;\n}\n\n::selection {\n color: @text-color-inverse;\n background: @text-selection-bg;\n}\n\n// Utility classes\n.clearfix {\n .clearfix();\n}\n","// mixins for clearfix\n// ------------------------\n.clearfix() {\n // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229\n &::before {\n display: table;\n content: '';\n }\n\n &::after {\n // https://github.com/ant-design/ant-design/issues/21864\n display: table;\n clear: both;\n content: '';\n }\n}\n",".iconfont-mixin() {\n display: inline-block;\n color: @icon-color;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em; // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4\n text-rendering: optimizelegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n > * {\n line-height: 1;\n }\n\n svg {\n display: inline-block;\n }\n\n &::before {\n display: none; // dont display old icon.\n }\n\n & &-icon {\n display: block;\n }\n}\n","@import '../themes/index';\n@import '../mixins/iconfont';\n\n.@{iconfont-css-prefix} {\n .iconfont-mixin();\n\n // https://github.com/ant-design/ant-design/issues/33703\n & > & {\n line-height: 0;\n vertical-align: 0;\n }\n\n &[tabindex] {\n cursor: pointer;\n }\n}\n\n.@{iconfont-css-prefix}-spin,\n.@{iconfont-css-prefix}-spin::before {\n display: inline-block;\n animation: loadingCircle 1s infinite linear;\n}\n",".motion-common(@duration: @animation-duration-base) {\n animation-duration: @duration;\n animation-fill-mode: both;\n}\n\n.motion-common-leave(@duration: @animation-duration-base) {\n animation-duration: @duration;\n animation-fill-mode: both;\n}\n\n.make-motion(@className, @keyframeName, @duration: @animation-duration-base) {\n .@{className}-enter,\n .@{className}-appear {\n .motion-common(@duration);\n\n animation-play-state: paused;\n }\n .@{className}-leave {\n .motion-common-leave(@duration);\n\n animation-play-state: paused;\n }\n .@{className}-enter.@{className}-enter-active,\n .@{className}-appear.@{className}-appear-active {\n animation-name: ~'@{keyframeName}In';\n animation-play-state: running;\n }\n .@{className}-leave.@{className}-leave-active {\n animation-name: ~'@{keyframeName}Out';\n animation-play-state: running;\n pointer-events: none;\n }\n}\n",".fade-motion(@className, @keyframeName) {\n @name: ~'@{ant-prefix}-@{className}';\n .make-motion(@name, @keyframeName);\n .@{name}-enter,\n .@{name}-appear {\n opacity: 0;\n animation-timing-function: linear;\n }\n .@{name}-leave {\n animation-timing-function: linear;\n }\n}\n\n.fade-motion(fade, antFade);\n\n@keyframes antFadeIn {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes antFadeOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n }\n}\n",".move-motion(@className, @keyframeName) {\n @name: ~'@{ant-prefix}-@{className}';\n .make-motion(@name, @keyframeName);\n .@{name}-enter,\n .@{name}-appear {\n opacity: 0;\n animation-timing-function: @ease-out-circ;\n }\n .@{name}-leave {\n animation-timing-function: @ease-in-circ;\n }\n}\n\n.move-motion(move-up, antMoveUp);\n.move-motion(move-down, antMoveDown);\n.move-motion(move-left, antMoveLeft);\n.move-motion(move-right, antMoveRight);\n\n@keyframes antMoveDownIn {\n 0% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n\n@keyframes antMoveDownOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n\n 100% {\n transform: translateY(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n\n@keyframes antMoveLeftIn {\n 0% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n\n@keyframes antMoveLeftOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n\n 100% {\n transform: translateX(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n\n@keyframes antMoveRightIn {\n 0% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n\n 100% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n\n@keyframes antMoveRightOut {\n 0% {\n transform: translateX(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n\n 100% {\n transform: translateX(100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n\n@keyframes antMoveUpIn {\n 0% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n\n 100% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n}\n\n@keyframes antMoveUpOut {\n 0% {\n transform: translateY(0%);\n transform-origin: 0 0;\n opacity: 1;\n }\n\n 100% {\n transform: translateY(-100%);\n transform-origin: 0 0;\n opacity: 0;\n }\n}\n","@keyframes loadingCircle {\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@click-animating-true: ~\"[@{ant-prefix}-click-animating='true']\";\n@click-animating-with-extra-node-true: ~\"[@{ant-prefix}-click-animating-without-extra-node='true']\";\n\n@{click-animating-true},\n@{click-animating-with-extra-node-true} {\n position: relative;\n}\n\nhtml {\n --antd-wave-shadow-color: @primary-color;\n --scroll-bar: 0;\n}\n\n@click-animating-with-extra-node-true-after: ~'@{click-animating-with-extra-node-true}::after';\n\n@{click-animating-with-extra-node-true-after},\n.@{ant-prefix}-click-animating-node {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n border-radius: inherit;\n box-shadow: 0 0 0 0 @primary-color;\n box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);\n opacity: 0.2;\n animation: fadeEffect 2s @ease-out-circ, waveEffect 0.4s @ease-out-circ;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n\n@keyframes waveEffect {\n 100% {\n box-shadow: 0 0 0 @primary-color;\n box-shadow: 0 0 0 @wave-animation-width var(--antd-wave-shadow-color);\n }\n}\n\n@keyframes fadeEffect {\n 100% {\n opacity: 0;\n }\n}\n",".slide-motion(@className, @keyframeName) {\n @name: ~'@{ant-prefix}-@{className}';\n .make-motion(@name, @keyframeName);\n .@{name}-enter,\n .@{name}-appear {\n opacity: 0;\n animation-timing-function: @ease-out-quint;\n }\n .@{name}-leave {\n animation-timing-function: @ease-in-quint;\n }\n}\n\n.slide-motion(slide-up, antSlideUp);\n.slide-motion(slide-down, antSlideDown);\n.slide-motion(slide-left, antSlideLeft);\n.slide-motion(slide-right, antSlideRight);\n\n@keyframes antSlideUpIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n\n 100% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n\n@keyframes antSlideUpOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n\n 100% {\n transform: scaleY(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n\n@keyframes antSlideDownIn {\n 0% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n\n 100% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n}\n\n@keyframes antSlideDownOut {\n 0% {\n transform: scaleY(1);\n transform-origin: 100% 100%;\n opacity: 1;\n }\n\n 100% {\n transform: scaleY(0.8);\n transform-origin: 100% 100%;\n opacity: 0;\n }\n}\n\n@keyframes antSlideLeftIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n\n 100% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n}\n\n@keyframes antSlideLeftOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 0% 0%;\n opacity: 1;\n }\n\n 100% {\n transform: scaleX(0.8);\n transform-origin: 0% 0%;\n opacity: 0;\n }\n}\n\n@keyframes antSlideRightIn {\n 0% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n\n 100% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n}\n\n@keyframes antSlideRightOut {\n 0% {\n transform: scaleX(1);\n transform-origin: 100% 0%;\n opacity: 1;\n }\n\n 100% {\n transform: scaleX(0.8);\n transform-origin: 100% 0%;\n opacity: 0;\n }\n}\n",".zoom-motion(@className, @keyframeName, @duration: @animation-duration-base) {\n @name: ~'@{ant-prefix}-@{className}';\n .make-motion(@name, @keyframeName, @duration);\n .@{name}-enter,\n .@{name}-appear {\n transform: scale(0); // need this by yiminghe\n opacity: 0;\n animation-timing-function: @ease-out-circ;\n\n &-prepare {\n transform: none;\n }\n }\n .@{name}-leave {\n animation-timing-function: @ease-in-out-circ;\n }\n}\n\n// For Modal, Select choosen item\n.zoom-motion(zoom, antZoom);\n// For Popover, Popconfirm, Dropdown\n.zoom-motion(zoom-big, antZoomBig);\n// For Tooltip\n.zoom-motion(zoom-big-fast, antZoomBig, @animation-duration-fast);\n\n.zoom-motion(zoom-up, antZoomUp);\n.zoom-motion(zoom-down, antZoomDown);\n.zoom-motion(zoom-left, antZoomLeft);\n.zoom-motion(zoom-right, antZoomRight);\n\n@keyframes antZoomIn {\n 0% {\n transform: scale(0.2);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes antZoomOut {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n transform: scale(0.2);\n opacity: 0;\n }\n}\n\n@keyframes antZoomBigIn {\n 0% {\n transform: scale(0.8);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes antZoomBigOut {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n transform: scale(0.8);\n opacity: 0;\n }\n}\n\n@keyframes antZoomUpIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n}\n\n@keyframes antZoomUpOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 0%;\n }\n\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 0%;\n opacity: 0;\n }\n}\n\n@keyframes antZoomLeftIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n}\n\n@keyframes antZoomLeftOut {\n 0% {\n transform: scale(1);\n transform-origin: 0% 50%;\n }\n\n 100% {\n transform: scale(0.8);\n transform-origin: 0% 50%;\n opacity: 0;\n }\n}\n\n@keyframes antZoomRightIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n}\n\n@keyframes antZoomRightOut {\n 0% {\n transform: scale(1);\n transform-origin: 100% 50%;\n }\n\n 100% {\n transform: scale(0.8);\n transform-origin: 100% 50%;\n opacity: 0;\n }\n}\n\n@keyframes antZoomDownIn {\n 0% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n}\n\n@keyframes antZoomDownOut {\n 0% {\n transform: scale(1);\n transform-origin: 50% 100%;\n }\n\n 100% {\n transform: scale(0.8);\n transform-origin: 50% 100%;\n opacity: 0;\n }\n}\n","// @import '../mixins/motion'; This has moved to theme/xxx inside.\n@import 'motion/fade';\n@import 'motion/move';\n@import 'motion/other';\n@import 'motion/slide';\n@import 'motion/zoom';\n\n// For common/openAnimation\n.ant-motion-collapse-legacy {\n overflow: hidden;\n\n &-active {\n transition: height @animation-duration-base @ease-in-out,\n opacity @animation-duration-base @ease-in-out !important;\n }\n}\n\n.ant-motion-collapse {\n overflow: hidden;\n transition: height @animation-duration-base @ease-in-out,\n opacity @animation-duration-base @ease-in-out !important;\n}\n","@import '../../style/themes/index';\n\n.@{ant-prefix}-affix {\n position: fixed;\n z-index: @zindex-affix;\n}\n\n@root-entry-name: default;",".reset-component() {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: @text-color;\n font-size: @font-size-base;\n font-variant: @font-variant-base;\n line-height: @line-height-base;\n list-style: none;\n font-feature-settings: @font-feature-settings-base;\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@alert-prefix-cls: ~'@{ant-prefix}-alert';\n\n.@{alert-prefix-cls} {\n .reset-component();\n\n position: relative;\n display: flex;\n align-items: center;\n padding: 8px 15px;\n word-wrap: break-word;\n border-radius: @border-radius-base;\n\n &-content {\n flex: 1;\n min-width: 0;\n }\n\n &-icon {\n margin-right: @margin-xs;\n }\n\n &-description {\n display: none;\n font-size: @font-size-base;\n line-height: @font-size-base + 8px;\n }\n\n &-success {\n background-color: @alert-success-bg-color;\n border: @border-width-base @border-style-base @alert-success-border-color;\n .@{alert-prefix-cls}-icon {\n color: @alert-success-icon-color;\n }\n }\n\n &-info {\n background-color: @alert-info-bg-color;\n border: @border-width-base @border-style-base @alert-info-border-color;\n .@{alert-prefix-cls}-icon {\n color: @alert-info-icon-color;\n }\n }\n\n &-warning {\n background-color: @alert-warning-bg-color;\n border: @border-width-base @border-style-base @alert-warning-border-color;\n .@{alert-prefix-cls}-icon {\n color: @alert-warning-icon-color;\n }\n }\n\n &-error {\n background-color: @alert-error-bg-color;\n border: @border-width-base @border-style-base @alert-error-border-color;\n\n .@{alert-prefix-cls}-icon {\n color: @alert-error-icon-color;\n }\n\n .@{alert-prefix-cls}-description > pre {\n margin: 0;\n padding: 0;\n }\n }\n\n &-action {\n margin-left: @margin-xs;\n }\n\n &-close-icon {\n margin-left: @margin-xs;\n padding: 0;\n overflow: hidden;\n font-size: @font-size-sm;\n line-height: @font-size-sm;\n background-color: transparent;\n border: none;\n outline: none;\n cursor: pointer;\n\n .@{iconfont-css-prefix}-close {\n color: @alert-close-color;\n transition: color 0.3s;\n\n &:hover {\n color: @alert-close-hover-color;\n }\n }\n }\n\n &-close-text {\n color: @alert-close-color;\n transition: color 0.3s;\n\n &:hover {\n color: @alert-close-hover-color;\n }\n }\n\n &-with-description {\n align-items: flex-start;\n padding: @alert-with-description-padding;\n }\n\n &-with-description&-no-icon {\n padding: @alert-with-description-no-icon-padding-vertical 15px;\n }\n\n &-with-description &-icon {\n margin-right: @alert-with-description-padding-vertical;\n font-size: @alert-with-description-icon-size;\n }\n\n &-with-description &-message {\n display: block;\n margin-bottom: 4px;\n color: @alert-message-color;\n font-size: @font-size-lg;\n }\n\n &-message {\n color: @alert-message-color;\n }\n\n &-with-description &-description {\n display: block;\n }\n\n &&-motion-leave {\n overflow: hidden;\n opacity: 1;\n transition: max-height 0.3s @ease-in-out-circ, opacity 0.3s @ease-in-out-circ,\n padding-top 0.3s @ease-in-out-circ, padding-bottom 0.3s @ease-in-out-circ,\n margin-bottom 0.3s @ease-in-out-circ;\n }\n\n &&-motion-leave-active {\n max-height: 0;\n margin-bottom: 0 !important;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n\n &-banner {\n margin-bottom: 0;\n border: 0;\n border-radius: 0;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{alert-prefix-cls} {\n &&-rtl {\n direction: rtl;\n }\n\n &-icon {\n .@{alert-prefix-cls}-rtl & {\n margin-right: auto;\n margin-left: @margin-xs;\n }\n }\n\n &-action {\n .@{alert-prefix-cls}-rtl & {\n margin-right: @margin-xs;\n margin-left: auto;\n }\n }\n\n &-close-icon {\n .@{alert-prefix-cls}-rtl & {\n margin-right: @margin-xs;\n margin-left: auto;\n }\n }\n\n &-with-description {\n .@{alert-prefix-cls}-rtl& {\n padding-right: @alert-with-description-icon-size;\n padding-left: @alert-with-description-padding-vertical;\n }\n\n .@{alert-prefix-cls}-icon {\n .@{alert-prefix-cls}-rtl& {\n margin-right: auto;\n margin-left: @alert-with-description-padding-vertical;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@anchor-border-width: 2px;\n\n.@{ant-prefix}-anchor {\n .reset-component();\n\n position: relative;\n padding-left: @anchor-border-width;\n\n &-wrapper {\n margin-left: -4px;\n padding-left: 4px;\n overflow: auto;\n background-color: @anchor-bg;\n }\n\n &-ink {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n\n &::before {\n position: relative;\n display: block;\n width: @anchor-border-width;\n height: 100%;\n margin: 0 auto;\n background-color: @anchor-border-color;\n content: ' ';\n }\n\n &-ball {\n position: absolute;\n left: 50%;\n display: none;\n width: 8px;\n height: 8px;\n background-color: @component-background;\n border: 2px solid @primary-color;\n border-radius: 8px;\n transform: translateX(-50%);\n transition: top 0.3s ease-in-out;\n\n &.visible {\n display: inline-block;\n }\n }\n }\n\n &-fixed &-ink &-ink-ball {\n display: none;\n }\n\n &-link {\n padding: @anchor-link-padding;\n\n &-title {\n position: relative;\n display: block;\n margin-bottom: 3px;\n overflow: hidden;\n color: @text-color;\n white-space: nowrap;\n text-overflow: ellipsis;\n transition: all 0.3s;\n\n &:only-child {\n margin-bottom: 0;\n }\n }\n\n &-active > &-title {\n color: @primary-color;\n }\n }\n\n &-link &-link {\n padding-top: 2px;\n padding-bottom: 2px;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{ant-prefix}-anchor {\n &-rtl {\n direction: rtl;\n }\n\n &-wrapper {\n .@{ant-prefix}-anchor-rtl& {\n margin-right: -4px;\n margin-left: 0;\n padding-right: 4px;\n padding-left: 0;\n }\n }\n\n &-ink {\n .@{ant-prefix}-anchor-rtl & {\n right: 0;\n left: auto;\n }\n\n &-ball {\n .@{ant-prefix}-anchor-rtl & {\n right: 50%;\n left: 0;\n transform: translateX(50%);\n }\n }\n }\n\n &-link {\n .@{ant-prefix}-anchor-rtl & {\n padding: @anchor-link-top @anchor-link-left @anchor-link-top 0;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n\n@input-prefix-cls: ~'@{ant-prefix}-input';\n@select-prefix-cls: ~'@{ant-prefix}-select';\n@autocomplete-prefix-cls: ~'@{select-prefix-cls}-auto-complete';\n\n.@{autocomplete-prefix-cls} {\n .reset-component();\n\n // https://github.com/ant-design/ant-design/issues/22302\n .@{select-prefix-cls}-clear {\n right: 13px;\n }\n}\n\n@root-entry-name: default;","/* stylelint-disable */\n.bezierEasingMixin() {\n@functions: ~`(function() {\n var NEWTON_ITERATIONS = 4;\n var NEWTON_MIN_SLOPE = 0.001;\n var SUBDIVISION_PRECISION = 0.0000001;\n var SUBDIVISION_MAX_ITERATIONS = 10;\n\n var kSplineTableSize = 11;\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\n var float32ArraySupported = typeof Float32Array === 'function';\n\n function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\n function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\n function C (aA1) { return 3.0 * aA1; }\n\n // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\n function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\n function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\n function binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n }\n\n function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n }\n\n var BezierEasing = function (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n if (mX1 !== mY1 || mX2 !== mY2) {\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n if (mX1 === mY1 && mX2 === mY2) {\n return x; // linear\n }\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n };\n\n this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18);\n // less 3 requires a return\n return '';\n})()`;\n}\n// It is hacky way to make this function will be compiled preferentially by less\n// resolve error: `ReferenceError: colorPalette is not defined`\n// https://github.com/ant-design/ant-motion/issues/44\n.bezierEasingMixin();\n","@import (reference) '../../style/themes/index';\n@select-prefix-cls: ~'@{ant-prefix}-select';\n\n@selection-item-padding: ceil(@font-size-base * 1.25);\n\n.@{select-prefix-cls}-single {\n // ========================= Selector =========================\n .@{select-prefix-cls}-selector {\n display: flex;\n\n .@{select-prefix-cls}-selection-search {\n position: absolute;\n top: 0;\n right: @input-padding-horizontal-base;\n bottom: 0;\n left: @input-padding-horizontal-base;\n\n &-input {\n width: 100%;\n }\n }\n\n .@{select-prefix-cls}-selection-item,\n .@{select-prefix-cls}-selection-placeholder {\n padding: 0;\n line-height: @select-height-without-border;\n transition: all 0.3s;\n }\n\n .@{select-prefix-cls}-selection-item {\n position: relative;\n user-select: none;\n }\n\n .@{select-prefix-cls}-selection-placeholder {\n transition: none;\n pointer-events: none;\n }\n\n // For common baseline align\n &::after,\n /* For '' value baseline align */\n .@{select-prefix-cls}-selection-item::after,\n /* For undefined value baseline align */\n .@{select-prefix-cls}-selection-placeholder::after {\n display: inline-block;\n width: 0;\n visibility: hidden;\n content: '\\a0';\n }\n }\n\n // With arrow should provides `padding-right` to show the arrow\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-search {\n right: @input-padding-horizontal-base + @font-size-base;\n }\n\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-item,\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-placeholder {\n padding-right: @selection-item-padding;\n }\n\n // Opacity selection if open\n &.@{select-prefix-cls}-open .@{select-prefix-cls}-selection-item {\n color: @input-placeholder-color;\n }\n\n // ========================== Input ==========================\n // We only change the style of non-customize input which is only support by `combobox` mode.\n\n // Not customize\n &:not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selector {\n width: 100%;\n height: @input-height-base;\n padding: 0 @input-padding-horizontal-base;\n\n .@{select-prefix-cls}-selection-search-input {\n height: @select-height-without-border;\n }\n\n &::after {\n line-height: @select-height-without-border;\n }\n }\n }\n\n &.@{select-prefix-cls}-customize-input {\n .@{select-prefix-cls}-selector {\n &::after {\n display: none;\n }\n\n .@{select-prefix-cls}-selection-search {\n position: static;\n width: 100%;\n }\n\n .@{select-prefix-cls}-selection-placeholder {\n position: absolute;\n right: 0;\n left: 0;\n padding: 0 @input-padding-horizontal-base;\n\n &::after {\n display: none;\n }\n }\n }\n }\n\n // ============================================================\n // == Size ==\n // ============================================================\n .select-size(@suffix, @input-height) {\n @merged-cls: ~'@{select-prefix-cls}-@{suffix}';\n\n &.@{merged-cls}:not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selector {\n height: @input-height;\n\n &::after,\n .@{select-prefix-cls}-selection-item,\n .@{select-prefix-cls}-selection-placeholder {\n line-height: @input-height - 2 * @border-width-base;\n }\n }\n\n // Not customize\n &:not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selection-search-input {\n height: @input-height - 2 * @border-width-base;\n }\n }\n }\n }\n\n .select-size('lg', @select-single-item-height-lg);\n .select-size('sm', @input-height-sm);\n\n // Size small need additional set padding\n &.@{select-prefix-cls}-sm {\n &:not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selection-search {\n right: @input-padding-horizontal-sm;\n left: @input-padding-horizontal-sm;\n }\n\n .@{select-prefix-cls}-selector {\n padding: 0 @input-padding-horizontal-sm;\n }\n\n // With arrow should provides `padding-right` to show the arrow\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-search {\n right: @input-padding-horizontal-sm + @font-size-base * 1.5;\n }\n\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-item,\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-placeholder {\n padding-right: @font-size-base * 1.5;\n }\n }\n }\n\n &.@{select-prefix-cls}-lg {\n &:not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selector {\n padding: 0 @input-padding-horizontal-lg;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import './single';\n@import './multiple';\n@import './status';\n\n@select-prefix-cls: ~'@{ant-prefix}-select';\n@select-height-without-border: @input-height-base - 2 * @border-width-base;\n@select-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;\n\n.select-selector() {\n position: relative;\n background-color: @select-background;\n border: @border-width-base @border-style-base @select-border-color;\n border-radius: @control-border-radius;\n transition: all 0.3s @ease-in-out;\n\n input {\n cursor: pointer;\n }\n\n .@{select-prefix-cls}-show-search& {\n cursor: text;\n\n input {\n cursor: auto;\n }\n }\n\n .@{select-prefix-cls}-focused:not(.@{select-prefix-cls}-disabled)& {\n .active();\n }\n\n .@{select-prefix-cls}-disabled& {\n color: @disabled-color;\n background: @input-disabled-bg;\n cursor: not-allowed;\n\n .@{select-prefix-cls}-multiple& {\n background: @select-multiple-disabled-background;\n }\n\n input {\n cursor: not-allowed;\n }\n }\n}\n\n/* Reset search input style */\n.select-search-input-without-border() {\n .@{select-prefix-cls}-selection-search-input {\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n appearance: none;\n\n &::-webkit-search-cancel-button {\n display: none;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-appearance: none;\n }\n }\n}\n\n.@{select-prefix-cls} {\n .reset-component();\n position: relative;\n display: inline-block;\n cursor: pointer;\n\n &:not(&-customize-input) &-selector {\n .select-selector();\n .select-search-input-without-border();\n }\n\n &:not(&-disabled):hover &-selector {\n .hover();\n }\n\n // ======================== Selection ========================\n &-selection-item {\n flex: 1;\n overflow: hidden;\n font-weight: normal;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n // IE11 css hack. `*::-ms-backdrop,` is a must have\n @media all and (-ms-high-contrast: none) {\n *::-ms-backdrop,\n & {\n flex: auto;\n }\n }\n }\n\n // ======================= Placeholder =======================\n &-selection-placeholder {\n flex: 1;\n overflow: hidden;\n color: @input-placeholder-color;\n white-space: nowrap;\n text-overflow: ellipsis;\n pointer-events: none;\n\n // IE11 css hack. `*::-ms-backdrop,` is a must have\n @media all and (-ms-high-contrast: none) {\n *::-ms-backdrop,\n & {\n flex: auto;\n }\n }\n }\n\n // ========================== Arrow ==========================\n &-arrow {\n .iconfont-mixin();\n position: absolute;\n top: 50%;\n right: @control-padding-horizontal - 1px;\n display: flex;\n align-items: center;\n height: @font-size-sm;\n margin-top: (-@font-size-sm / 2);\n color: @disabled-color;\n font-size: @font-size-sm;\n line-height: 1;\n text-align: center;\n pointer-events: none;\n\n .@{iconfont-css-prefix} {\n vertical-align: top;\n transition: transform 0.3s;\n\n > svg {\n vertical-align: top;\n }\n\n &:not(.@{select-prefix-cls}-suffix) {\n pointer-events: auto;\n }\n }\n\n .@{select-prefix-cls}-disabled & {\n cursor: not-allowed;\n }\n\n > *:not(:last-child) {\n margin-inline-end: @padding-xs;\n }\n }\n\n // ========================== Clear ==========================\n &-clear {\n position: absolute;\n top: 50%;\n right: @control-padding-horizontal - 1px;\n z-index: 1;\n display: inline-block;\n width: @font-size-sm;\n height: @font-size-sm;\n margin-top: (-@font-size-sm / 2);\n color: @disabled-color;\n font-size: @font-size-sm;\n font-style: normal;\n line-height: 1;\n text-align: center;\n text-transform: none;\n background: @select-clear-background;\n cursor: pointer;\n opacity: 0;\n transition: color 0.3s ease, opacity 0.15s ease;\n text-rendering: auto;\n\n &::before {\n display: block;\n }\n\n &:hover {\n color: @text-color-secondary;\n }\n\n .@{select-prefix-cls}:hover & {\n opacity: 1;\n }\n }\n\n // ========================== Popup ==========================\n &-dropdown {\n .reset-component();\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: @zindex-dropdown;\n box-sizing: border-box;\n padding: @select-dropdown-edge-child-vertical-padding 0;\n overflow: hidden;\n font-size: @font-size-base;\n // Fix select render lag of long text in chrome\n // https://github.com/ant-design/ant-design/issues/11456\n // https://github.com/ant-design/ant-design/issues/11843\n font-variant: initial;\n background-color: @select-dropdown-bg;\n border-radius: @border-radius-base;\n outline: none;\n box-shadow: @box-shadow-base;\n\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-bottomLeft {\n animation-name: antSlideUpIn;\n }\n\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topLeft {\n animation-name: antSlideDownIn;\n }\n\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-bottomLeft {\n animation-name: antSlideUpOut;\n }\n\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topLeft {\n animation-name: antSlideDownOut;\n }\n\n &-hidden {\n display: none;\n }\n\n &-empty {\n color: @disabled-color;\n }\n }\n\n // ========================= Options =========================\n .item() {\n position: relative;\n display: block;\n min-height: @select-dropdown-height;\n padding: @select-dropdown-vertical-padding @control-padding-horizontal;\n color: @text-color;\n font-weight: normal;\n font-size: @select-dropdown-font-size;\n line-height: @select-dropdown-line-height;\n }\n\n &-item-empty {\n .item();\n color: @disabled-color;\n }\n\n &-item {\n .item();\n\n cursor: pointer;\n transition: background 0.3s ease;\n\n // =========== Group ============\n &-group {\n color: @text-color-secondary;\n font-size: @font-size-sm;\n cursor: default;\n }\n\n // =========== Option ===========\n &-option {\n display: flex;\n\n &-content {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-state {\n flex: none;\n }\n\n &-active:not(&-disabled) {\n background-color: @select-item-active-bg;\n }\n\n &-selected:not(&-disabled) {\n color: @select-item-selected-color;\n font-weight: @select-item-selected-font-weight;\n background-color: @select-item-selected-bg;\n\n .@{select-prefix-cls}-item-option-state {\n color: @primary-color;\n }\n }\n\n &-disabled {\n &.@{select-prefix-cls}-item-option-selected {\n background-color: @select-multiple-disabled-background;\n }\n color: @disabled-color;\n cursor: not-allowed;\n }\n\n &-grouped {\n padding-left: @control-padding-horizontal * 2;\n }\n }\n }\n\n // ============================================================\n // == Size ==\n // ============================================================\n &-lg {\n font-size: @font-size-lg;\n }\n\n // no border style\n &-borderless &-selector {\n background-color: transparent !important;\n border-color: transparent !important;\n box-shadow: none !important;\n }\n\n &&-in-form-item {\n width: 100%;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import (reference) '../../style/themes/index';\n@select-prefix-cls: ~'@{ant-prefix}-select';\n\n@select-overflow-prefix-cls: ~'@{select-prefix-cls}-selection-overflow';\n@select-multiple-item-border-width: 1px;\n\n@select-multiple-padding: max(\n @input-padding-vertical-base - @select-multiple-item-border-width -\n @select-multiple-item-spacing-half,\n 0\n);\n\n/**\n * Do not merge `height` & `line-height` under style with `selection` & `search`,\n * since chrome may update to redesign with its align logic.\n */\n\n// =========================== Overflow ===========================\n.@{select-overflow-prefix-cls} {\n position: relative;\n display: flex;\n flex: auto;\n flex-wrap: wrap;\n max-width: 100%;\n\n &-item {\n flex: none;\n align-self: center;\n max-width: 100%;\n }\n}\n\n.@{select-prefix-cls} {\n &-multiple {\n // ========================= Selector =========================\n .@{select-prefix-cls}-selector {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n // Multiple is little different that horizontal is follow the vertical\n padding: @select-multiple-padding @input-padding-vertical-base;\n\n .@{select-prefix-cls}-show-search& {\n cursor: text;\n }\n\n .@{select-prefix-cls}-disabled& {\n background: @select-multiple-disabled-background;\n cursor: not-allowed;\n }\n\n &::after {\n display: inline-block;\n width: 0;\n margin: @select-multiple-item-spacing-half 0;\n line-height: @select-multiple-item-height;\n content: '\\a0';\n }\n }\n\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selector,\n &.@{select-prefix-cls}-allow-clear .@{select-prefix-cls}-selector {\n padding-right: @font-size-sm + @control-padding-horizontal;\n }\n\n // ======================== Selections ========================\n .@{select-prefix-cls}-selection-item {\n position: relative;\n display: flex;\n flex: none;\n box-sizing: border-box;\n max-width: 100%;\n\n height: @select-multiple-item-height;\n margin-top: @select-multiple-item-spacing-half;\n margin-bottom: @select-multiple-item-spacing-half;\n line-height: @select-multiple-item-height - @select-multiple-item-border-width * 2;\n background: @select-selection-item-bg;\n border: 1px solid @select-selection-item-border-color;\n border-radius: @border-radius-base;\n cursor: default;\n transition: font-size 0.3s, line-height 0.3s, height 0.3s;\n user-select: none;\n margin-inline-end: @input-padding-vertical-base;\n padding-inline-start: @padding-xs;\n padding-inline-end: (@padding-xs / 2);\n\n .@{select-prefix-cls}-disabled& {\n color: @select-multiple-item-disabled-color;\n border-color: @select-multiple-item-disabled-border-color;\n cursor: not-allowed;\n }\n\n // It's ok not to do this, but 24px makes bottom narrow in view should adjust\n &-content {\n display: inline-block;\n margin-right: (@padding-xs / 2);\n overflow: hidden;\n white-space: pre; // fix whitespace wrapping. custom tags display all whitespace within.\n text-overflow: ellipsis;\n }\n\n &-remove {\n .iconfont-mixin();\n display: inline-block;\n color: @text-color-secondary;\n font-weight: bold;\n font-size: 10px;\n line-height: inherit;\n cursor: pointer;\n\n > .@{iconfont-css-prefix} {\n vertical-align: middle;\n }\n\n &:hover {\n color: @icon-color-hover;\n }\n }\n }\n\n // ========================== Input ==========================\n .@{select-overflow-prefix-cls}-item + .@{select-overflow-prefix-cls}-item {\n .@{select-prefix-cls}-selection-search {\n margin-inline-start: 0;\n }\n }\n\n .@{select-prefix-cls}-selection-search {\n position: relative;\n max-width: 100%;\n margin-inline-start: @input-padding-horizontal-base - @input-padding-vertical-base;\n\n &-input,\n &-mirror {\n height: @select-multiple-item-height;\n font-family: @font-family;\n line-height: @select-multiple-item-height;\n transition: all 0.3s;\n }\n\n &-input {\n width: 100%;\n min-width: 4.1px; // fix search cursor missing\n }\n\n &-mirror {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 999;\n white-space: pre; // fix whitespace wrapping caused width calculation bug\n visibility: hidden;\n }\n }\n\n // ======================= Placeholder =======================\n .@{select-prefix-cls}-selection-placeholder {\n position: absolute;\n top: 50%;\n right: @input-padding-horizontal;\n left: @input-padding-horizontal;\n transform: translateY(-50%);\n transition: all 0.3s;\n }\n\n // ============================================================\n // == Size ==\n // ============================================================\n .select-size(@suffix, @input-height) {\n @merged-cls: ~'@{select-prefix-cls}-@{suffix}';\n &.@{merged-cls} {\n @select-selection-height: @input-height - @input-padding-vertical-base * 2;\n @select-height-without-border: @input-height - @border-width-base * 2;\n\n .@{select-prefix-cls}-selector::after {\n line-height: @select-selection-height;\n }\n\n .@{select-prefix-cls}-selection-item {\n height: @select-selection-height;\n line-height: @select-selection-height - @border-width-base * 2;\n }\n\n .@{select-prefix-cls}-selection-search {\n height: @select-selection-height;\n line-height: @select-selection-height;\n\n &-input,\n &-mirror {\n height: @select-selection-height;\n line-height: @select-selection-height - @border-width-base * 2;\n }\n }\n }\n }\n\n .select-size('lg', @input-height-lg);\n .select-size('sm', @input-height-sm);\n\n // Size small need additional set padding\n &.@{select-prefix-cls}-sm {\n .@{select-prefix-cls}-selection-placeholder {\n left: @input-padding-horizontal-sm;\n }\n // https://github.com/ant-design/ant-design/issues/29559\n .@{select-prefix-cls}-selection-search {\n margin-inline-start: 3px;\n }\n }\n &.@{select-prefix-cls}-lg {\n .@{select-prefix-cls}-selection-item {\n height: @select-multiple-item-height-lg;\n line-height: @select-multiple-item-height-lg;\n }\n }\n }\n\n &-disabled .@{select-prefix-cls}-selection-item-remove {\n display: none;\n }\n}\n","@import '../../input/style/mixin';\n\n@select-prefix-cls: ~'@{ant-prefix}-select';\n\n.select-status-color(\n @text-color;\n @border-color;\n @background-color;\n @hoverBorderColor;\n @outlineColor;\n) {\n &.@{select-prefix-cls}:not(.@{select-prefix-cls}-disabled):not(.@{select-prefix-cls}-customize-input) {\n .@{select-prefix-cls}-selector {\n background-color: @background-color;\n border-color: @border-color !important;\n }\n &.@{select-prefix-cls}-open .@{select-prefix-cls}-selector,\n &.@{select-prefix-cls}-focused .@{select-prefix-cls}-selector {\n .active(@border-color, @hoverBorderColor, @outlineColor);\n }\n }\n}\n\n.@{select-prefix-cls} {\n &-status-error {\n .select-status-color(@error-color, @error-color, @select-background, @error-color-hover, @error-color-outline);\n }\n\n &-status-warning {\n .select-status-color(@warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n }\n\n &-status-error,\n &-status-warning,\n &-status-success,\n &-status-validating {\n &.@{select-prefix-cls}-has-feedback {\n //.@{prefix-cls}-arrow,\n .@{select-prefix-cls}-clear {\n right: 32px;\n }\n\n .@{select-prefix-cls}-selection-selected-value {\n padding-right: 42px;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@input-affix-with-clear-btn-width: 38px;\n\n// size mixins for input\n.input-lg() {\n padding: @input-padding-vertical-lg @input-padding-horizontal-lg;\n font-size: @font-size-lg;\n}\n\n.input-sm() {\n padding: @input-padding-vertical-sm @input-padding-horizontal-sm;\n}\n\n// input status\n// == when focus or active\n.active(@borderColor: @primary-color; @hoverBorderColor: @primary-color-hover; @outlineColor: @primary-color-outline) {\n & when (@theme = dark) {\n border-color: @borderColor;\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n border-color: @hoverBorderColor;\n }\n & when not (@theme = variable) {\n box-shadow: @input-outline-offset @outline-blur-size @outline-width\n fade(@borderColor, @outline-fade);\n }\n & when (@theme = variable) {\n border-color: @hoverBorderColor;\n box-shadow: @input-outline-offset @outline-blur-size @outline-width @outlineColor;\n }\n border-right-width: @border-width-base;\n outline: 0;\n}\n\n// == when hover\n.hover(@color: @input-hover-border-color) {\n border-color: @color;\n border-right-width: @border-width-base;\n}\n\n.disabled() {\n color: @input-disabled-color;\n background-color: @input-disabled-bg;\n border-color: @input-border-color;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 1;\n\n &:hover {\n .hover(@input-border-color);\n }\n}\n\n// Basic style for input\n.input() {\n position: relative;\n display: inline-block;\n width: 100%;\n min-width: 0;\n padding: @input-padding-vertical-base @input-padding-horizontal-base;\n color: @input-color;\n font-size: @font-size-base;\n line-height: @line-height-base;\n background-color: @input-bg;\n background-image: none;\n border: @border-width-base @border-style-base @input-border-color;\n border-radius: @control-border-radius;\n transition: all 0.3s;\n .placeholder(); // Reset placeholder\n\n &:hover {\n .hover();\n }\n\n &:focus,\n &-focused {\n .active();\n }\n\n &-disabled {\n .disabled();\n }\n\n &[disabled] {\n .disabled();\n }\n\n &-borderless {\n &,\n &:hover,\n &:focus,\n &-focused,\n &-disabled,\n &[disabled] {\n background-color: transparent;\n border: none;\n box-shadow: none;\n }\n }\n\n // Reset height for `textarea`s\n textarea& {\n max-width: 100%; // prevent textearea resize from coming out of its container\n height: auto;\n min-height: @input-height-base;\n line-height: @line-height-base;\n vertical-align: bottom;\n transition: all 0.3s, height 0s;\n }\n\n // Size\n &-lg {\n .input-lg();\n }\n\n &-sm {\n .input-sm();\n }\n}\n\n// label input\n.input-group(@inputClass) {\n position: relative;\n display: table;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n\n // Undo padding and float of grid classes\n &[class*='col-'] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n }\n\n > [class*='col-'] {\n padding-right: 8px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n\n &-addon,\n &-wrap,\n > .@{inputClass} {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n }\n\n &-addon,\n &-wrap {\n width: 1px; // To make addon/wrap as small as possible\n white-space: nowrap;\n vertical-align: middle;\n }\n\n &-wrap > * {\n display: block !important;\n }\n\n .@{inputClass} {\n float: left;\n width: 100%;\n margin-bottom: 0;\n text-align: inherit;\n\n &:focus {\n z-index: 1; // Fix https://gw.alipayobjects.com/zos/rmsportal/DHNpoqfMXSfrSnlZvhsJ.png\n border-right-width: 1px;\n }\n\n &:hover {\n z-index: 1;\n border-right-width: 1px;\n .@{ant-prefix}-input-search-with-button & {\n z-index: 0;\n }\n }\n }\n\n &-addon {\n position: relative;\n padding: 0 @input-padding-horizontal-base;\n color: @input-color;\n font-weight: normal;\n font-size: @font-size-base;\n text-align: center;\n background-color: @input-addon-bg;\n border: @border-width-base @border-style-base @input-border-color;\n border-radius: @control-border-radius;\n transition: all 0.3s;\n\n // Reset Select's style in addon\n .@{ant-prefix}-select {\n margin: -(@input-padding-vertical-base + 1px) (-@input-padding-horizontal-base);\n\n &.@{ant-prefix}-select-single:not(.@{ant-prefix}-select-customize-input)\n .@{ant-prefix}-select-selector {\n background-color: inherit;\n border: @border-width-base @border-style-base transparent;\n box-shadow: none;\n }\n\n &-open,\n &-focused {\n .@{ant-prefix}-select-selector {\n color: @primary-color;\n }\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/31333\n .@{ant-prefix}-cascader-picker {\n margin: -9px (-@control-padding-horizontal);\n background-color: transparent;\n .@{ant-prefix}-cascader-input {\n text-align: left;\n border: 0;\n box-shadow: none;\n }\n }\n }\n\n // Reset rounded corners\n > .@{inputClass}:first-child,\n &-addon:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n\n // Reset Select's style in addon\n .@{ant-prefix}-select .@{ant-prefix}-select-selector {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n > .@{inputClass}-affix-wrapper {\n &:not(:first-child) .@{inputClass} {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n &:not(:last-child) .@{inputClass} {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n &-addon:first-child {\n border-right: 0;\n }\n\n &-addon:last-child {\n border-left: 0;\n }\n\n > .@{inputClass}:last-child,\n &-addon:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n\n // Reset Select's style in addon\n .@{ant-prefix}-select .@{ant-prefix}-select-selector {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n\n // Sizing options\n &-lg .@{inputClass},\n &-lg > &-addon {\n .input-lg();\n }\n\n &-sm .@{inputClass},\n &-sm > &-addon {\n .input-sm();\n }\n\n // Fix https://github.com/ant-design/ant-design/issues/5754\n &-lg .@{ant-prefix}-select-single .@{ant-prefix}-select-selector {\n height: @input-height-lg;\n }\n\n &-sm .@{ant-prefix}-select-single .@{ant-prefix}-select-selector {\n height: @input-height-sm;\n }\n\n .@{inputClass}-affix-wrapper {\n &:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n .@{ant-prefix}-input-search & {\n border-top-left-radius: @control-border-radius;\n border-bottom-left-radius: @control-border-radius;\n }\n }\n\n &:not(:first-child),\n .@{ant-prefix}-input-search &:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n\n &&-compact {\n display: block;\n .clearfix();\n\n &-addon,\n &-wrap,\n > .@{inputClass} {\n &:not(:first-child):not(:last-child) {\n border-right-width: @border-width-base;\n\n &:hover {\n z-index: 1;\n }\n\n &:focus {\n z-index: 1;\n }\n }\n }\n\n & > * {\n display: inline-block;\n float: none;\n vertical-align: top; // https://github.com/ant-design/ant-design-pro/issues/139\n border-radius: 0;\n }\n\n & > .@{inputClass}-affix-wrapper {\n display: inline-flex;\n }\n\n & > .@{ant-prefix}-picker-range {\n display: inline-flex;\n }\n\n & > *:not(:last-child) {\n margin-right: -@border-width-base;\n border-right-width: @border-width-base;\n }\n\n // Undo float for .ant-input-group .ant-input\n .@{inputClass} {\n float: none;\n }\n\n // reset border for Select, DatePicker, AutoComplete, Cascader, Mention, TimePicker, Input\n & > .@{ant-prefix}-select > .@{ant-prefix}-select-selector,\n & > .@{ant-prefix}-select-auto-complete .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker .@{ant-prefix}-input,\n & > .@{ant-prefix}-input-group-wrapper .@{ant-prefix}-input {\n border-right-width: @border-width-base;\n border-radius: 0;\n\n &:hover {\n z-index: 1;\n }\n\n &:focus {\n z-index: 1;\n }\n }\n\n & > .@{ant-prefix}-select-focused {\n z-index: 1;\n }\n\n // update z-index for arrow icon\n & > .@{ant-prefix}-select > .@{ant-prefix}-select-arrow {\n z-index: 1; // https://github.com/ant-design/ant-design/issues/20371\n }\n\n & > *:first-child,\n & > .@{ant-prefix}-select:first-child > .@{ant-prefix}-select-selector,\n & > .@{ant-prefix}-select-auto-complete:first-child .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker:first-child .@{ant-prefix}-input {\n border-top-left-radius: @control-border-radius;\n border-bottom-left-radius: @control-border-radius;\n }\n\n & > *:last-child,\n & > .@{ant-prefix}-select:last-child > .@{ant-prefix}-select-selector,\n & > .@{ant-prefix}-cascader-picker:last-child .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker-focused:last-child .@{ant-prefix}-input {\n border-right-width: @border-width-base;\n border-top-right-radius: @control-border-radius;\n border-bottom-right-radius: @control-border-radius;\n }\n\n // https://github.com/ant-design/ant-design/issues/12493\n & > .@{ant-prefix}-select-auto-complete .@{ant-prefix}-input {\n vertical-align: top;\n }\n\n .@{ant-prefix}-input-group-wrapper + .@{ant-prefix}-input-group-wrapper {\n margin-left: -1px;\n .@{ant-prefix}-input-affix-wrapper {\n border-radius: 0;\n }\n }\n\n .@{ant-prefix}-input-group-wrapper:not(:last-child) {\n &.@{ant-prefix}-input-search > .@{ant-prefix}-input-group {\n & > .@{ant-prefix}-input-group-addon > .@{ant-prefix}-input-search-button {\n border-radius: 0;\n }\n\n & > .@{ant-prefix}-input {\n border-radius: @control-border-radius 0 0 @control-border-radius;\n }\n }\n }\n }\n}\n\n.status-color(\n @prefix-cls: @input-prefix-cls;\n @text-color: @input-color;\n @border-color: @input-border-color;\n @background-color: @input-bg;\n @hoverBorderColor: @primary-color-hover;\n @outlineColor: @primary-color-outline;\n) {\n &:not(.@{prefix-cls}-disabled):not(.@{prefix-cls}-borderless).@{prefix-cls} {\n &,\n &:hover {\n background: @background-color;\n border-color: @border-color;\n }\n\n &:focus,\n &-focused {\n .active(@text-color, @hoverBorderColor, @outlineColor);\n }\n }\n}\n\n.status-color-common(\n @prefix-cls: @input-prefix-cls;\n @text-color: @input-color;\n @border-color: @input-border-color;\n @background-color: @input-bg;\n @hoverBorderColor: @primary-color-hover;\n @outlineColor: @primary-color-outline;\n) {\n .@{prefix-cls}-prefix {\n color: @text-color;\n }\n}\n\n.group-status-color(\n @prefix-cls: @input-prefix-cls;\n @text-color: @input-color;\n @border-color: @input-border-color;\n) {\n .@{prefix-cls}-group-addon {\n color: @text-color;\n border-color: @border-color;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n\n@select-prefix-cls: ~'@{ant-prefix}-select';\n\n.@{select-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n // ========================== Arrow ==========================\n &-arrow {\n .@{select-prefix-cls}-rtl & {\n right: initial;\n left: @control-padding-horizontal - 1px;\n }\n }\n\n // ========================== Clear ==========================\n &-clear {\n .@{select-prefix-cls}-rtl & {\n right: initial;\n left: @control-padding-horizontal - 1px;\n }\n }\n\n // ========================== Popup ==========================\n &-dropdown {\n &-rtl {\n direction: rtl;\n }\n }\n\n // ========================= Options =========================\n &-item {\n &-option {\n &-grouped {\n .@{select-prefix-cls}-dropdown-rtl & {\n padding-right: @control-padding-horizontal * 2;\n padding-left: @control-padding-horizontal;\n }\n }\n }\n }\n}\n\n// multiple\n@select-multiple-item-border-width: 1px;\n@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2));\n@select-multiple-padding: max(\n @input-padding-vertical-base - @select-multiple-item-border-width -\n @select-multiple-item-spacing-half,\n 0\n);\n\n.@{select-prefix-cls}-multiple {\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selector,\n &.@{select-prefix-cls}-allow-clear .@{select-prefix-cls}-selector {\n .@{select-prefix-cls}-rtl& {\n padding-right: @input-padding-vertical-base;\n padding-left: @font-size-sm + @control-padding-horizontal;\n }\n }\n\n // ======================== Selections ========================\n .@{select-prefix-cls}-selection-item {\n .@{select-prefix-cls}-rtl& {\n text-align: right;\n }\n // It's ok not to do this, but 24px makes bottom narrow in view should adjust\n &-content {\n .@{select-prefix-cls}-rtl& {\n margin-right: 0;\n margin-left: (@padding-xs / 2);\n text-align: right;\n }\n }\n }\n\n // ========================== Input ==========================\n .@{select-prefix-cls}-selection-search {\n &-mirror {\n .@{select-prefix-cls}-rtl& {\n right: 0;\n left: auto;\n }\n }\n }\n\n // ======================= Placeholder =======================\n .@{select-prefix-cls}-selection-placeholder {\n .@{select-prefix-cls}-rtl& {\n right: @input-padding-horizontal;\n left: auto;\n }\n }\n\n // ============================================================\n // == Size ==\n // ============================================================\n\n // Size small need additional set padding\n &.@{select-prefix-cls}-sm {\n .@{select-prefix-cls}-selection-placeholder {\n .@{select-prefix-cls}-rtl& {\n right: @input-padding-horizontal-sm;\n }\n }\n }\n}\n\n// single\n@selection-item-padding: ceil(@font-size-base * 1.25);\n\n.@{select-prefix-cls}-single {\n // ========================= Selector =========================\n .@{select-prefix-cls}-selector {\n .@{select-prefix-cls}-selection-item,\n .@{select-prefix-cls}-selection-placeholder {\n .@{select-prefix-cls}-rtl& {\n right: 0;\n left: 9px;\n text-align: right;\n }\n }\n }\n\n // With arrow should provides `padding-right` to show the arrow\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-search {\n .@{select-prefix-cls}-rtl& {\n right: @input-padding-horizontal-base;\n left: @input-padding-horizontal-base + @font-size-base;\n }\n }\n\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-item,\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-placeholder {\n .@{select-prefix-cls}-rtl& {\n padding-right: 0;\n padding-left: @selection-item-padding;\n }\n }\n\n // ============================================================\n // == Size ==\n // ============================================================\n\n // Size small need additional set padding\n &.@{select-prefix-cls}-sm {\n &:not(.@{select-prefix-cls}-customize-input) {\n // With arrow should provides `padding-right` to show the arrow\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-search {\n .@{select-prefix-cls}-rtl& {\n right: @input-padding-horizontal-sm - 1px;\n }\n }\n\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-item,\n &.@{select-prefix-cls}-show-arrow .@{select-prefix-cls}-selection-placeholder {\n .@{select-prefix-cls}-rtl& {\n padding-right: 0;\n padding-left: @font-size-base * 1.5;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@empty-prefix-cls: ~'@{ant-prefix}-empty';\n@empty-img-prefix-cls: ~'@{ant-prefix}-empty-img';\n\n.@{empty-prefix-cls} {\n margin: 0 8px;\n font-size: @empty-font-size;\n line-height: @line-height-base;\n text-align: center;\n\n &-image {\n height: 100px;\n margin-bottom: 8px;\n\n img {\n height: 100%;\n }\n\n svg {\n height: 100%;\n margin: auto;\n }\n }\n\n &-footer {\n margin-top: 16px;\n }\n\n // antd internal empty style\n &-normal {\n margin: 32px 0;\n color: @disabled-color;\n\n .@{empty-prefix-cls}-image {\n height: 40px;\n }\n }\n\n &-small {\n margin: 8px 0;\n color: @disabled-color;\n\n .@{empty-prefix-cls}-image {\n height: 35px;\n }\n }\n}\n\n.@{empty-img-prefix-cls}-default {\n // not support the definition because the less variables have no meaning\n & when (@theme = dark) {\n &-ellipse {\n fill: @white;\n fill-opacity: 0.08;\n }\n\n &-path {\n &-1 {\n fill: #262626;\n }\n\n &-2 {\n fill: url('#linearGradient-1');\n }\n\n &-3 {\n fill: #595959;\n }\n\n &-4 {\n fill: #434343;\n }\n\n &-5 {\n fill: #595959;\n }\n }\n\n &-g {\n fill: #434343;\n }\n }\n & when not (@theme = dark) {\n &-ellipse {\n fill: #f5f5f5;\n fill-opacity: 0.8;\n }\n\n &-path {\n &-1 {\n fill: #aeb8c2;\n }\n\n &-2 {\n fill: url('#linearGradient-1');\n }\n\n &-3 {\n fill: #f5f5f7;\n }\n\n &-4 {\n fill: #dce0e6;\n }\n\n &-5 {\n fill: #dce0e6;\n }\n }\n\n &-g {\n fill: @white;\n }\n }\n}\n\n.@{empty-img-prefix-cls}-simple {\n // not support the definition because the less variables have no meaning\n & when (@theme = dark) {\n &-ellipse {\n fill: @white;\n fill-opacity: 0.08;\n }\n\n &-g {\n stroke: #434343;\n }\n\n &-path {\n fill: #262626;\n stroke: #434343;\n }\n }\n & when not (@theme = dark) {\n &-ellipse {\n fill: #f5f5f5;\n }\n\n &-g {\n stroke: #d9d9d9;\n }\n\n &-path {\n fill: #fafafa;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@empty-prefix-cls: ~'@{ant-prefix}-empty';\n\n.@{empty-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@avatar-prefix-cls: ~'@{ant-prefix}-avatar';\n\n.@{avatar-prefix-cls} {\n .reset-component();\n\n position: relative;\n display: inline-block;\n overflow: hidden;\n color: @avatar-color;\n white-space: nowrap;\n text-align: center;\n vertical-align: middle;\n background: @avatar-bg;\n\n &-image {\n background: transparent;\n }\n\n .@{ant-prefix}-image-img {\n display: block;\n }\n\n .avatar-size(@avatar-size-base, @avatar-font-size-base);\n\n &-lg {\n .avatar-size(@avatar-size-lg, @avatar-font-size-lg);\n }\n\n &-sm {\n .avatar-size(@avatar-size-sm, @avatar-font-size-sm);\n }\n\n &-square {\n border-radius: @avatar-border-radius;\n }\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n\n.avatar-size(@size, @font-size) {\n width: @size;\n height: @size;\n line-height: @size;\n border-radius: 50%;\n\n &-string {\n position: absolute;\n left: 50%;\n transform-origin: 0 center;\n }\n\n &.@{avatar-prefix-cls}-icon {\n font-size: @font-size;\n\n > .@{iconfont-css-prefix} {\n margin: 0;\n }\n }\n}\n\n@import './group';\n@import './rtl';\n\n@root-entry-name: default;",".@{avatar-prefix-cls}-group {\n display: inline-flex;\n\n .@{avatar-prefix-cls} {\n border: 1px solid @avatar-group-border-color;\n\n &:not(:first-child) {\n margin-left: @avatar-group-overlapping;\n }\n }\n\n &-popover {\n .@{ant-prefix}-avatar + .@{ant-prefix}-avatar {\n margin-left: @avatar-group-space;\n }\n }\n}\n",".@{avatar-prefix-cls}-group {\n &-rtl {\n .@{avatar-prefix-cls}:not(:first-child) {\n margin-right: @avatar-group-overlapping;\n margin-left: 0;\n }\n }\n\n &-popover.@{ant-prefix}-popover-rtl {\n .@{ant-prefix}-avatar + .@{ant-prefix}-avatar {\n margin-right: @avatar-group-space;\n margin-left: 0;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@popover-prefix-cls: ~'@{ant-prefix}-popover';\n\n@popover-arrow-rotate-width: sqrt(@popover-arrow-width * @popover-arrow-width * 2) + 6px;\n\n@popover-arrow-offset-vertical: 12px;\n@popover-arrow-offset-horizontal: 16px;\n\n.@{popover-prefix-cls} {\n .reset-component();\n\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n font-weight: normal;\n white-space: normal;\n text-align: left;\n cursor: auto;\n user-select: text;\n\n &-content {\n position: relative;\n }\n\n &::after {\n position: absolute;\n background: fade(@white, 1%);\n content: '';\n }\n\n &-hidden {\n display: none;\n }\n\n // Offset the popover to account for the popover arrow\n &-placement-top,\n &-placement-topLeft,\n &-placement-topRight {\n padding-bottom: @popover-distance;\n }\n\n &-placement-right,\n &-placement-rightTop,\n &-placement-rightBottom {\n padding-left: @popover-distance;\n }\n\n &-placement-bottom,\n &-placement-bottomLeft,\n &-placement-bottomRight {\n padding-top: @popover-distance;\n }\n\n &-placement-left,\n &-placement-leftTop,\n &-placement-leftBottom {\n padding-right: @popover-distance;\n }\n\n &-inner {\n background-color: @popover-bg;\n background-clip: padding-box;\n border-radius: @border-radius-base;\n box-shadow: @box-shadow-base;\n box-shadow: ~'0 0 8px @{shadow-color} \\9';\n }\n\n @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n /* IE10+ */\n &-inner {\n box-shadow: @box-shadow-base;\n }\n }\n\n &-title {\n min-width: @popover-min-width;\n min-height: @popover-min-height;\n margin: 0; // reset heading margin\n padding: 5px @popover-padding-horizontal 4px;\n color: @heading-color;\n font-weight: 500;\n border-bottom: 1px solid @border-color-split;\n }\n\n &-inner-content {\n padding: @padding-sm @popover-padding-horizontal;\n color: @popover-color;\n }\n\n &-message {\n position: relative;\n padding: 4px 0 12px;\n color: @popover-color;\n font-size: @font-size-base;\n > .@{iconfont-css-prefix} {\n position: absolute;\n top: (\n 4px + ((@line-height-base * @font-size-base - @font-size-base) / 2)\n ); // 4px for padding-top, 4px for vertical middle\n color: @warning-color;\n font-size: @font-size-base;\n }\n\n &-title {\n padding-left: @font-size-base + 8px;\n }\n }\n\n &-buttons {\n margin-bottom: 4px;\n text-align: right;\n\n button {\n margin-left: 8px;\n }\n }\n\n // Arrows\n &-arrow {\n position: absolute;\n display: block;\n width: @popover-arrow-rotate-width;\n height: @popover-arrow-rotate-width;\n overflow: hidden;\n background: transparent;\n pointer-events: none;\n\n &-content {\n --antd-arrow-background-color: @popover-bg;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n width: @popover-arrow-width;\n height: @popover-arrow-width;\n margin: auto;\n content: '';\n pointer-events: auto;\n .roundedArrow(@popover-arrow-width, 5px);\n }\n }\n\n &-placement-top &-arrow,\n &-placement-topLeft &-arrow,\n &-placement-topRight &-arrow {\n bottom: 0;\n transform: translateY(100%);\n\n &-content {\n box-shadow: 3px 3px 7px fade(@black, 7%);\n transform: translateY((-@popover-arrow-rotate-width / 2)) rotate(45deg);\n }\n }\n\n &-placement-top &-arrow {\n left: 50%;\n transform: translateY(100%) translateX(-50%);\n }\n\n &-placement-topLeft &-arrow {\n left: @popover-arrow-offset-horizontal;\n }\n\n &-placement-topRight &-arrow {\n right: @popover-arrow-offset-horizontal;\n }\n\n &-placement-right &-arrow,\n &-placement-rightTop &-arrow,\n &-placement-rightBottom &-arrow {\n left: 0;\n transform: translateX(-100%);\n\n &-content {\n box-shadow: 3px 3px 7px fade(@black, 7%);\n transform: translateX((@popover-arrow-rotate-width / 2)) rotate(135deg);\n }\n }\n\n &-placement-right &-arrow {\n top: 50%;\n transform: translateX(-100%) translateY(-50%);\n }\n\n &-placement-rightTop &-arrow {\n top: @popover-arrow-offset-vertical;\n }\n\n &-placement-rightBottom &-arrow {\n bottom: @popover-arrow-offset-vertical;\n }\n\n &-placement-bottom &-arrow,\n &-placement-bottomLeft &-arrow,\n &-placement-bottomRight &-arrow {\n top: 0;\n transform: translateY(-100%);\n\n &-content {\n box-shadow: 2px 2px 5px fade(@black, 6%);\n transform: translateY((@popover-arrow-rotate-width / 2)) rotate(-135deg);\n }\n }\n\n &-placement-bottom &-arrow {\n left: 50%;\n transform: translateY(-100%) translateX(-50%);\n }\n\n &-placement-bottomLeft &-arrow {\n left: @popover-arrow-offset-horizontal;\n }\n\n &-placement-bottomRight &-arrow {\n right: @popover-arrow-offset-horizontal;\n }\n\n &-placement-left &-arrow,\n &-placement-leftTop &-arrow,\n &-placement-leftBottom &-arrow {\n right: 0;\n transform: translateX(100%);\n\n &-content {\n box-shadow: 3px 3px 7px fade(@black, 7%);\n transform: translateX((-@popover-arrow-rotate-width / 2)) rotate(-45deg);\n }\n }\n\n &-placement-left &-arrow {\n top: 50%;\n transform: translateX(100%) translateY(-50%);\n }\n\n &-placement-leftTop &-arrow {\n top: @popover-arrow-offset-vertical;\n }\n\n &-placement-leftBottom &-arrow {\n bottom: @popover-arrow-offset-vertical;\n }\n}\n\n.generator-popover-preset-color(@i: length(@preset-colors)) when (@i > 0) {\n .generator-popover-preset-color(@i - 1);\n @color: extract(@preset-colors, @i);\n @lightColor: '@{color}-6';\n .@{popover-prefix-cls}-@{color} {\n .@{popover-prefix-cls}-inner {\n background-color: @@lightColor;\n }\n .@{popover-prefix-cls}-arrow {\n &-content {\n background-color: @@lightColor;\n }\n }\n }\n}\n.generator-popover-preset-color();\n\n@import './rtl';\n\n@root-entry-name: default;",".roundedArrow(@width, @outer-radius, @bg-color: var(--antd-arrow-background-color)) {\n @corner-height: unit(((@outer-radius) * (1 - 1 / sqrt(2))));\n\n @width-without-unit: unit(@width);\n @outer-radius-without-unit: unit(@outer-radius);\n @inner-radius-without-unit: unit(@arrow-border-radius);\n\n @a-x: @width-without-unit - @corner-height;\n @a-y: 2 * @width-without-unit + @corner-height;\n @b-x: @a-x + @outer-radius-without-unit * (1 / sqrt(2));\n @b-y: 2 * @width-without-unit;\n @c-x: 2 * @width-without-unit - @inner-radius-without-unit;\n @c-y: 2 * @width-without-unit;\n @d-x: 2 * @width-without-unit;\n @d-y: 2 * @width-without-unit - @inner-radius-without-unit;\n @e-x: 2 * @width-without-unit;\n @e-y: @f-y + @outer-radius-without-unit * (1 / sqrt(2));\n @f-x: 2 * @width-without-unit + @corner-height;\n @f-y: @width-without-unit - @corner-height;\n @g-x: @f-x - 1;\n @g-y: @f-y;\n @h-x: @a-x;\n @h-y: @a-y - 1;\n\n border-radius: 0 0 @arrow-border-radius;\n pointer-events: none;\n\n &::before {\n position: absolute;\n top: -@width;\n left: -@width;\n width: @width * 3;\n height: @width * 3;\n background: @bg-color;\n // Hack firefox: https://github.com/ant-design/ant-design/pull/33710#issuecomment-1015287825\n background-repeat: no-repeat;\n background-position: ceil(-@width + 1px) ceil(-@width + 1px);\n content: '';\n clip-path: inset(33% 33%); // For browsers that do not support path()\n clip-path: path(\n 'M @{a-x} @{a-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{b-x} @{b-y} L @{c-x} @{c-y} A @{inner-radius-without-unit} @{inner-radius-without-unit} 0 0 0 @{d-x} @{d-y} L @{e-x} @{e-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{f-x} @{f-y} L @{g-x} @{g-y} L @{h-x} @{h-y} Z'\n );\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@popover-prefix-cls: ~'@{ant-prefix}-popover';\n\n.@{popover-prefix-cls} {\n &-rtl {\n direction: rtl;\n text-align: right;\n }\n\n &-message {\n &-title {\n .@{popover-prefix-cls}-rtl & {\n padding-right: @font-size-base + 8px;\n padding-left: @padding-md;\n }\n }\n }\n\n &-buttons {\n .@{popover-prefix-cls}-rtl & {\n text-align: left;\n }\n\n button {\n .@{popover-prefix-cls}-rtl & {\n margin-right: 8px;\n margin-left: 0;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@backtop-prefix-cls: ~'@{ant-prefix}-back-top';\n\n.@{backtop-prefix-cls} {\n .reset-component();\n\n position: fixed;\n right: 100px;\n bottom: 50px;\n z-index: @zindex-back-top;\n width: 40px;\n height: 40px;\n cursor: pointer;\n\n &:empty {\n display: none;\n }\n\n &-rtl {\n right: auto;\n left: 100px;\n direction: rtl;\n }\n\n &-content {\n width: 40px;\n height: 40px;\n overflow: hidden;\n color: @back-top-color;\n text-align: center;\n background-color: @back-top-bg;\n border-radius: 20px;\n transition: all 0.3s;\n\n &:hover {\n background-color: @back-top-hover-bg;\n transition: all 0.3s;\n }\n }\n\n &-icon {\n font-size: 24px;\n line-height: 40px;\n }\n}\n\n@import './responsive';\n\n@root-entry-name: default;","@media screen and (max-width: @screen-md) {\n .@{backtop-prefix-cls} {\n right: 60px;\n\n &-rtl {\n right: auto;\n left: 60px;\n }\n }\n}\n\n@media screen and (max-width: @screen-xs) {\n .@{backtop-prefix-cls} {\n right: 20px;\n\n &-rtl {\n right: auto;\n left: 20px;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@badge-prefix-cls: ~'@{ant-prefix}-badge';\n@number-prefix-cls: ~'@{ant-prefix}-scroll-number';\n\n.@{badge-prefix-cls} {\n .reset-component();\n\n position: relative;\n display: inline-block;\n line-height: 1;\n\n &-count {\n z-index: @zindex-badge;\n min-width: @badge-height;\n height: @badge-height;\n padding: 0 6px;\n color: @badge-text-color;\n font-weight: @badge-font-weight;\n font-size: @badge-font-size;\n line-height: @badge-height;\n white-space: nowrap;\n text-align: center;\n background: @badge-color;\n border-radius: (@badge-height / 2);\n box-shadow: 0 0 0 1px @shadow-color-inverse;\n\n a,\n a:hover {\n color: @badge-text-color;\n }\n }\n\n &-count-sm {\n min-width: @badge-height-sm;\n height: @badge-height-sm;\n padding: 0;\n font-size: @badge-font-size-sm;\n line-height: @badge-height-sm;\n border-radius: (@badge-height-sm / 2);\n }\n\n &-multiple-words {\n padding: 0 8px;\n }\n\n &-dot {\n z-index: @zindex-badge;\n width: @badge-dot-size;\n min-width: @badge-dot-size;\n height: @badge-dot-size;\n background: @highlight-color;\n border-radius: 100%;\n box-shadow: 0 0 0 1px @shadow-color-inverse;\n }\n\n // Tricky way to resolve https://github.com/ant-design/ant-design/issues/30088\n &-dot.@{number-prefix-cls} {\n transition: background 1.5s;\n }\n\n &-count,\n &-dot,\n .@{number-prefix-cls}-custom-component {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n transform-origin: 100% 0%;\n\n &.@{iconfont-css-prefix}-spin {\n animation: antBadgeLoadingCircle 1s infinite linear;\n }\n }\n\n &-status {\n line-height: inherit;\n vertical-align: baseline;\n\n &-dot {\n position: relative;\n top: -1px;\n display: inline-block;\n width: @badge-status-size;\n height: @badge-status-size;\n vertical-align: middle;\n border-radius: 50%;\n }\n\n &-success {\n background-color: @success-color;\n }\n\n &-processing {\n position: relative;\n background-color: @processing-color;\n\n &::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid @processing-color;\n border-radius: 50%;\n animation: antStatusProcessing 1.2s infinite ease-in-out;\n content: '';\n }\n }\n\n &-default {\n background-color: @normal-color;\n }\n\n &-error {\n background-color: @error-color;\n }\n\n &-warning {\n background-color: @warning-color;\n }\n\n // mixin to iterate over colors and create CSS class for each one\n .make-color-classes(@i: length(@preset-colors)) when (@i > 0) {\n .make-color-classes(@i - 1);\n @color: extract(@preset-colors, @i);\n @darkColor: '@{color}-6';\n &-@{color} {\n background: @@darkColor;\n }\n }\n .make-color-classes();\n\n &-text {\n margin-left: 8px;\n color: @text-color;\n font-size: @font-size-base;\n }\n }\n\n &-zoom-appear,\n &-zoom-enter {\n animation: antZoomBadgeIn @animation-duration-slow @ease-out-back;\n animation-fill-mode: both;\n }\n\n &-zoom-leave {\n animation: antZoomBadgeOut @animation-duration-slow @ease-in-back;\n animation-fill-mode: both;\n }\n\n &-not-a-wrapper {\n .@{badge-prefix-cls}-zoom-appear,\n .@{badge-prefix-cls}-zoom-enter {\n animation: antNoWrapperZoomBadgeIn @animation-duration-slow @ease-out-back;\n }\n\n .@{badge-prefix-cls}-zoom-leave {\n animation: antNoWrapperZoomBadgeOut @animation-duration-slow @ease-in-back;\n }\n\n &:not(.@{badge-prefix-cls}-status) {\n vertical-align: middle;\n }\n\n .@{number-prefix-cls}-custom-component,\n .@{badge-prefix-cls}-count {\n transform: none;\n }\n\n .@{number-prefix-cls}-custom-component,\n .@{number-prefix-cls} {\n position: relative;\n top: auto;\n display: block;\n transform-origin: 50% 50%;\n }\n }\n}\n\n@keyframes antStatusProcessing {\n 0% {\n transform: scale(0.8);\n opacity: 0.5;\n }\n\n 100% {\n transform: scale(2.4);\n opacity: 0;\n }\n}\n\n// Safari will blink with transform when inner element has absolute style.\n.safari-fix-motion() {\n /* stylelint-disable property-no-vendor-prefix */\n -webkit-transform-style: preserve-3d;\n -webkit-backface-visibility: hidden;\n /* stylelint-enable property-no-vendor-prefix */\n}\n\n.@{number-prefix-cls} {\n overflow: hidden;\n direction: ltr;\n\n &-only {\n position: relative;\n display: inline-block;\n height: @badge-height;\n transition: all @animation-duration-slow @ease-in-out;\n .safari-fix-motion;\n\n > p.@{number-prefix-cls}-only-unit {\n height: @badge-height;\n margin: 0;\n .safari-fix-motion;\n }\n }\n\n &-symbol {\n vertical-align: top;\n }\n}\n\n@keyframes antZoomBadgeIn {\n 0% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1) translate(50%, -50%);\n }\n}\n\n@keyframes antZoomBadgeOut {\n 0% {\n transform: scale(1) translate(50%, -50%);\n }\n\n 100% {\n transform: scale(0) translate(50%, -50%);\n opacity: 0;\n }\n}\n\n@keyframes antNoWrapperZoomBadgeIn {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes antNoWrapperZoomBadgeOut {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n transform: scale(0);\n opacity: 0;\n }\n}\n\n@keyframes antBadgeLoadingCircle {\n 0% {\n transform-origin: 50%;\n }\n\n 100% {\n transform: translate(50%, -50%) rotate(360deg);\n transform-origin: 50%;\n }\n}\n\n@import './ribbon';\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@ribbon-prefix-cls: ~'@{ant-prefix}-ribbon';\n@ribbon-wrapper-prefix-cls: ~'@{ant-prefix}-ribbon-wrapper';\n\n.@{ribbon-wrapper-prefix-cls} {\n position: relative;\n}\n\n.@{ribbon-prefix-cls} {\n .reset-component();\n\n position: absolute;\n top: 8px;\n height: 22px;\n padding: 0 8px;\n color: @badge-text-color;\n line-height: 22px;\n white-space: nowrap;\n background-color: @primary-color;\n border-radius: @border-radius-sm;\n\n &-text {\n color: @white;\n }\n\n &-corner {\n position: absolute;\n top: 100%;\n width: 8px;\n height: 8px;\n color: currentcolor;\n border: 4px solid;\n transform: scaleY(0.75);\n transform-origin: top;\n // If not support IE 11, use filter: brightness(75%) instead\n &::after {\n position: absolute;\n top: -4px;\n left: -4px;\n width: inherit;\n height: inherit;\n color: rgba(0, 0, 0, 0.25);\n border: inherit;\n content: '';\n }\n }\n\n // colors\n // mixin to iterate over colors and create CSS class for each one\n .make-color-classes(@i: length(@preset-colors)) when (@i > 0) {\n .make-color-classes(@i - 1);\n @color: extract(@preset-colors, @i);\n @darkColor: '@{color}-6';\n &-color-@{color} {\n color: @@darkColor;\n background: @@darkColor;\n }\n }\n .make-color-classes();\n\n // placement\n &.@{ribbon-prefix-cls}-placement-end {\n right: -8px;\n border-bottom-right-radius: 0;\n .@{ribbon-prefix-cls}-corner {\n right: 0;\n border-color: currentcolor transparent transparent currentcolor;\n }\n }\n\n &.@{ribbon-prefix-cls}-placement-start {\n left: -8px;\n border-bottom-left-radius: 0;\n .@{ribbon-prefix-cls}-corner {\n left: 0;\n border-color: currentcolor currentcolor transparent transparent;\n }\n }\n}\n",".@{badge-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &:not(&-not-a-wrapper) &-count,\n &:not(&-not-a-wrapper) &-dot,\n &:not(&-not-a-wrapper) .@{number-prefix-cls}-custom-component {\n .@{badge-prefix-cls}-rtl& {\n right: auto;\n left: 0;\n direction: ltr;\n transform: translate(-50%, -50%);\n transform-origin: 0% 0%;\n }\n }\n\n &-rtl&:not(&-not-a-wrapper) .@{number-prefix-cls}-custom-component {\n right: auto;\n left: 0;\n transform: translate(-50%, -50%);\n transform-origin: 0% 0%;\n }\n\n &-status {\n &-text {\n .@{badge-prefix-cls}-rtl & {\n margin-right: 8px;\n margin-left: 0;\n }\n }\n }\n\n &:not(&-not-a-wrapper).@{badge-prefix-cls}-rtl {\n .@{badge-prefix-cls}-zoom-appear,\n .@{badge-prefix-cls}-zoom-enter {\n animation-name: antZoomBadgeInRtl;\n }\n\n .@{badge-prefix-cls}-zoom-leave {\n animation-name: antZoomBadgeOutRtl;\n }\n }\n}\n\n.@{ribbon-prefix-cls}-rtl {\n direction: rtl;\n &.@{ribbon-prefix-cls}-placement-end {\n right: unset;\n left: -8px;\n border-bottom-right-radius: @border-radius-sm;\n border-bottom-left-radius: 0;\n .@{ribbon-prefix-cls}-corner {\n right: unset;\n left: 0;\n border-color: currentcolor currentcolor transparent transparent;\n\n &::after {\n border-color: currentcolor currentcolor transparent transparent;\n }\n }\n }\n &.@{ribbon-prefix-cls}-placement-start {\n right: -8px;\n left: unset;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: @border-radius-sm;\n .@{ribbon-prefix-cls}-corner {\n right: 0;\n left: unset;\n border-color: currentcolor transparent transparent currentcolor;\n\n &::after {\n border-color: currentcolor transparent transparent currentcolor;\n }\n }\n }\n}\n\n@keyframes antZoomBadgeInRtl {\n 0% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1) translate(-50%, -50%);\n }\n}\n\n@keyframes antZoomBadgeOutRtl {\n 0% {\n transform: scale(1) translate(-50%, -50%);\n }\n\n 100% {\n transform: scale(0) translate(-50%, -50%);\n opacity: 0;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@breadcrumb-prefix-cls: ~'@{ant-prefix}-breadcrumb';\n\n.@{breadcrumb-prefix-cls} {\n .reset-component();\n\n color: @breadcrumb-base-color;\n font-size: @breadcrumb-font-size;\n\n .@{iconfont-css-prefix} {\n font-size: @breadcrumb-icon-font-size;\n }\n\n ol {\n display: flex;\n flex-wrap: wrap;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n a {\n color: @breadcrumb-link-color;\n transition: color 0.3s;\n\n &:hover {\n color: @breadcrumb-link-color-hover;\n }\n }\n\n li:last-child {\n color: @breadcrumb-last-item-color;\n\n a {\n color: @breadcrumb-last-item-color;\n }\n }\n\n li:last-child > &-separator {\n display: none;\n }\n\n &-separator {\n margin: @breadcrumb-separator-margin;\n color: @breadcrumb-separator-color;\n }\n\n &-link {\n > .@{iconfont-css-prefix} + span,\n > .@{iconfont-css-prefix} + a {\n margin-left: 4px;\n }\n }\n\n &-overlay-link {\n > .@{iconfont-css-prefix} {\n margin-left: 4px;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{breadcrumb-prefix-cls} {\n &-rtl {\n .clearfix();\n direction: rtl;\n\n > span {\n float: right;\n }\n }\n\n &-link {\n > .@{iconfont-css-prefix} + span,\n > .@{iconfont-css-prefix} + a {\n .@{breadcrumb-prefix-cls}-rtl & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n }\n\n &-overlay-link {\n > .@{iconfont-css-prefix} {\n .@{breadcrumb-prefix-cls}-rtl & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@dropdown-prefix-cls: ~'@{ant-prefix}-dropdown';\n\n.@{dropdown-prefix-cls}-menu-item {\n &&-danger {\n color: @error-color;\n\n &:hover {\n color: @text-color-inverse;\n background-color: @error-color;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './status';\n\n@dropdown-prefix-cls: ~'@{ant-prefix}-dropdown';\n\n.@{dropdown-prefix-cls} {\n .reset-component();\n\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: @zindex-dropdown;\n display: block;\n\n &::before {\n position: absolute;\n top: -@popover-distance + @popover-arrow-width;\n right: 0;\n bottom: -@popover-distance + @popover-arrow-width;\n left: -7px;\n z-index: -9999;\n opacity: 0.0001;\n content: ' ';\n }\n\n &-wrap {\n position: relative;\n\n .@{ant-prefix}-btn > .@{iconfont-css-prefix}-down {\n font-size: 10px;\n }\n\n .@{iconfont-css-prefix}-down::before {\n transition: transform @animation-duration-base;\n }\n }\n\n &-wrap-open {\n .@{iconfont-css-prefix}-down::before {\n transform: rotate(180deg);\n }\n }\n\n &-hidden,\n &-menu-hidden,\n &-menu-submenu-hidden {\n display: none;\n }\n\n // Offset the popover to account for the dropdown arrow\n &-show-arrow&-placement-topLeft,\n &-show-arrow&-placement-top,\n &-show-arrow&-placement-topRight {\n padding-bottom: @popover-distance;\n }\n\n &-show-arrow&-placement-bottomLeft,\n &-show-arrow&-placement-bottom,\n &-show-arrow&-placement-bottomRight {\n padding-top: @popover-distance;\n }\n\n // Arrows\n // .popover-arrow is outer, .popover-arrow:after is inner\n\n &-arrow {\n position: absolute;\n z-index: 1; // lift it up so the menu wouldn't cask shadow on it\n display: block;\n width: @popover-arrow-width;\n height: @popover-arrow-width;\n .roundedArrow(@popover-arrow-width, 5px, @popover-bg);\n }\n\n &-placement-top > &-arrow,\n &-placement-topLeft > &-arrow,\n &-placement-topRight > &-arrow {\n bottom: @popover-arrow-width * sqrt((1 / 2)) + 2px;\n box-shadow: 3px 3px 7px -3px fade(@black, 10%);\n transform: rotate(45deg);\n }\n\n &-placement-top > &-arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n &-placement-topLeft > &-arrow {\n left: 16px;\n }\n\n &-placement-topRight > &-arrow {\n right: 16px;\n }\n\n &-placement-bottom > &-arrow,\n &-placement-bottomLeft > &-arrow,\n &-placement-bottomRight > &-arrow {\n top: (@popover-arrow-width + 2px) * sqrt((1 / 2));\n box-shadow: 2px 2px 5px -2px fade(@black, 10%);\n transform: rotate(-135deg) translateY(-0.5px);\n }\n\n &-placement-bottom > &-arrow {\n left: 50%;\n transform: translateX(-50%) rotate(-135deg) translateY(-0.5px);\n }\n\n &-placement-bottomLeft > &-arrow {\n left: 16px;\n }\n\n &-placement-bottomRight > &-arrow {\n right: 16px;\n }\n\n &-menu {\n position: relative;\n margin: 0;\n padding: @dropdown-edge-child-vertical-padding 0;\n text-align: left;\n list-style-type: none;\n background-color: @dropdown-menu-bg;\n background-clip: padding-box;\n border-radius: @border-radius-base;\n outline: none;\n box-shadow: @box-shadow-base;\n\n &-item-group-title {\n padding: 5px @control-padding-horizontal;\n color: @text-color-secondary;\n transition: all @animation-duration-slow;\n }\n\n &-submenu-popup {\n position: absolute;\n z-index: @zindex-dropdown;\n background: transparent;\n box-shadow: none;\n transform-origin: 0 0;\n\n ul,\n li {\n list-style: none;\n }\n\n ul {\n margin-right: 0.3em;\n margin-left: 0.3em;\n }\n }\n\n // ======================= Item Content =======================\n &-item {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n &-item-icon {\n min-width: 12px;\n margin-right: 8px;\n font-size: @font-size-sm;\n }\n\n &-title-content {\n flex: auto;\n\n > a {\n color: inherit;\n transition: all @animation-duration-slow;\n\n &:hover {\n color: inherit;\n }\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n content: '';\n }\n }\n }\n\n // =========================== Item ===========================\n &-item,\n &-submenu-title {\n clear: both;\n margin: 0;\n padding: @dropdown-vertical-padding @control-padding-horizontal;\n color: @text-color;\n font-weight: normal;\n font-size: @dropdown-font-size;\n line-height: @dropdown-line-height;\n cursor: pointer;\n transition: all @animation-duration-slow;\n\n &:first-child {\n & when (@dropdown-edge-child-vertical-padding = 0) {\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n }\n\n &:last-child {\n & when (@dropdown-edge-child-vertical-padding = 0) {\n border-radius: 0 0 @border-radius-base @border-radius-base;\n }\n }\n\n &-selected {\n color: @dropdown-selected-color;\n background-color: @dropdown-selected-bg;\n }\n\n &:hover,\n &&-active {\n background-color: @item-hover-bg;\n }\n\n &-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n\n &:hover {\n color: @disabled-color;\n background-color: @dropdown-menu-submenu-disabled-bg;\n cursor: not-allowed;\n }\n\n a {\n pointer-events: none;\n }\n }\n\n &-divider {\n height: 1px;\n margin: 4px 0;\n overflow: hidden;\n line-height: 0;\n background-color: @border-color-split;\n }\n\n .@{dropdown-prefix-cls}-menu-submenu-expand-icon {\n position: absolute;\n right: @padding-xs;\n\n .@{dropdown-prefix-cls}-menu-submenu-arrow-icon {\n margin-right: 0 !important;\n color: @text-color-secondary;\n font-size: 10px;\n font-style: normal;\n }\n }\n }\n\n &-item-group-list {\n margin: 0 8px;\n padding: 0;\n list-style: none;\n }\n\n &-submenu-title {\n padding-right: @control-padding-horizontal + @font-size-sm;\n }\n\n &-submenu-vertical {\n position: relative;\n }\n\n &-submenu-vertical > & {\n position: absolute;\n top: 0;\n left: 100%;\n min-width: 100%;\n margin-left: 4px;\n transform-origin: 0 0;\n }\n\n &-submenu&-submenu-disabled .@{dropdown-prefix-cls}-menu-submenu-title {\n &,\n .@{dropdown-prefix-cls}-menu-submenu-arrow-icon {\n color: @disabled-color;\n background-color: @dropdown-menu-submenu-disabled-bg;\n cursor: not-allowed;\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/19264\n &-submenu-selected &-submenu-title {\n color: @primary-color;\n }\n }\n\n &.@{ant-prefix}-slide-down-enter.@{ant-prefix}-slide-down-enter-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-down-appear.@{ant-prefix}-slide-down-appear-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-down-enter.@{ant-prefix}-slide-down-enter-active&-placement-bottom,\n &.@{ant-prefix}-slide-down-appear.@{ant-prefix}-slide-down-appear-active&-placement-bottom,\n &.@{ant-prefix}-slide-down-enter.@{ant-prefix}-slide-down-enter-active&-placement-bottomRight,\n &.@{ant-prefix}-slide-down-appear.@{ant-prefix}-slide-down-appear-active&-placement-bottomRight {\n animation-name: antSlideUpIn;\n }\n\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-top,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-top,\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topRight,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topRight {\n animation-name: antSlideDownIn;\n }\n\n &.@{ant-prefix}-slide-down-leave.@{ant-prefix}-slide-down-leave-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-down-leave.@{ant-prefix}-slide-down-leave-active&-placement-bottom,\n &.@{ant-prefix}-slide-down-leave.@{ant-prefix}-slide-down-leave-active&-placement-bottomRight {\n animation-name: antSlideUpOut;\n }\n\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-top,\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topRight {\n animation-name: antSlideDownOut;\n }\n}\n\n.@{dropdown-prefix-cls}-trigger,\n.@{dropdown-prefix-cls}-link,\n.@{dropdown-prefix-cls}-button {\n > .@{iconfont-css-prefix}.@{iconfont-css-prefix}-down {\n font-size: 10px;\n vertical-align: baseline;\n }\n}\n\n.@{dropdown-prefix-cls}-button {\n white-space: nowrap;\n\n &.@{ant-prefix}-btn-group > .@{ant-prefix}-btn {\n &-loading,\n &-loading + .@{ant-prefix}-btn {\n cursor: default;\n pointer-events: none;\n }\n\n &-loading + .@{ant-prefix}-btn::before {\n display: block;\n }\n\n &:last-child:not(:first-child):not(.@{ant-prefix}-btn-icon-only) {\n padding-right: @padding-xs;\n padding-left: @padding-xs;\n }\n }\n}\n\n// https://github.com/ant-design/ant-design/issues/4903\n.@{dropdown-prefix-cls}-menu-dark {\n &,\n .@{dropdown-prefix-cls}-menu {\n background: @menu-dark-bg;\n }\n .@{dropdown-prefix-cls}-menu-item,\n .@{dropdown-prefix-cls}-menu-submenu-title,\n .@{dropdown-prefix-cls}-menu-item > a,\n .@{dropdown-prefix-cls}-menu-item > .@{iconfont-css-prefix} + span > a {\n color: @text-color-secondary-dark;\n .@{dropdown-prefix-cls}-menu-submenu-arrow::after {\n color: @text-color-secondary-dark;\n }\n\n &:hover {\n color: @text-color-inverse;\n background: transparent;\n }\n }\n .@{dropdown-prefix-cls}-menu-item-selected {\n &,\n &:hover,\n > a {\n color: @text-color-inverse;\n background: @primary-color;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@dropdown-prefix-cls: ~'@{ant-prefix}-dropdown';\n\n.@{dropdown-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &::before {\n .@{dropdown-prefix-cls}-rtl& {\n right: -7px;\n left: 0;\n }\n }\n\n &-menu {\n &&-rtl {\n direction: rtl;\n text-align: right;\n }\n\n &-item-group-title {\n .@{dropdown-prefix-cls}-rtl &,\n .@{dropdown-prefix-cls}-menu-submenu-rtl & {\n direction: rtl;\n text-align: right;\n }\n }\n\n &-submenu-popup {\n &.@{dropdown-prefix-cls}-menu-submenu-rtl {\n transform-origin: 100% 0;\n }\n\n ul,\n li {\n .@{dropdown-prefix-cls}-rtl & {\n text-align: right;\n }\n }\n }\n\n &-item,\n &-submenu-title {\n .@{dropdown-prefix-cls}-rtl & {\n text-align: right;\n }\n\n > .@{iconfont-css-prefix}:first-child,\n > span > .@{iconfont-css-prefix}:first-child {\n .@{dropdown-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 8px;\n }\n }\n\n .@{dropdown-prefix-cls}-menu-submenu-expand-icon {\n .@{dropdown-prefix-cls}-rtl & {\n right: auto;\n left: @padding-xs;\n }\n\n .@{dropdown-prefix-cls}-menu-submenu-arrow-icon {\n .@{dropdown-prefix-cls}-rtl & {\n margin-left: 0 !important;\n transform: scaleX(-1);\n }\n }\n }\n }\n\n &-submenu-title {\n .@{dropdown-prefix-cls}-rtl & {\n padding-right: @control-padding-horizontal;\n padding-left: @control-padding-horizontal + @font-size-sm;\n }\n }\n\n &-submenu-vertical > & {\n .@{dropdown-prefix-cls}-rtl & {\n right: 100%;\n left: 0;\n margin-right: 4px;\n margin-left: 0;\n }\n }\n }\n}\n","// mixins for button\n// ------------------------\n.button-size(@height; @padding-horizontal; @font-size; @border-radius) {\n @padding-vertical: max(\n (round(((@height - @font-size * @line-height-base) / 2) * 10) / 10) - @border-width-base,\n 0\n );\n height: @height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n border-radius: @border-radius;\n}\n\n.button-color(@color; @background; @border) {\n color: @color;\n border-color: @border; // a inside Button which only work in Chrome\n & when not(@background = null) {\n background: @background;\n }\n // http://stackoverflow.com/a/17253457\n > a:only-child {\n color: currentcolor;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n content: '';\n }\n }\n}\n\n.button-disabled(@color: @btn-disable-color; @background: @btn-disable-bg; @border: @btn-disable-border) {\n &[disabled] {\n &,\n &:hover,\n &:focus,\n &:active {\n .button-color(@color; @background; @border);\n\n text-shadow: none;\n box-shadow: none;\n }\n }\n}\n\n.button-variant-primary(@color; @background; @backgroundHover: yellow; @backgroundActive: yellow) {\n .button-color(@color; @background; @background);\n\n text-shadow: @btn-text-shadow;\n box-shadow: @btn-primary-shadow;\n\n &:hover,\n &:focus {\n & when (@theme = dark) {\n .button-color(\n @color; ~`colorPalette('@{background}', 7) `; ~`colorPalette('@{background}', 7) `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n @color; ~`colorPalette('@{background}', 5) `; ~`colorPalette('@{background}', 5) `\n );\n }\n & when (@theme = variable) {\n .button-color(@color; @backgroundHover; @backgroundHover);\n }\n }\n\n &:active {\n & when (@theme = dark) {\n .button-color(\n @color; ~`colorPalette('@{background}', 5) `; ~`colorPalette('@{background}', 5) `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n @color; ~`colorPalette('@{background}', 7) `; ~`colorPalette('@{background}', 7) `\n );\n }\n & when (@theme = variable) {\n .button-color(@color; @backgroundActive; @backgroundActive);\n }\n }\n\n .button-disabled();\n}\n\n.button-variant-other(@color; @background; @border) {\n .button-color(@color; @background; @border);\n\n &:hover,\n &:focus {\n & when (@theme = dark) {\n .button-color(@primary-5; @background; @primary-5);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{btn-primary-bg}', 5) `; @background;\n ~`colorPalette('@{btn-primary-bg}', 5) `\n );\n }\n & when (@theme = variable) {\n .button-color(@primary-color-hover; @background; @primary-color-hover);\n }\n }\n\n &:active {\n & when (@theme = dark) {\n .button-color(@primary-7; @background; @primary-7);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{btn-primary-bg}', 7) `; @background;\n ~`colorPalette('@{btn-primary-bg}', 7) `\n );\n }\n & when (@theme = variable) {\n .button-color(@primary-color-active; @background; @primary-color-active);\n }\n }\n .button-disabled();\n}\n\n.button-variant-ghost(@color; @border; @borderHover: yellow; @borderActive: yellow) {\n .button-color(@color; null; @border);\n text-shadow: none;\n\n &:hover,\n &:focus {\n & when (@border = transparent) {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{color}', 7) `; null; transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{color}', 5) `; null; transparent);\n }\n & when (@theme = variable) {\n .button-color(@borderActive; transparent; transparent);\n }\n }\n & when not (@border = transparent) {\n & when (@theme = dark) {\n .button-color(\n ~`colorPalette('@{color}', 7) `; null; ~`colorPalette('@{color}', 7) `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{color}', 5) `; null; ~`colorPalette('@{color}', 5) `\n );\n }\n & when (@theme = variable) {\n .button-color(@borderHover; transparent; @borderHover);\n }\n }\n }\n\n &:active {\n & when (@border = transparent) {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{color}', 5) `; null; transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{color}', 7) `; null; transparent);\n }\n & when (@theme = variable) {\n .button-color(@borderActive; transparent; transparent);\n }\n }\n & when not (@border = transparent) {\n & when (@theme = dark) {\n .button-color(\n ~`colorPalette('@{color}', 5) `; null; ~`colorPalette('@{color}', 5) `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{color}', 7) `; null; ~`colorPalette('@{color}', 7) `\n );\n }\n & when (@theme = variable) {\n .button-color(@borderActive; transparent; @borderActive);\n }\n }\n }\n .button-disabled();\n}\n\n.button-group-base(@btnClassName) {\n position: relative;\n display: inline-flex;\n > .@{btnClassName},\n > span > .@{btnClassName} {\n position: relative;\n\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n\n &[disabled] {\n z-index: 0;\n }\n }\n .@{btnClassName}-icon-only {\n font-size: @font-size-base;\n }\n}\n// Base styles of buttons\n// --------------------------------------------------\n.btn() {\n position: relative;\n display: inline-block;\n font-weight: @btn-font-weight;\n white-space: nowrap;\n text-align: center;\n background-image: none;\n border: @btn-border-width @btn-border-style transparent;\n box-shadow: @btn-shadow;\n cursor: pointer;\n transition: all 0.3s @ease-in-out;\n user-select: none;\n touch-action: manipulation;\n .button-size(\n @btn-height-base; @btn-padding-horizontal-base; @font-size-base; @btn-border-radius-base\n );\n > .@{iconfont-css-prefix} {\n line-height: 1;\n }\n\n &,\n &:active,\n &:focus {\n outline: 0;\n }\n\n &:not([disabled]):hover {\n text-decoration: none;\n }\n\n &:not([disabled]):active {\n outline: 0;\n box-shadow: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n\n > * {\n pointer-events: none;\n }\n }\n\n &-lg {\n .button-size(\n @btn-height-lg; @btn-padding-horizontal-lg; @btn-font-size-lg; @btn-border-radius-base\n );\n }\n\n &-sm {\n .button-size(\n @btn-height-sm; @btn-padding-horizontal-sm; @btn-font-size-sm; @btn-border-radius-sm\n );\n }\n}\n// primary button style\n.btn-primary() {\n .button-variant-primary(@btn-primary-color; @btn-primary-bg; @primary-color-hover; @primary-color-active);\n}\n// default button style\n.btn-default() {\n .button-variant-other(@btn-default-color; @btn-default-bg; @btn-default-border; );\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: @btn-default-bg;\n }\n}\n// ghost button style\n.btn-ghost() {\n .button-variant-other(@btn-ghost-color, @btn-ghost-bg, @btn-ghost-border);\n}\n// dashed button style\n.btn-dashed() {\n .button-variant-other(@btn-default-color, @btn-default-bg, @btn-default-border);\n border-style: dashed;\n}\n// danger button style\n.btn-danger() {\n .button-variant-primary(@btn-danger-color, @btn-danger-bg, @error-color-hover, @error-color-active);\n}\n// danger default button style\n.btn-danger-default() {\n .button-color(@error-color, @btn-default-bg, @error-color);\n\n &:hover,\n &:focus {\n & when (@theme = dark) {\n .button-color(\n ~`colorPalette('@{error-color}', 7) `; @btn-default-bg; ~`colorPalette('@{error-color}', 7)\n `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{error-color}', 5) `; @btn-default-bg; ~`colorPalette('@{error-color}', 5)\n `\n );\n }\n & when (@theme = variable) {\n .button-color(@error-color-hover, @btn-default-bg, @error-color-hover);\n }\n }\n\n &:active {\n & when (@theme = dark) {\n .button-color(\n ~`colorPalette('@{error-color}', 5) `; @btn-default-bg; ~`colorPalette('@{error-color}', 5)\n `\n );\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(\n ~`colorPalette('@{error-color}', 7) `; @btn-default-bg; ~`colorPalette('@{error-color}', 7)\n `\n );\n }\n & when (@theme = variable) {\n .button-color(@error-color-active, @btn-default-bg, @error-color-active);\n }\n }\n .button-disabled();\n}\n// danger link button style\n.btn-danger-link() {\n .button-variant-other(@error-color, transparent, transparent);\n box-shadow: none;\n\n &:hover,\n &:focus {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{error-color}', 7) `; transparent; transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{error-color}', 5) `; transparent; transparent);\n }\n & when (@theme = variable) {\n .button-color(@error-color-hover; transparent; transparent);\n }\n }\n\n &:active {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{error-color}', 5) `; transparent; transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{error-color}', 7) `; transparent; transparent);\n }\n & when (@theme = variable) {\n .button-color(@error-color-active; transparent; transparent);\n }\n }\n .button-disabled(@disabled-color; transparent; transparent);\n}\n// link button style\n.btn-link() {\n .button-variant-other(@link-color, transparent, transparent);\n box-shadow: none;\n\n &:hover {\n background: @btn-link-hover-bg;\n }\n\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n .button-disabled(@disabled-color; transparent; transparent);\n}\n// link button disabled style\n.btn-href-disabled() {\n cursor: not-allowed;\n\n > * {\n pointer-events: none;\n }\n\n &,\n &:hover,\n &:focus,\n &:active {\n .button-color(@btn-disable-color,transparent, transparent);\n\n text-shadow: none;\n box-shadow: none;\n }\n}\n// text button style\n.btn-text() {\n .button-variant-other(@text-color, transparent, transparent);\n box-shadow: none;\n\n &:hover,\n &:focus {\n color: @text-color;\n background: @btn-text-hover-bg;\n border-color: transparent;\n }\n\n &:active {\n color: @text-color;\n background: fadein(@btn-text-hover-bg, 1%);\n border-color: transparent;\n }\n\n .button-disabled(@disabled-color; transparent; transparent);\n}\n.btn-danger-text() {\n .button-variant-other(@error-color, transparent, transparent);\n box-shadow: none;\n\n &:hover,\n &:focus {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{error-color}', 7) `; @btn-text-hover-bg; transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{error-color}', 5) `; @btn-text-hover-bg; transparent);\n }\n & when (@theme = variable) {\n .button-color(@error-color-hover; @btn-text-hover-bg; transparent);\n }\n }\n\n &:active {\n & when (@theme = dark) {\n .button-color(~`colorPalette('@{error-color}', 5) `; fadein(@btn-text-hover-bg, 1%); transparent);\n }\n & when (not (@theme = dark) and not (@theme = variable)) {\n .button-color(~`colorPalette('@{error-color}', 7) `; fadein(@btn-text-hover-bg, 1%); transparent);\n }\n & when (@theme = variable) {\n .button-color(@error-color-active; fadein(@btn-text-hover-bg, 1%); transparent);\n }\n }\n .button-disabled(@disabled-color; transparent; transparent);\n}\n// round button\n.btn-round(@btnClassName: btn) {\n .button-size(@btn-circle-size; (@btn-circle-size / 2); @font-size-base; @btn-circle-size);\n &.@{btnClassName}-lg {\n .button-size(\n @btn-circle-size-lg; (@btn-circle-size-lg / 2); @btn-font-size-lg; @btn-circle-size-lg\n );\n }\n &.@{btnClassName}-sm {\n .button-size(\n @btn-circle-size-sm; (@btn-circle-size-sm / 2); @font-size-base; @btn-circle-size-sm\n );\n }\n}\n// square button: the content only contains icon\n.btn-square(@btnClassName: btn) {\n .square(@btn-square-size);\n .button-size(@btn-square-size; 0; @btn-square-only-icon-size; @btn-border-radius-base);\n\n & > * {\n font-size: @btn-square-only-icon-size;\n }\n &.@{btnClassName}-lg {\n .square(@btn-square-size-lg);\n .button-size(@btn-square-size-lg; 0; @btn-square-only-icon-size-lg; @btn-border-radius-base);\n\n & > * {\n font-size: @btn-square-only-icon-size-lg;\n }\n }\n &.@{btnClassName}-sm {\n .square(@btn-square-size-sm);\n .button-size(@btn-square-size-sm; 0; @btn-square-only-icon-size-sm; @btn-border-radius-base);\n\n & > * {\n font-size: @btn-square-only-icon-size-sm;\n }\n }\n}\n// circle button: the content only contains icon\n.btn-circle(@btnClassName: btn) {\n min-width: @btn-height-base;\n padding-right: 0;\n padding-left: 0;\n text-align: center;\n border-radius: 50%;\n &.@{btnClassName}-lg {\n min-width: @btn-height-lg;\n border-radius: 50%;\n }\n &.@{btnClassName}-sm {\n min-width: @btn-height-sm;\n border-radius: 50%;\n }\n}\n// Horizontal button groups style\n// --------------------------------------------------\n.btn-group(@btnClassName: btn) {\n .button-group-base(@btnClassName);\n .@{btnClassName} + .@{btnClassName},\n .@{btnClassName} + &,\n span + .@{btnClassName},\n .@{btnClassName} + span,\n > span + span,\n & + .@{btnClassName},\n & + & {\n margin-left: -1px;\n }\n .@{btnClassName}-primary + .@{btnClassName}:not(.@{btnClassName}-primary):not([disabled]) {\n border-left-color: transparent;\n }\n .@{btnClassName} {\n border-radius: 0;\n }\n > .@{btnClassName}:first-child,\n > span:first-child > .@{btnClassName} {\n margin-left: 0;\n }\n > .@{btnClassName}:only-child {\n border-radius: @btn-border-radius-base;\n }\n > span:only-child > .@{btnClassName} {\n border-radius: @btn-border-radius-base;\n }\n > .@{btnClassName}:first-child:not(:last-child),\n > span:first-child:not(:last-child) > .@{btnClassName} {\n border-top-left-radius: @btn-border-radius-base;\n border-bottom-left-radius: @btn-border-radius-base;\n }\n > .@{btnClassName}:last-child:not(:first-child),\n > span:last-child:not(:first-child) > .@{btnClassName} {\n border-top-right-radius: @btn-border-radius-base;\n border-bottom-right-radius: @btn-border-radius-base;\n }\n\n &-sm {\n > .@{btnClassName}:only-child {\n border-radius: @btn-border-radius-sm;\n }\n > span:only-child > .@{btnClassName} {\n border-radius: @btn-border-radius-sm;\n }\n > .@{btnClassName}:first-child:not(:last-child),\n > span:first-child:not(:last-child) > .@{btnClassName} {\n border-top-left-radius: @btn-border-radius-sm;\n border-bottom-left-radius: @btn-border-radius-sm;\n }\n > .@{btnClassName}:last-child:not(:first-child),\n > span:last-child:not(:first-child) > .@{btnClassName} {\n border-top-right-radius: @btn-border-radius-sm;\n border-bottom-right-radius: @btn-border-radius-sm;\n }\n }\n\n & > & {\n float: left;\n }\n & > &:not(:first-child):not(:last-child) > .@{btnClassName} {\n border-radius: 0;\n }\n\n & > &:first-child:not(:last-child) {\n > .@{btnClassName}:last-child {\n padding-right: 8px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n & > &:last-child:not(:first-child) > .@{btnClassName}:first-child {\n padding-left: 8px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './mixin';\n\n@btn-prefix-cls: ~'@{ant-prefix}-btn';\n\n// for compatible\n@btn-ghost-color: @text-color;\n@btn-ghost-bg: transparent;\n@btn-ghost-border: @border-color-base;\n\n// Button styles\n// -----------------------------\n.@{btn-prefix-cls} {\n // Fixing https://github.com/ant-design/ant-design/issues/12978\n // Fixing https://github.com/ant-design/ant-design/issues/20058\n // Fixing https://github.com/ant-design/ant-design/issues/19972\n // Fixing https://github.com/ant-design/ant-design/issues/18107\n // Fixing https://github.com/ant-design/ant-design/issues/13214\n // It is a render problem of chrome, which is only happened in the codesandbox demo\n // 0.001px solution works and I don't know why\n line-height: @btn-line-height;\n .btn();\n .btn-default();\n\n // Fix loading button animation\n // https://github.com/ant-design/ant-design/issues/24323\n > span {\n display: inline-block;\n }\n\n &-primary {\n .btn-primary();\n\n .@{btn-prefix-cls}-group &:not(:first-child):not(:last-child) {\n border-right-color: @btn-group-border;\n border-left-color: @btn-group-border;\n\n &:disabled {\n border-color: @btn-default-border;\n }\n }\n\n .@{btn-prefix-cls}-group &:first-child {\n &:not(:last-child) {\n border-right-color: @btn-group-border;\n\n &[disabled] {\n border-right-color: @btn-default-border;\n }\n }\n }\n\n .@{btn-prefix-cls}-group &:last-child:not(:first-child),\n .@{btn-prefix-cls}-group & + & {\n border-left-color: @btn-group-border;\n\n &[disabled] {\n border-left-color: @btn-default-border;\n }\n }\n }\n\n &-ghost {\n .btn-ghost();\n }\n\n &-dashed {\n .btn-dashed();\n }\n\n // type=\"danger\" will deprecated\n // use danger instead\n &-danger {\n .btn-danger();\n }\n\n &-link {\n .btn-link();\n }\n\n &-text {\n .btn-text();\n }\n\n &-dangerous {\n .btn-danger-default();\n }\n\n &-dangerous&-primary {\n .btn-danger();\n }\n\n &-dangerous&-link {\n .btn-danger-link();\n }\n\n &-dangerous&-text {\n .btn-danger-text();\n }\n\n &-icon-only {\n .btn-square(@btn-prefix-cls);\n vertical-align: -3px;\n\n > .@{iconfont-css-prefix} {\n display: flex;\n justify-content: center;\n }\n\n .@{iconfont-css-prefix}-loading {\n padding: 0 !important;\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/32365\n a&-icon-only {\n vertical-align: -1px;\n\n > .@{iconfont-css-prefix} {\n display: inline;\n }\n }\n\n &-round {\n .btn-round(@btn-prefix-cls);\n &.@{btn-prefix-cls}-icon-only {\n width: auto;\n }\n }\n\n &-circle {\n .btn-circle(@btn-prefix-cls);\n }\n\n &::before {\n position: absolute;\n top: -@btn-border-width;\n right: -@btn-border-width;\n bottom: -@btn-border-width;\n left: -@btn-border-width;\n z-index: 1;\n display: none;\n background: @component-background;\n border-radius: inherit;\n opacity: 0.35;\n transition: opacity 0.2s;\n content: '';\n pointer-events: none;\n }\n\n .@{iconfont-css-prefix} {\n transition: margin-left 0.3s @ease-in-out;\n\n // Follow icon blur under windows. Change the render.\n // https://github.com/ant-design/ant-design/issues/13924\n &.@{iconfont-css-prefix}-plus,\n &.@{iconfont-css-prefix}-minus {\n > svg {\n shape-rendering: optimizespeed;\n }\n }\n }\n\n &&-loading {\n position: relative;\n cursor: default;\n\n &::before {\n display: block;\n }\n }\n\n & > &-loading-icon {\n transition: width 0.3s @ease-in-out, opacity 0.3s @ease-in-out;\n\n .@{iconfont-css-prefix} {\n padding-right: @padding-xs;\n animation: none;\n // for smooth button padding transition\n svg {\n animation: loadingCircle 1s infinite linear;\n }\n }\n }\n\n &-group {\n .btn-group(@btn-prefix-cls);\n }\n\n // http://stackoverflow.com/a/21281554/3040605\n &:focus > span,\n &:active > span {\n position: relative;\n }\n\n // To ensure that a space will be placed between character and `Icon`.\n > .@{iconfont-css-prefix} + span,\n > span + .@{iconfont-css-prefix} {\n margin-left: @margin-xs;\n }\n\n &&-background-ghost {\n color: @btn-default-ghost-color;\n border-color: @btn-default-ghost-border;\n\n &,\n &:hover,\n &:active,\n &:focus {\n background: @btn-default-ghost-bg;\n }\n\n &:hover,\n &:focus {\n color: @primary-color-hover;\n border-color: @primary-color-hover;\n }\n\n &:active {\n color: @primary-color-active;\n border-color: @primary-color-active;\n }\n\n &[disabled] {\n color: @disabled-color;\n background: @btn-default-ghost-bg;\n border-color: @btn-default-border;\n }\n }\n\n &-background-ghost&-primary {\n .button-variant-ghost(@btn-primary-bg, @btn-primary-bg, @primary-color-hover, @primary-color-active);\n }\n\n &-background-ghost&-danger {\n .button-variant-ghost(@btn-danger-border, @btn-danger-border, @error-color-hover, @error-color-active);\n }\n\n &-background-ghost&-dangerous {\n .button-variant-ghost(@btn-danger-border, @btn-danger-border, @error-color-hover, @error-color-active);\n }\n\n &-background-ghost&-dangerous&-link {\n .button-variant-ghost(@btn-danger-border, transparent, @error-color-hover, @error-color-active);\n }\n\n &-two-chinese-chars::first-letter {\n letter-spacing: 0.34em;\n }\n\n &-two-chinese-chars > *:not(.@{iconfont-css-prefix}) {\n margin-right: -0.34em;\n letter-spacing: 0.34em;\n }\n\n &&-block {\n width: 100%;\n }\n\n // https://github.com/ant-design/ant-design/issues/12681\n // same method as Select\n &:empty {\n display: inline-block;\n width: 0;\n visibility: hidden;\n content: '\\a0';\n }\n}\n\na.@{btn-prefix-cls} {\n // Fixing https://github.com/ant-design/ant-design/issues/12978\n // https://github.com/ant-design/ant-design/issues/29978\n // It is a render problem of chrome, which is only happened in the codesandbox demo\n // 0.1px for padding-top solution works and I don't why\n padding-top: 0.01px !important;\n line-height: @btn-height-base - 2px;\n\n &-disabled {\n .btn-href-disabled();\n }\n\n &-lg {\n line-height: @btn-height-lg - 2px;\n }\n\n &-sm {\n line-height: @btn-height-sm - 2px;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{btn-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-primary {\n .@{btn-prefix-cls}-group &:last-child:not(:first-child),\n .@{btn-prefix-cls}-group & + & {\n .@{btn-prefix-cls}-group-rtl& {\n border-right-color: @btn-group-border;\n border-left-color: @btn-default-border;\n }\n\n &[disabled] {\n .@{btn-prefix-cls}-group-rtl& {\n border-right-color: @btn-default-border;\n border-left-color: @btn-group-border;\n }\n }\n }\n }\n\n & > &-loading-icon {\n .@{iconfont-css-prefix} {\n .@{btn-prefix-cls}-rtl& {\n padding-right: 0;\n padding-left: @margin-xs;\n }\n }\n }\n\n > .@{iconfont-css-prefix} + span,\n > span + .@{iconfont-css-prefix} {\n .@{btn-prefix-cls}-rtl& {\n margin-right: 8px;\n margin-left: 0;\n }\n }\n}\n\n// mixin\n.btn-group(@btnClassName: btn) {\n .@{btnClassName} + .@{btnClassName},\n .@{btnClassName} + &,\n span + .@{btnClassName},\n .@{btnClassName} + span,\n > span + span,\n & + .@{btnClassName},\n & + & {\n .@{btnClassName}-rtl&,\n .@{btnClassName}-group-rtl& {\n margin-right: -1px;\n margin-left: auto;\n }\n }\n\n &.@{btnClassName}-group-rtl {\n direction: rtl;\n }\n\n > .@{btnClassName}:first-child:not(:last-child),\n > span:first-child:not(:last-child) > .@{btnClassName} {\n .@{btnClassName}-group-rtl& {\n border-radius: 0 @btn-border-radius-base @btn-border-radius-base 0;\n }\n }\n\n > .@{btnClassName}:last-child:not(:first-child),\n > span:last-child:not(:first-child) > .@{btnClassName} {\n .@{btnClassName}-group-rtl& {\n border-radius: @btn-border-radius-base 0 0 @btn-border-radius-base;\n }\n }\n\n &-sm {\n > .@{btnClassName}:first-child:not(:last-child),\n > span:first-child:not(:last-child) > .@{btnClassName} {\n .@{btnClassName}-group-rtl& {\n border-radius: 0 @btn-border-radius-sm @btn-border-radius-sm 0;\n }\n }\n\n > .@{btnClassName}:last-child:not(:first-child),\n > span:last-child:not(:first-child) > .@{btnClassName} {\n .@{btnClassName}-group-rtl& {\n border-radius: @btn-border-radius-sm 0 0 @btn-border-radius-sm;\n }\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n@menu-prefix-cls: ~'@{ant-prefix}-menu';\n\n.@{menu-prefix-cls} {\n // Danger\n &-item-danger&-item {\n color: @menu-highlight-danger-color;\n\n &:hover,\n &-active {\n color: @menu-highlight-danger-color;\n }\n\n &:active {\n background: @menu-item-active-danger-bg;\n }\n\n &-selected {\n color: @menu-highlight-danger-color;\n\n > a,\n > a:hover {\n color: @menu-highlight-danger-color;\n }\n }\n\n .@{menu-prefix-cls}:not(.@{menu-prefix-cls}-horizontal) &-selected {\n background-color: @menu-item-active-danger-bg;\n }\n\n .@{menu-prefix-cls}-inline &::after {\n border-right-color: @menu-highlight-danger-color;\n }\n }\n\n // ==================== Dark ====================\n &-dark &-item-danger&-item {\n &,\n &:hover,\n & > a {\n color: @menu-dark-danger-color;\n }\n }\n\n &-dark&-dark:not(&-horizontal) &-item-danger&-item-selected {\n color: @menu-dark-highlight-color;\n background-color: @menu-dark-item-active-danger-bg;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './status';\n\n@menu-prefix-cls: ~'@{ant-prefix}-menu';\n@menu-animation-duration-normal: 0.15s;\n\n.accessibility-focus() {\n box-shadow: 0 0 0 2px @primary-2;\n}\n\n// TODO: Should remove icon style compatible in v5\n\n// default theme\n.@{menu-prefix-cls} {\n .reset-component();\n\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n color: @menu-item-color;\n font-size: @menu-item-font-size;\n line-height: 0; // Fix display inline-block gap\n text-align: left;\n list-style: none;\n background: @menu-bg;\n outline: none;\n box-shadow: @box-shadow-base;\n transition: background @animation-duration-slow,\n width @animation-duration-slow cubic-bezier(0.2, 0, 0, 1) 0s;\n .clearfix();\n\n &&-root:focus-visible {\n .accessibility-focus();\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n // Overflow ellipsis\n &-overflow {\n display: flex;\n\n &-item {\n flex: none;\n }\n }\n\n &-hidden,\n &-submenu-hidden {\n display: none;\n }\n\n &-item-group-title {\n height: @menu-item-group-height;\n padding: 8px 16px;\n color: @menu-item-group-title-color;\n font-size: @menu-item-group-title-font-size;\n line-height: @menu-item-group-height;\n transition: all @animation-duration-slow;\n }\n\n &-horizontal &-submenu {\n transition: border-color @animation-duration-slow @ease-in-out,\n background @animation-duration-slow @ease-in-out;\n }\n\n &-submenu,\n &-submenu-inline {\n transition: border-color @animation-duration-slow @ease-in-out,\n background @animation-duration-slow @ease-in-out,\n padding @menu-animation-duration-normal @ease-in-out;\n }\n\n &-submenu-selected {\n color: @menu-highlight-color;\n }\n\n &-item:active,\n &-submenu-title:active {\n background: @menu-item-active-bg;\n }\n\n &-submenu &-sub {\n cursor: initial;\n transition: background @animation-duration-slow @ease-in-out,\n padding @animation-duration-slow @ease-in-out;\n }\n\n &-title-content {\n transition: color @animation-duration-slow;\n }\n\n &-item a {\n color: @menu-item-color;\n\n &:hover {\n color: @menu-highlight-color;\n }\n\n &::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: transparent;\n content: '';\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/19809\n &-item > .@{ant-prefix}-badge a {\n color: @menu-item-color;\n\n &:hover {\n color: @menu-highlight-color;\n }\n }\n\n &-item-divider {\n overflow: hidden;\n line-height: 0;\n border-color: @border-color-split;\n border-style: solid;\n border-width: 1px 0 0;\n }\n\n &-item-divider-dashed {\n border-style: dashed;\n }\n\n &-horizontal &-item,\n &-horizontal &-submenu {\n margin-top: -1px;\n }\n\n &-horizontal > &-item:hover,\n &-horizontal > &-item-active,\n &-horizontal > &-submenu &-submenu-title:hover {\n background-color: transparent;\n }\n\n &-item-selected {\n color: @menu-highlight-color;\n\n a,\n a:hover {\n color: @menu-highlight-color;\n }\n }\n\n &:not(&-horizontal) &-item-selected {\n background-color: @menu-item-active-bg;\n }\n\n &-inline,\n &-vertical,\n &-vertical-left {\n border-right: @border-width-base @border-style-base @border-color-split;\n }\n\n &-vertical-right {\n border-left: @border-width-base @border-style-base @border-color-split;\n }\n\n &-vertical&-sub,\n &-vertical-left&-sub,\n &-vertical-right&-sub {\n min-width: 160px;\n max-height: calc(100vh - 100px);\n padding: 0;\n overflow: hidden;\n border-right: 0;\n\n // https://github.com/ant-design/ant-design/issues/22244\n // https://github.com/ant-design/ant-design/issues/26812\n &:not([class*='-active']) {\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n .@{menu-prefix-cls}-item {\n left: 0;\n margin-left: 0;\n border-right: 0;\n\n &::after {\n border-right: 0;\n }\n }\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-submenu {\n transform-origin: 0 0;\n }\n }\n\n &-horizontal&-sub {\n min-width: 114px; // in case of submenu width is too big: https://codesandbox.io/s/qvpwm6mk66\n }\n\n &-horizontal &-item,\n &-horizontal &-submenu-title {\n transition: border-color @animation-duration-slow, background @animation-duration-slow;\n }\n\n &-item,\n &-submenu-title {\n position: relative;\n display: block;\n margin: 0;\n padding: @menu-item-padding;\n white-space: nowrap;\n cursor: pointer;\n transition: border-color @animation-duration-slow, background @animation-duration-slow,\n padding @animation-duration-slow @ease-in-out;\n\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n min-width: 14px;\n font-size: @menu-icon-size;\n transition: font-size @menu-animation-duration-normal @ease-out,\n margin @animation-duration-slow @ease-in-out, color @animation-duration-slow;\n\n + span {\n margin-left: @menu-icon-margin-right;\n opacity: 1;\n transition: opacity @animation-duration-slow @ease-in-out, margin @animation-duration-slow,\n color @animation-duration-slow;\n }\n }\n\n .@{menu-prefix-cls}-item-icon.svg {\n vertical-align: -0.125em;\n }\n\n &.@{menu-prefix-cls}-item-only-child {\n > .@{iconfont-css-prefix},\n > .@{menu-prefix-cls}-item-icon {\n margin-right: 0;\n }\n }\n\n &:focus-visible {\n .accessibility-focus();\n }\n }\n\n & > &-item-divider {\n margin: 1px 0;\n padding: 0;\n }\n\n &-submenu {\n &-popup {\n position: absolute;\n z-index: @zindex-dropdown;\n background: transparent;\n border-radius: @border-radius-base;\n box-shadow: none;\n transform-origin: 0 0;\n\n // https://github.com/ant-design/ant-design/issues/13955\n &::before {\n position: absolute;\n top: -7px;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n width: 100%;\n height: 100%;\n opacity: 0.0001;\n content: ' ';\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/13955\n &-placement-rightTop::before {\n top: 0;\n left: -7px;\n }\n\n > .@{menu-prefix-cls} {\n background-color: @menu-bg;\n border-radius: @border-radius-base;\n\n &-submenu-title::after {\n transition: transform @animation-duration-slow @ease-in-out;\n }\n }\n\n &-popup > .@{menu-prefix-cls} {\n background-color: @menu-popup-bg;\n }\n\n &-expand-icon,\n &-arrow {\n position: absolute;\n top: 50%;\n right: 16px;\n width: 10px;\n color: @menu-item-color;\n transform: translateY(-50%);\n transition: transform @animation-duration-slow @ease-in-out;\n }\n\n &-arrow {\n // →\n &::before,\n &::after {\n position: absolute;\n width: 6px;\n height: 1.5px;\n background-color: currentcolor;\n border-radius: 2px;\n transition: background @animation-duration-slow @ease-in-out,\n transform @animation-duration-slow @ease-in-out, top @animation-duration-slow @ease-in-out,\n color @animation-duration-slow @ease-in-out;\n content: '';\n }\n\n &::before {\n transform: rotate(45deg) translateY(-2.5px);\n }\n\n &::after {\n transform: rotate(-45deg) translateY(2.5px);\n }\n }\n\n &:hover > &-title > &-expand-icon,\n &:hover > &-title > &-arrow {\n color: @menu-highlight-color;\n }\n\n .@{menu-prefix-cls}-inline-collapsed &-arrow,\n &-inline &-arrow {\n // ↓\n &::before {\n transform: rotate(-45deg) translateX(2.5px);\n }\n\n &::after {\n transform: rotate(45deg) translateX(-2.5px);\n }\n }\n\n &-horizontal &-arrow {\n display: none;\n }\n\n &-open&-inline > &-title > &-arrow {\n // ↑\n transform: translateY(-2px);\n\n &::after {\n transform: rotate(-45deg) translateX(-2.5px);\n }\n\n &::before {\n transform: rotate(45deg) translateX(2.5px);\n }\n }\n }\n\n &-vertical &-submenu-selected,\n &-vertical-left &-submenu-selected,\n &-vertical-right &-submenu-selected {\n color: @menu-highlight-color;\n }\n\n &-horizontal {\n line-height: @menu-horizontal-line-height;\n border: 0;\n border-bottom: @border-width-base @border-style-base @border-color-split;\n box-shadow: none;\n\n &:not(.@{menu-prefix-cls}-dark) {\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-submenu {\n margin-top: -1px;\n margin-bottom: 0;\n padding: @menu-item-padding;\n\n &:hover,\n &-active,\n &-open,\n &-selected {\n color: @menu-highlight-color;\n\n &::after {\n border-bottom: 2px solid @menu-highlight-color;\n }\n }\n }\n }\n\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-submenu {\n position: relative;\n top: 1px;\n display: inline-block;\n vertical-align: bottom;\n\n &::after {\n position: absolute;\n right: @menu-item-padding-horizontal;\n bottom: 0;\n left: @menu-item-padding-horizontal;\n border-bottom: 2px solid transparent;\n transition: border-color @animation-duration-slow @ease-in-out;\n content: '';\n }\n }\n\n > .@{menu-prefix-cls}-submenu > .@{menu-prefix-cls}-submenu-title {\n padding: 0;\n }\n\n > .@{menu-prefix-cls}-item {\n a {\n color: @menu-item-color;\n\n &:hover {\n color: @menu-highlight-color;\n }\n\n &::before {\n bottom: -2px;\n }\n }\n\n &-selected a {\n color: @menu-highlight-color;\n }\n }\n\n &::after {\n display: block;\n clear: both;\n height: 0;\n content: '\\20';\n }\n }\n\n &-vertical,\n &-vertical-left,\n &-vertical-right,\n &-inline {\n .@{menu-prefix-cls}-item {\n position: relative;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n border-right: @menu-item-active-border-width solid @menu-highlight-color;\n transform: scaleY(0.0001);\n opacity: 0;\n transition: transform @menu-animation-duration-normal @ease-out,\n opacity @menu-animation-duration-normal @ease-out;\n content: '';\n }\n }\n\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n height: @menu-item-height;\n margin-top: @menu-item-vertical-margin;\n margin-bottom: @menu-item-vertical-margin;\n padding: 0 16px;\n overflow: hidden;\n line-height: @menu-item-height;\n text-overflow: ellipsis;\n }\n\n // disable margin collapsed\n .@{menu-prefix-cls}-submenu {\n padding-bottom: 0.02px;\n }\n\n .@{menu-prefix-cls}-item:not(:last-child) {\n margin-bottom: @menu-item-boundary-margin;\n }\n\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-submenu > .@{menu-prefix-cls}-submenu-title {\n height: @menu-inline-toplevel-item-height;\n line-height: @menu-inline-toplevel-item-height;\n }\n }\n\n &-vertical {\n .@{menu-prefix-cls}-item-group-list .@{menu-prefix-cls}-submenu-title,\n .@{menu-prefix-cls}-submenu-title {\n padding-right: 34px;\n }\n }\n\n &-inline {\n width: 100%;\n .@{menu-prefix-cls}-selected,\n .@{menu-prefix-cls}-item-selected {\n &::after {\n transform: scaleY(1);\n opacity: 1;\n transition: transform @menu-animation-duration-normal @ease-in-out,\n opacity @menu-animation-duration-normal @ease-in-out;\n }\n }\n\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n width: ~'calc(100% + 1px)';\n }\n\n .@{menu-prefix-cls}-item-group-list .@{menu-prefix-cls}-submenu-title,\n .@{menu-prefix-cls}-submenu-title {\n padding-right: 34px;\n }\n\n // Motion enhance for first level\n &.@{menu-prefix-cls}-root {\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n display: flex;\n align-items: center;\n transition: border-color @animation-duration-slow, background @animation-duration-slow,\n padding 0.1s @ease-out;\n\n > .@{menu-prefix-cls}-title-content {\n flex: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n > * {\n flex: none;\n }\n }\n }\n }\n\n &&-inline-collapsed {\n width: @menu-collapsed-width;\n\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-item-group\n > .@{menu-prefix-cls}-item-group-list\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-item-group\n > .@{menu-prefix-cls}-item-group-list\n > .@{menu-prefix-cls}-submenu\n > .@{menu-prefix-cls}-submenu-title,\n > .@{menu-prefix-cls}-submenu > .@{menu-prefix-cls}-submenu-title {\n left: 0;\n padding: 0 ~'calc(50% - @{menu-icon-size-lg} / 2)';\n text-overflow: clip;\n\n .@{menu-prefix-cls}-submenu-arrow {\n opacity: 0;\n }\n\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n margin: 0;\n font-size: @menu-icon-size-lg;\n line-height: @menu-item-height;\n\n + span {\n display: inline-block;\n opacity: 0;\n }\n }\n }\n\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n display: inline-block;\n }\n\n &-tooltip {\n pointer-events: none;\n\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n display: none;\n }\n\n a {\n color: @text-color-dark;\n }\n }\n\n .@{menu-prefix-cls}-item-group-title {\n padding-right: 4px;\n padding-left: 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n\n &-item-group-list {\n margin: 0;\n padding: 0;\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n padding: 0 16px 0 28px;\n }\n }\n\n &-root&-vertical,\n &-root&-vertical-left,\n &-root&-vertical-right,\n &-root&-inline {\n box-shadow: none;\n }\n\n &-root&-inline-collapsed {\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu .@{menu-prefix-cls}-submenu-title {\n > .@{menu-prefix-cls}-inline-collapsed-noicon {\n font-size: @menu-icon-size-lg;\n text-align: center;\n }\n }\n }\n\n &-sub&-inline {\n padding: 0;\n background: @menu-inline-submenu-bg;\n border: 0;\n border-radius: 0;\n box-shadow: none;\n & > .@{menu-prefix-cls}-item,\n & > .@{menu-prefix-cls}-submenu > .@{menu-prefix-cls}-submenu-title {\n height: @menu-item-height;\n line-height: @menu-item-height;\n list-style-position: inside;\n list-style-type: disc;\n }\n\n & .@{menu-prefix-cls}-item-group-title {\n padding-left: 32px;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &-item-disabled,\n &-submenu-disabled {\n color: @disabled-color !important;\n background: none;\n cursor: not-allowed;\n\n &::after {\n border-color: transparent !important;\n }\n\n a {\n color: @disabled-color !important;\n pointer-events: none;\n }\n > .@{menu-prefix-cls}-submenu-title {\n color: @disabled-color !important;\n cursor: not-allowed;\n > .@{menu-prefix-cls}-submenu-arrow {\n &::before,\n &::after {\n background: @disabled-color !important;\n }\n }\n }\n }\n}\n\n// Integration with header element so menu items have the same height\n.@{ant-prefix}-layout-header {\n .@{menu-prefix-cls} {\n line-height: inherit;\n }\n}\n\n// https://github.com/ant-design/ant-design/issues/32950\n.@{ant-prefix}-menu-inline-collapsed-tooltip {\n a,\n a:hover {\n color: @white;\n }\n}\n\n@import './light';\n@import './dark';\n@import './rtl';\n\n@root-entry-name: default;",".@{menu-prefix-cls} {\n // light theme\n &-light {\n .@{menu-prefix-cls}-item:hover,\n .@{menu-prefix-cls}-item-active,\n .@{menu-prefix-cls}:not(.@{menu-prefix-cls}-inline) .@{menu-prefix-cls}-submenu-open,\n .@{menu-prefix-cls}-submenu-active,\n .@{menu-prefix-cls}-submenu-title:hover {\n color: @menu-highlight-color;\n }\n }\n}\n",".accessibility-focus-dark() {\n box-shadow: 0 0 0 2px @primary-7;\n}\n\n.@{menu-prefix-cls} {\n &&-root:focus-visible {\n .accessibility-focus-dark();\n }\n\n &-dark &-item,\n &-dark &-submenu-title {\n &:focus-visible {\n .accessibility-focus-dark();\n }\n }\n\n // dark theme\n &&-dark,\n &-dark &-sub,\n &&-dark &-sub {\n color: @menu-dark-color;\n background: @menu-dark-bg;\n .@{menu-prefix-cls}-submenu-title .@{menu-prefix-cls}-submenu-arrow {\n opacity: 0.45;\n transition: all 0.3s;\n\n &::after,\n &::before {\n background: @menu-dark-arrow-color;\n }\n }\n }\n\n &-dark&-submenu-popup {\n background: transparent;\n }\n\n &-dark &-inline&-sub {\n background: @menu-dark-inline-submenu-bg;\n }\n\n &-dark&-horizontal {\n border-bottom: 0;\n }\n\n &-dark&-horizontal > &-item,\n &-dark&-horizontal > &-submenu {\n top: 0;\n margin-top: 0;\n padding: @menu-item-padding;\n border-color: @menu-dark-bg;\n border-bottom: 0;\n }\n\n &-dark&-horizontal > &-item:hover {\n background-color: @menu-dark-item-active-bg;\n }\n\n &-dark&-horizontal > &-item > a::before {\n bottom: 0;\n }\n\n &-dark &-item,\n &-dark &-item-group-title,\n &-dark &-item > a,\n &-dark &-item > span > a {\n color: @menu-dark-color;\n }\n\n &-dark&-inline,\n &-dark&-vertical,\n &-dark&-vertical-left,\n &-dark&-vertical-right {\n border-right: 0;\n }\n\n &-dark&-inline &-item,\n &-dark&-vertical &-item,\n &-dark&-vertical-left &-item,\n &-dark&-vertical-right &-item {\n left: 0;\n margin-left: 0;\n border-right: 0;\n\n &::after {\n border-right: 0;\n }\n }\n\n &-dark&-inline &-item,\n &-dark&-inline &-submenu-title {\n width: 100%;\n }\n\n &-dark &-item:hover,\n &-dark &-item-active,\n &-dark &-submenu-active,\n &-dark &-submenu-open,\n &-dark &-submenu-selected,\n &-dark &-submenu-title:hover {\n color: @menu-dark-highlight-color;\n background-color: transparent;\n\n > a,\n > span > a {\n color: @menu-dark-highlight-color;\n }\n > .@{menu-prefix-cls}-submenu-title {\n > .@{menu-prefix-cls}-submenu-arrow {\n opacity: 1;\n\n &::after,\n &::before {\n background: @menu-dark-highlight-color;\n }\n }\n }\n }\n\n &-dark &-item:hover {\n background-color: @menu-dark-item-hover-bg;\n }\n\n &-dark&-dark:not(&-horizontal) &-item-selected {\n background-color: @menu-dark-item-active-bg;\n }\n\n &-dark &-item-selected {\n color: @menu-dark-highlight-color;\n border-right: 0;\n\n &::after {\n border-right: 0;\n }\n\n > a,\n > span > a,\n > a:hover,\n > span > a:hover {\n color: @menu-dark-highlight-color;\n }\n\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n color: @menu-dark-selected-item-icon-color;\n\n + span {\n color: @menu-dark-selected-item-text-color;\n }\n }\n }\n\n &&-dark &-item-selected,\n &-submenu-popup&-dark &-item-selected {\n background-color: @menu-dark-item-active-bg;\n }\n\n // Disabled state sets text to dark gray and nukes hover/tab effects\n &-dark &-item-disabled,\n &-dark &-submenu-disabled {\n &,\n > a,\n > span > a {\n color: @disabled-color-dark !important;\n opacity: 0.8;\n }\n > .@{menu-prefix-cls}-submenu-title {\n color: @disabled-color-dark !important;\n > .@{menu-prefix-cls}-submenu-arrow {\n &::before,\n &::after {\n background: @disabled-color-dark !important;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@menu-prefix-cls: ~'@{ant-prefix}-menu';\n\n.@{menu-prefix-cls} {\n &&-rtl {\n direction: rtl;\n text-align: right;\n }\n\n &-item-group-title {\n .@{menu-prefix-cls}-rtl & {\n text-align: right;\n }\n }\n\n &-inline,\n &-vertical {\n .@{menu-prefix-cls}-rtl& {\n border-right: none;\n border-left: @border-width-base @border-style-base @border-color-split;\n }\n }\n\n &-dark&-inline,\n &-dark&-vertical {\n .@{menu-prefix-cls}-rtl& {\n border-left: none;\n }\n }\n\n &-vertical&-sub,\n &-vertical-left&-sub,\n &-vertical-right&-sub {\n > .@{menu-prefix-cls}-item,\n > .@{menu-prefix-cls}-submenu {\n .@{menu-prefix-cls}-rtl& {\n transform-origin: top right;\n }\n }\n }\n\n &-item,\n &-submenu-title {\n .@{menu-prefix-cls}-item-icon,\n .@{iconfont-css-prefix} {\n .@{menu-prefix-cls}-rtl & {\n margin-right: auto;\n margin-left: @menu-icon-margin-right;\n }\n }\n\n &.@{menu-prefix-cls}-item-only-child {\n > .@{menu-prefix-cls}-item-icon,\n > .@{iconfont-css-prefix} {\n .@{menu-prefix-cls}-rtl & {\n margin-left: 0;\n }\n }\n }\n }\n\n &-submenu {\n &-rtl.@{menu-prefix-cls}-submenu-popup {\n transform-origin: 100% 0;\n }\n\n &-vertical,\n &-vertical-left,\n &-vertical-right,\n &-inline {\n > .@{menu-prefix-cls}-submenu-title .@{menu-prefix-cls}-submenu-arrow {\n .@{menu-prefix-cls}-rtl & {\n right: auto;\n left: 16px;\n }\n }\n }\n\n &-vertical,\n &-vertical-left,\n &-vertical-right {\n > .@{menu-prefix-cls}-submenu-title .@{menu-prefix-cls}-submenu-arrow {\n &::before {\n .@{menu-prefix-cls}-rtl & {\n transform: rotate(-45deg) translateY(-2px);\n }\n }\n\n &::after {\n .@{menu-prefix-cls}-rtl & {\n transform: rotate(45deg) translateY(2px);\n }\n }\n }\n }\n }\n\n &-vertical,\n &-vertical-left,\n &-vertical-right,\n &-inline {\n .@{menu-prefix-cls}-item {\n &::after {\n .@{menu-prefix-cls}-rtl& {\n right: auto;\n left: 0;\n }\n }\n }\n\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n .@{menu-prefix-cls}-rtl& {\n text-align: right;\n }\n }\n }\n\n &-inline {\n .@{menu-prefix-cls}-submenu-title {\n .@{menu-prefix-cls}-rtl& {\n padding-right: 0;\n padding-left: 34px;\n }\n }\n }\n\n &-vertical {\n .@{menu-prefix-cls}-submenu-title {\n .@{menu-prefix-cls}-rtl& {\n padding-right: 16px;\n padding-left: 34px;\n }\n }\n }\n\n &-inline-collapsed&-vertical {\n .@{menu-prefix-cls}-submenu-title {\n .@{menu-prefix-cls}-rtl& {\n padding: 0 ~'calc(50% - @{menu-icon-size-lg} / 2)';\n }\n }\n }\n\n &-item-group-list {\n .@{menu-prefix-cls}-item,\n .@{menu-prefix-cls}-submenu-title {\n .@{menu-prefix-cls}-rtl & {\n padding: 0 28px 0 16px;\n }\n }\n }\n\n &-sub&-inline {\n border: 0;\n & .@{menu-prefix-cls}-item-group-title {\n .@{menu-prefix-cls}-rtl& {\n padding-right: 32px;\n padding-left: 0;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tooltip-prefix-cls: ~'@{ant-prefix}-tooltip';\n\n@tooltip-arrow-shadow-width: 3px;\n\n@tooltip-arrow-rotate-width: sqrt(@tooltip-arrow-width * @tooltip-arrow-width * 2) +\n @tooltip-arrow-shadow-width * 2;\n\n@tooltip-arrow-offset-vertical: 5px; // 8 - 3px\n@tooltip-arrow-offset-horizontal: 13px; // 16 - 3px\n\n// Base class\n.@{tooltip-prefix-cls} {\n .reset-component();\n\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n width: max-content;\n width: intrinsic;\n max-width: @tooltip-max-width;\n visibility: visible;\n\n &-content {\n position: relative;\n }\n\n &-hidden {\n display: none;\n }\n\n &-placement-top,\n &-placement-topLeft,\n &-placement-topRight {\n padding-bottom: @tooltip-distance;\n }\n\n &-placement-right,\n &-placement-rightTop,\n &-placement-rightBottom {\n padding-left: @tooltip-distance;\n }\n\n &-placement-bottom,\n &-placement-bottomLeft,\n &-placement-bottomRight {\n padding-top: @tooltip-distance;\n }\n\n &-placement-left,\n &-placement-leftTop,\n &-placement-leftBottom {\n padding-right: @tooltip-distance;\n }\n\n // Wrapper for the tooltip content\n &-inner {\n min-width: 30px;\n min-height: 32px;\n padding: 6px 8px;\n color: @tooltip-color;\n text-align: left;\n text-decoration: none;\n word-wrap: break-word;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n box-shadow: @box-shadow-base;\n }\n\n // Arrows\n &-arrow {\n position: absolute;\n z-index: 2;\n display: block;\n width: @tooltip-arrow-rotate-width;\n height: @tooltip-arrow-rotate-width;\n overflow: hidden;\n background: transparent;\n pointer-events: none;\n\n &-content {\n // Use linear gradient to mix box shadow of tooltip inner\n --antd-arrow-background-color: linear-gradient(\n to right bottom,\n fadeout(@tooltip-bg, 10%),\n @tooltip-bg\n );\n\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n width: @tooltip-arrow-width;\n height: @tooltip-arrow-width;\n margin: auto;\n content: '';\n pointer-events: auto;\n .roundedArrow(@tooltip-arrow-width, 5px);\n }\n }\n\n &-placement-top &-arrow,\n &-placement-topLeft &-arrow,\n &-placement-topRight &-arrow {\n bottom: 0;\n transform: translateY(100%);\n\n &-content {\n box-shadow: @tooltip-arrow-shadow-width @tooltip-arrow-shadow-width 7px fade(@black, 7%);\n transform: translateY((-@tooltip-arrow-rotate-width / 2)) rotate(45deg);\n }\n }\n\n &-placement-top &-arrow {\n left: 50%;\n transform: translateY(100%) translateX(-50%);\n }\n\n &-placement-topLeft &-arrow {\n left: @tooltip-arrow-offset-horizontal;\n }\n\n &-placement-topRight &-arrow {\n right: @tooltip-arrow-offset-horizontal;\n }\n\n &-placement-right &-arrow,\n &-placement-rightTop &-arrow,\n &-placement-rightBottom &-arrow {\n left: 0;\n transform: translateX(-100%);\n\n &-content {\n box-shadow: -@tooltip-arrow-shadow-width @tooltip-arrow-shadow-width 7px fade(@black, 7%);\n transform: translateX((@tooltip-arrow-rotate-width / 2)) rotate(135deg);\n }\n }\n\n &-placement-right &-arrow {\n top: 50%;\n transform: translateX(-100%) translateY(-50%);\n }\n\n &-placement-rightTop &-arrow {\n top: @tooltip-arrow-offset-vertical;\n }\n\n &-placement-rightBottom &-arrow {\n bottom: @tooltip-arrow-offset-vertical;\n }\n\n &-placement-left &-arrow,\n &-placement-leftTop &-arrow,\n &-placement-leftBottom &-arrow {\n right: 0;\n transform: translateX(100%);\n\n &-content {\n box-shadow: @tooltip-arrow-shadow-width -@tooltip-arrow-shadow-width 7px fade(@black, 7%);\n transform: translateX((-@tooltip-arrow-rotate-width / 2)) rotate(315deg);\n }\n }\n\n &-placement-left &-arrow {\n top: 50%;\n transform: translateX(100%) translateY(-50%);\n }\n\n &-placement-leftTop &-arrow {\n top: @tooltip-arrow-offset-vertical;\n }\n\n &-placement-leftBottom &-arrow {\n bottom: @tooltip-arrow-offset-vertical;\n }\n\n &-placement-bottom &-arrow,\n &-placement-bottomLeft &-arrow,\n &-placement-bottomRight &-arrow {\n top: 0;\n transform: translateY(-100%);\n\n &-content {\n box-shadow: -@tooltip-arrow-shadow-width -@tooltip-arrow-shadow-width 7px fade(@black, 7%);\n transform: translateY((@tooltip-arrow-rotate-width / 2)) rotate(225deg);\n }\n }\n\n &-placement-bottom &-arrow {\n left: 50%;\n transform: translateY(-100%) translateX(-50%);\n }\n\n &-placement-bottomLeft &-arrow {\n left: @tooltip-arrow-offset-horizontal;\n }\n\n &-placement-bottomRight &-arrow {\n right: @tooltip-arrow-offset-horizontal;\n }\n}\n\n.generator-tooltip-preset-color(@i: length(@preset-colors)) when (@i > 0) {\n .generator-tooltip-preset-color(@i - 1);\n @color: extract(@preset-colors, @i);\n @lightColor: '@{color}-6';\n .@{tooltip-prefix-cls}-@{color} {\n .@{tooltip-prefix-cls}-inner {\n background-color: @@lightColor;\n }\n .@{tooltip-prefix-cls}-arrow {\n &-content::before {\n background: @@lightColor;\n }\n }\n }\n}\n.generator-tooltip-preset-color();\n\n@import './rtl';\n\n@root-entry-name: default;","@tooltip-prefix-cls: ~'@{ant-prefix}-tooltip';\n\n// Base class\n.@{tooltip-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n // Wrapper for the tooltip content\n &-inner {\n .@{tooltip-prefix-cls}-rtl & {\n text-align: right;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@calendar-prefix-cls: ~'@{ant-prefix}-picker-calendar';\n@calendar-picker-prefix-cls: ~'@{ant-prefix}-picker';\n\n.@{calendar-prefix-cls} {\n .reset-component();\n background: @calendar-full-bg;\n\n // ========================= Header =========================\n &-header {\n display: flex;\n justify-content: flex-end;\n padding: @padding-sm 0;\n\n .@{calendar-prefix-cls}-year-select {\n min-width: 80px;\n }\n\n .@{calendar-prefix-cls}-month-select {\n min-width: 70px;\n margin-left: @padding-xs;\n }\n\n .@{calendar-prefix-cls}-mode-switch {\n margin-left: @padding-xs;\n }\n }\n\n .@{calendar-picker-prefix-cls}-panel {\n background: @calendar-full-panel-bg;\n border: 0;\n border-top: @border-width-base @border-style-base @border-color-split;\n border-radius: 0;\n\n .@{calendar-picker-prefix-cls}-month-panel,\n .@{calendar-picker-prefix-cls}-date-panel {\n width: auto;\n }\n\n .@{calendar-picker-prefix-cls}-body {\n padding: @padding-xs 0;\n }\n\n .@{calendar-picker-prefix-cls}-content {\n width: 100%;\n }\n }\n\n // ========================== Mini ==========================\n &-mini {\n border-radius: @border-radius-base;\n\n .@{calendar-picker-prefix-cls}-calendar-header {\n padding-right: @padding-xs;\n padding-left: @padding-xs;\n }\n\n .@{calendar-picker-prefix-cls}-panel {\n border-radius: 0 0 @border-radius-base @border-radius-base;\n }\n\n .@{calendar-picker-prefix-cls}-content {\n height: 256px;\n\n th {\n height: auto;\n padding: 0;\n line-height: 18px;\n }\n }\n\n .@{calendar-picker-prefix-cls}-cell::before {\n pointer-events: none;\n }\n }\n\n // ========================== Full ==========================\n &-full {\n .@{calendar-picker-prefix-cls}-panel {\n display: block;\n width: 100%;\n text-align: right;\n background: @calendar-full-bg;\n border: 0;\n\n .@{calendar-picker-prefix-cls}-body {\n th,\n td {\n padding: 0;\n }\n\n th {\n height: auto;\n padding: 0 12px 5px 0;\n line-height: 18px;\n }\n }\n\n // Cell\n .@{calendar-picker-prefix-cls}-cell {\n &::before {\n display: none;\n }\n\n &:hover {\n .@{calendar-prefix-cls}-date {\n background: @item-hover-bg;\n }\n }\n\n .@{calendar-prefix-cls}-date-today::before {\n display: none;\n }\n\n &-selected,\n &-selected:hover {\n .@{calendar-prefix-cls}-date,\n .@{calendar-prefix-cls}-date-today {\n background: @calendar-item-active-bg;\n\n .@{calendar-prefix-cls}-date-value {\n color: @primary-color;\n }\n }\n }\n }\n\n // Cell date\n .@{calendar-prefix-cls}-date {\n display: block;\n width: auto;\n height: auto;\n margin: 0 (@padding-xs / 2);\n padding: (@padding-xs / 2) @padding-xs 0;\n border: 0;\n border-top: 2px solid @border-color-split;\n border-radius: 0;\n transition: background 0.3s;\n\n &-value {\n line-height: 24px;\n transition: color 0.3s;\n }\n\n &-content {\n position: static;\n width: auto;\n height: 86px;\n overflow-y: auto;\n color: @text-color;\n line-height: @line-height-base;\n text-align: left;\n }\n\n &-today {\n border-color: @primary-color;\n\n .@{calendar-prefix-cls}-date-value {\n color: @text-color;\n }\n }\n }\n }\n }\n}\n\n@media only screen and (max-width: @screen-xs) {\n .@{calendar-prefix-cls} {\n &-header {\n display: block;\n\n .@{calendar-prefix-cls}-year-select {\n width: 50%;\n }\n\n .@{calendar-prefix-cls}-month-select {\n width: ~'calc(50% - @{padding-xs})';\n }\n\n .@{calendar-prefix-cls}-mode-switch {\n width: 100%;\n margin-top: @padding-xs;\n margin-left: 0;\n\n > label {\n width: 50%;\n text-align: center;\n }\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{calendar-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-header {\n .@{calendar-prefix-cls}-month-select {\n .@{calendar-prefix-cls}-rtl & {\n margin-right: @padding-xs;\n margin-left: 0;\n }\n }\n\n .@{calendar-prefix-cls}-mode-switch {\n .@{calendar-prefix-cls}-rtl & {\n margin-right: @padding-xs;\n margin-left: 0;\n }\n }\n }\n\n // ========================== Full ==========================\n &-full {\n .@{calendar-picker-prefix-cls}-panel {\n .@{calendar-prefix-cls}-rtl& {\n text-align: left;\n }\n\n .@{calendar-picker-prefix-cls}-body {\n th {\n .@{calendar-prefix-cls}-rtl& {\n padding: 0 0 5px 12px;\n }\n }\n }\n\n .@{calendar-prefix-cls}-date {\n &-content {\n .@{calendar-prefix-cls}-rtl& {\n text-align: right;\n }\n }\n }\n }\n }\n}\n","@import '../../input/style/mixin';\n\n@picker-prefix-cls: ~'@{ant-prefix}-picker';\n\n.picker-status-color(\n @text-color: @input-color;\n @border-color: @input-border-color;\n @background-color: @input-bg;\n @hoverBorderColor: @primary-color-hover;\n @outlineColor: @primary-color-outline;\n) {\n &.@{picker-prefix-cls} {\n &,\n &:not([disabled]):hover {\n background-color: @background-color;\n border-color: @border-color;\n }\n\n &-focused,\n &:focus {\n .active(@text-color, @hoverBorderColor, @outlineColor);\n }\n\n .@{picker-prefix-cls}-active-bar {\n background: @hoverBorderColor;\n }\n }\n}\n\n.@{picker-prefix-cls} {\n &-status-error {\n .picker-status-color(@error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n }\n\n &-status-warning {\n .picker-status-color(@warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import './status';\n\n@picker-prefix-cls: ~'@{ant-prefix}-picker';\n\n.picker-padding(@input-height, @font-size, @padding-horizontal) {\n // font height probably 22.0001, So use floor better\n @font-height: floor(@font-size * @line-height-base) + 2;\n @padding-top: max(((@input-height - @font-height) / 2), 0);\n @padding-bottom: max(@input-height - @font-height - @padding-top, 0);\n padding: @padding-top @padding-horizontal @padding-bottom;\n}\n\n.@{picker-prefix-cls} {\n @arrow-size: @popover-arrow-width;\n\n .reset-component();\n .picker-padding(@input-height-base, @font-size-base, @input-padding-horizontal-base);\n position: relative;\n display: inline-flex;\n align-items: center;\n background: @picker-bg;\n border: @border-width-base @border-style-base @select-border-color;\n border-radius: @control-border-radius;\n transition: border @animation-duration-slow, box-shadow @animation-duration-slow;\n\n &:hover,\n &-focused {\n .hover();\n }\n\n &-focused {\n .active();\n }\n\n &&-disabled {\n background: @input-disabled-bg;\n border-color: @select-border-color;\n cursor: not-allowed;\n }\n\n &&-disabled &-suffix {\n color: @disabled-color;\n }\n\n &&-borderless {\n background-color: transparent !important;\n border-color: transparent !important;\n box-shadow: none !important;\n }\n\n // ======================== Input =========================\n &-input {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n\n > input {\n .input();\n flex: auto;\n\n // Fix Firefox flex not correct:\n // https://github.com/ant-design/ant-design/pull/20023#issuecomment-564389553\n min-width: 1px;\n height: auto;\n padding: 0;\n background: transparent;\n\n border: 0;\n\n &:focus {\n box-shadow: none;\n }\n\n &[disabled] {\n background: transparent;\n }\n }\n\n &:hover {\n .@{picker-prefix-cls}-clear {\n opacity: 1;\n }\n }\n\n &-placeholder {\n > input {\n color: @input-placeholder-color;\n }\n }\n }\n\n // Size\n &-large {\n .picker-padding(@input-height-lg, @font-size-lg, @input-padding-horizontal-lg);\n\n .@{picker-prefix-cls}-input > input {\n font-size: @font-size-lg;\n }\n }\n\n &-small {\n .picker-padding(@input-height-sm, @font-size-base, @input-padding-horizontal-sm);\n }\n\n &-suffix {\n display: flex;\n flex: none;\n align-self: center;\n margin-left: (@padding-xs / 2);\n color: @disabled-color;\n line-height: 1;\n pointer-events: none;\n\n > * {\n vertical-align: top;\n\n &:not(:last-child) {\n margin-right: 8px;\n }\n }\n }\n\n &-clear {\n position: absolute;\n top: 50%;\n right: 0;\n color: @disabled-color;\n line-height: 1;\n background: @component-background;\n transform: translateY(-50%);\n cursor: pointer;\n opacity: 0;\n transition: opacity @animation-duration-slow, color @animation-duration-slow;\n\n > * {\n vertical-align: top;\n }\n\n &:hover {\n color: @text-color-secondary;\n }\n }\n\n &-separator {\n position: relative;\n display: inline-block;\n width: 1em;\n height: @font-size-lg;\n color: @disabled-color;\n font-size: @font-size-lg;\n vertical-align: top;\n cursor: default;\n\n .@{picker-prefix-cls}-focused & {\n color: @text-color-secondary;\n }\n\n .@{picker-prefix-cls}-range-separator & {\n .@{picker-prefix-cls}-disabled & {\n cursor: not-allowed;\n }\n }\n }\n\n // ======================== Range =========================\n &-range {\n position: relative;\n display: inline-flex;\n\n // Clear\n .@{picker-prefix-cls}-clear {\n right: @input-padding-horizontal-base;\n }\n\n &:hover {\n .@{picker-prefix-cls}-clear {\n opacity: 1;\n }\n }\n\n // Active bar\n .@{picker-prefix-cls}-active-bar {\n bottom: -@border-width-base;\n height: 2px;\n margin-left: @input-padding-horizontal-base;\n background: @primary-color;\n opacity: 0;\n transition: all @animation-duration-slow ease-out;\n pointer-events: none;\n }\n\n &.@{picker-prefix-cls}-focused {\n .@{picker-prefix-cls}-active-bar {\n opacity: 1;\n }\n }\n\n &-separator {\n align-items: center;\n padding: 0 @padding-xs;\n line-height: 1;\n }\n\n &.@{picker-prefix-cls}-small {\n .@{picker-prefix-cls}-clear {\n right: @input-padding-horizontal-sm;\n }\n\n .@{picker-prefix-cls}-active-bar {\n margin-left: @input-padding-horizontal-sm;\n }\n }\n }\n\n // ======================= Dropdown =======================\n &-dropdown {\n .reset-component();\n position: absolute;\n // Fix incorrect position of picker popup\n // https://github.com/ant-design/ant-design/issues/35590\n top: -9999px;\n left: -9999px;\n z-index: @zindex-picker;\n\n &-hidden {\n display: none;\n }\n\n &-placement-bottomLeft {\n .@{picker-prefix-cls}-range-arrow {\n top: (@arrow-size / 2) - (@arrow-size / 3) + 0.7px;\n display: block;\n transform: rotate(-135deg) translateY(1px);\n }\n }\n\n &-placement-topLeft {\n .@{picker-prefix-cls}-range-arrow {\n bottom: (@arrow-size / 2) - (@arrow-size / 3) + 0.7px;\n display: block;\n transform: rotate(45deg);\n }\n }\n\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topRight,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topRight {\n animation-name: antSlideDownIn;\n }\n\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-bottomRight,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-bottomRight {\n animation-name: antSlideUpIn;\n }\n\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topLeft,\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topRight {\n animation-name: antSlideDownOut;\n }\n\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-bottomLeft,\n &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-bottomRight {\n animation-name: antSlideUpOut;\n }\n }\n\n &-dropdown-range {\n padding: (@arrow-size * 2 / 3) 0;\n\n &-hidden {\n display: none;\n }\n }\n\n // Time picker with additional style\n &-dropdown &-panel > &-time-panel {\n padding-top: (@padding-xs / 2);\n }\n\n // ======================== Ranges ========================\n &-ranges {\n margin-bottom: 0;\n padding: (@padding-xs / 2) @padding-sm;\n overflow: hidden;\n line-height: @picker-text-height - 2 * @border-width-base - (@padding-xs / 2);\n text-align: left;\n list-style: none;\n\n > li {\n display: inline-block;\n }\n\n // https://github.com/ant-design/ant-design/issues/23687\n .@{picker-prefix-cls}-preset > .@{ant-prefix}-tag-blue {\n color: @primary-color;\n background: @primary-1;\n border-color: @primary-3;\n cursor: pointer;\n }\n\n .@{picker-prefix-cls}-ok {\n float: right;\n margin-left: @padding-xs;\n }\n }\n\n &-range-wrapper {\n display: flex;\n }\n\n &-range-arrow {\n position: absolute;\n z-index: 1;\n display: none;\n width: @arrow-size;\n height: @arrow-size;\n margin-left: @input-padding-horizontal-base * 1.5;\n box-shadow: 2px 2px 6px -2px fade(@black, 10%); // use spread radius to hide shadow over popover\n transition: left @animation-duration-slow ease-out;\n .roundedArrow(@arrow-size, 5px, @calendar-bg);\n }\n\n &-panel-container {\n overflow: hidden;\n vertical-align: top;\n background: @calendar-bg;\n border-radius: @border-radius-base;\n box-shadow: @box-shadow-base;\n transition: margin @animation-duration-slow;\n\n .@{picker-prefix-cls}-panels {\n display: inline-flex;\n flex-wrap: nowrap;\n direction: ltr;\n }\n\n .@{picker-prefix-cls}-panel {\n vertical-align: top;\n background: transparent;\n border-width: 0 0 @border-width-base 0;\n border-radius: 0;\n\n .@{picker-prefix-cls}-content,\n table {\n text-align: center;\n }\n\n &-focused {\n border-color: @border-color-split;\n }\n }\n }\n}\n\n@import './panel';\n@import './rtl';\n\n@root-entry-name: default;","// Compatibility for browsers.\n\n// Placeholder text\n.placeholder(@color: @input-placeholder-color) {\n &::placeholder {\n color: @color;\n user-select: none; // https://github.com/ant-design/ant-design/pull/32639\n }\n\n &:placeholder-shown {\n text-overflow: ellipsis;\n }\n}\n","@picker-cell-inner-cls: ~'@{picker-prefix-cls}-cell-inner';\n\n.@{picker-prefix-cls} {\n @picker-arrow-size: 7px;\n @picker-year-month-cell-width: 60px;\n @picker-panel-width: @picker-panel-cell-width * 7 + @padding-sm * 2 + 4;\n\n &-panel {\n display: inline-flex;\n flex-direction: column;\n text-align: center;\n background: @calendar-bg;\n border: @border-width-base @border-style-base @picker-border-color;\n border-radius: @border-radius-base;\n outline: none;\n\n &-focused {\n border-color: @primary-color;\n }\n }\n\n // ========================================================\n // = Shared Panel =\n // ========================================================\n &-decade-panel,\n &-year-panel,\n &-quarter-panel,\n &-month-panel,\n &-week-panel,\n &-date-panel,\n &-time-panel {\n display: flex;\n flex-direction: column;\n width: @picker-panel-width;\n }\n\n // ======================= Header =======================\n &-header {\n display: flex;\n padding: 0 @padding-xs;\n color: @heading-color;\n border-bottom: @border-width-base @border-style-base @picker-border-color;\n\n > * {\n flex: none;\n }\n\n button {\n padding: 0;\n color: @disabled-color;\n line-height: @picker-text-height;\n background: transparent;\n border: 0;\n cursor: pointer;\n transition: color @animation-duration-slow;\n }\n\n > button {\n min-width: 1.6em;\n font-size: @font-size-base;\n\n &:hover {\n color: @text-color;\n }\n }\n\n &-view {\n flex: auto;\n font-weight: 500;\n line-height: @picker-text-height;\n\n button {\n color: inherit;\n font-weight: inherit;\n\n &:not(:first-child) {\n margin-left: @padding-xs;\n }\n\n &:hover {\n color: @primary-color;\n }\n }\n }\n }\n\n // Arrow button\n &-prev-icon,\n &-next-icon,\n &-super-prev-icon,\n &-super-next-icon {\n position: relative;\n display: inline-block;\n width: @picker-arrow-size;\n height: @picker-arrow-size;\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n display: inline-block;\n width: @picker-arrow-size;\n height: @picker-arrow-size;\n border: 0 solid currentcolor;\n border-width: 1.5px 0 0 1.5px;\n content: '';\n }\n }\n\n &-super-prev-icon,\n &-super-next-icon {\n &::after {\n position: absolute;\n top: ceil((@picker-arrow-size / 2));\n left: ceil((@picker-arrow-size / 2));\n display: inline-block;\n width: @picker-arrow-size;\n height: @picker-arrow-size;\n border: 0 solid currentcolor;\n border-width: 1.5px 0 0 1.5px;\n content: '';\n }\n }\n\n &-prev-icon,\n &-super-prev-icon {\n transform: rotate(-45deg);\n }\n\n &-next-icon,\n &-super-next-icon {\n transform: rotate(135deg);\n }\n\n // ======================== Body ========================\n &-content {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n\n th,\n td {\n position: relative;\n min-width: 24px;\n font-weight: 400;\n }\n\n th {\n height: 30px;\n color: @text-color;\n line-height: 30px;\n }\n }\n\n .picker-cell-inner(@cellClassName) {\n &::before {\n position: absolute;\n top: 50%;\n right: 0;\n left: 0;\n z-index: 1;\n height: @picker-panel-cell-height;\n transform: translateY(-50%);\n transition: all @animation-duration-slow;\n content: '';\n }\n\n // >>> Default\n .@{cellClassName} {\n position: relative;\n z-index: 2;\n display: inline-block;\n min-width: @picker-panel-cell-height;\n height: @picker-panel-cell-height;\n line-height: @picker-panel-cell-height;\n border-radius: @border-radius-base;\n transition: background @animation-duration-slow, border @animation-duration-slow;\n }\n\n // >>> Hover\n &:hover:not(&-in-view),\n &:hover:not(&-selected):not(&-range-start):not(&-range-end):not(&-range-hover-start):not(&-range-hover-end) {\n .@{cellClassName} {\n background: @picker-basic-cell-hover-color;\n }\n }\n\n // >>> Today\n &-in-view&-today .@{cellClassName} {\n &::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n border: @border-width-base @border-style-base @primary-color;\n border-radius: @border-radius-base;\n content: '';\n }\n }\n\n // >>> In Range\n &-in-view&-in-range {\n position: relative;\n\n &::before {\n background: @picker-basic-cell-active-with-range-color;\n }\n }\n\n // >>> Selected\n &-in-view&-selected .@{cellClassName},\n &-in-view&-range-start .@{cellClassName},\n &-in-view&-range-end .@{cellClassName} {\n color: @text-color-inverse;\n background: @primary-color;\n }\n\n &-in-view&-range-start:not(&-range-start-single),\n &-in-view&-range-end:not(&-range-end-single) {\n &::before {\n background: @picker-basic-cell-active-with-range-color;\n }\n }\n\n &-in-view&-range-start::before {\n left: 50%;\n }\n\n &-in-view&-range-end::before {\n right: 50%;\n }\n\n // >>> Range Hover\n &-in-view&-range-hover-start:not(&-in-range):not(&-range-start):not(&-range-end),\n &-in-view&-range-hover-end:not(&-in-range):not(&-range-start):not(&-range-end),\n &-in-view&-range-hover-start&-range-start-single,\n &-in-view&-range-hover-start&-range-start&-range-end&-range-end-near-hover,\n &-in-view&-range-hover-end&-range-start&-range-end&-range-start-near-hover,\n &-in-view&-range-hover-end&-range-end-single,\n &-in-view&-range-hover:not(&-in-range) {\n &::after {\n position: absolute;\n top: 50%;\n z-index: 0;\n height: 24px;\n border-top: @border-width-base dashed @picker-date-hover-range-border-color;\n border-bottom: @border-width-base dashed @picker-date-hover-range-border-color;\n transform: translateY(-50%);\n transition: all @animation-duration-slow;\n content: '';\n }\n }\n\n // Add space for stash\n &-range-hover-start::after,\n &-range-hover-end::after,\n &-range-hover::after {\n right: 0;\n left: 2px;\n }\n\n // Hover with in range\n &-in-view&-in-range&-range-hover::before,\n &-in-view&-range-start&-range-hover::before,\n &-in-view&-range-end&-range-hover::before,\n &-in-view&-range-start:not(&-range-start-single)&-range-hover-start::before,\n &-in-view&-range-end:not(&-range-end-single)&-range-hover-end::before,\n .@{picker-prefix-cls}-panel\n > :not(.@{picker-prefix-cls}-date-panel)\n &-in-view&-in-range&-range-hover-start::before,\n .@{picker-prefix-cls}-panel\n > :not(.@{picker-prefix-cls}-date-panel)\n &-in-view&-in-range&-range-hover-end::before {\n background: @picker-date-hover-range-color;\n }\n\n // range start border-radius\n &-in-view&-range-start:not(&-range-start-single):not(&-range-end) .@{cellClassName} {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n\n // range end border-radius\n &-in-view&-range-end:not(&-range-end-single):not(&-range-start) .@{cellClassName} {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n\n // DatePanel only\n .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-start .@{cellClassName},\n .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName} {\n &::after {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: -1;\n background: @picker-date-hover-range-color;\n transition: all @animation-duration-slow;\n content: '';\n }\n }\n\n .@{picker-prefix-cls}-date-panel\n &-in-view&-in-range&-range-hover-start\n .@{cellClassName}::after {\n right: -5px - @border-width-base;\n left: 0;\n }\n\n .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName}::after {\n right: 0;\n left: -5px - @border-width-base;\n }\n\n // Hover with range start & end\n &-range-hover&-range-start::after {\n right: 50%;\n }\n\n &-range-hover&-range-end::after {\n left: 50%;\n }\n\n // Edge start\n tr > &-in-view&-range-hover:first-child::after,\n tr > &-in-view&-range-hover-end:first-child::after,\n &-in-view&-start&-range-hover-edge-start&-range-hover-edge-start-near-range::after,\n &-in-view&-range-hover-edge-start:not(&-range-hover-edge-start-near-range)::after,\n &-in-view&-range-hover-start::after {\n left: 6px;\n border-left: @border-width-base dashed @picker-date-hover-range-border-color;\n border-top-left-radius: @border-radius-base;\n border-bottom-left-radius: @border-radius-base;\n }\n\n // Edge end\n tr > &-in-view&-range-hover:last-child::after,\n tr > &-in-view&-range-hover-start:last-child::after,\n &-in-view&-end&-range-hover-edge-end&-range-hover-edge-end-near-range::after,\n &-in-view&-range-hover-edge-end:not(&-range-hover-edge-end-near-range)::after,\n &-in-view&-range-hover-end::after {\n right: 6px;\n border-right: @border-width-base dashed @picker-date-hover-range-border-color;\n border-top-right-radius: @border-radius-base;\n border-bottom-right-radius: @border-radius-base;\n }\n\n // >>> Disabled\n &-disabled {\n color: @disabled-color;\n pointer-events: none;\n\n .@{cellClassName} {\n background: transparent;\n }\n\n &::before {\n background: @picker-basic-cell-disabled-bg;\n }\n }\n &-disabled&-today .@{cellClassName}::before {\n border-color: @disabled-color;\n }\n }\n\n &-cell {\n padding: 3px 0;\n color: @disabled-color;\n cursor: pointer;\n\n // In view\n &-in-view {\n color: @text-color;\n }\n\n .picker-cell-inner(~'@{picker-cell-inner-cls}');\n }\n\n &-decade-panel,\n &-year-panel,\n &-quarter-panel,\n &-month-panel {\n .@{picker-prefix-cls}-content {\n height: @picker-panel-without-time-cell-height * 4;\n }\n\n .@{picker-cell-inner-cls} {\n padding: 0 @padding-xs;\n }\n }\n\n &-quarter-panel {\n .@{picker-prefix-cls}-content {\n height: 56px;\n }\n }\n\n // ======================== Footer ========================\n &-footer {\n width: min-content;\n min-width: 100%;\n line-height: @picker-text-height - 2 * @border-width-base;\n text-align: center;\n border-bottom: @border-width-base @border-style-base transparent;\n\n .@{picker-prefix-cls}-panel & {\n border-top: @border-width-base @border-style-base @picker-border-color;\n }\n\n &-extra {\n padding: 0 @padding-sm;\n line-height: @picker-text-height - 2 * @border-width-base;\n text-align: left;\n\n &:not(:last-child) {\n border-bottom: @border-width-base @border-style-base @picker-border-color;\n }\n }\n }\n\n &-now {\n text-align: left;\n }\n\n &-today-btn {\n color: @link-color;\n\n &:hover {\n color: @link-hover-color;\n }\n\n &:active {\n color: @link-active-color;\n }\n\n &&-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n }\n }\n\n // ========================================================\n // = Special =\n // ========================================================\n\n // ===================== Decade Panel =====================\n &-decade-panel {\n .@{picker-cell-inner-cls} {\n padding: 0 (@padding-xs / 2);\n }\n\n .@{picker-prefix-cls}-cell::before {\n display: none;\n }\n }\n\n // ============= Year & Quarter & Month Panel =============\n &-year-panel,\n &-quarter-panel,\n &-month-panel {\n @hover-cell-fixed-distance: (\n (((@picker-panel-width - @padding-xs * 2) / 3) - @picker-year-month-cell-width) / 2\n );\n\n .@{picker-prefix-cls}-body {\n padding: 0 @padding-xs;\n }\n\n .@{picker-cell-inner-cls} {\n width: @picker-year-month-cell-width;\n }\n\n .@{picker-prefix-cls}-cell-range-hover-start::after {\n left: @hover-cell-fixed-distance;\n border-left: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n\n .@{picker-prefix-cls}-panel-rtl & {\n right: @hover-cell-fixed-distance;\n border-right: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n .@{picker-prefix-cls}-cell-range-hover-end::after {\n right: @hover-cell-fixed-distance;\n border-right: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n\n .@{picker-prefix-cls}-panel-rtl & {\n left: @hover-cell-fixed-distance;\n border-left: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n }\n\n // ====================== Week Panel ======================\n &-week-panel {\n .@{picker-prefix-cls}-body {\n padding: @padding-xs @padding-sm;\n }\n\n // Clear cell style\n .@{picker-prefix-cls}-cell {\n &:hover .@{picker-cell-inner-cls},\n &-selected .@{picker-cell-inner-cls},\n .@{picker-cell-inner-cls} {\n background: transparent !important;\n }\n }\n\n &-row {\n td {\n transition: background @animation-duration-slow;\n }\n\n &:hover td {\n background: @picker-basic-cell-hover-color;\n }\n\n &-selected td,\n &-selected:hover td {\n background: @primary-color;\n\n &.@{picker-prefix-cls}-cell-week {\n color: fade(@text-color-inverse, 50%);\n }\n\n &.@{picker-prefix-cls}-cell-today .@{picker-cell-inner-cls}::before {\n border-color: @text-color-inverse;\n }\n\n .@{picker-cell-inner-cls} {\n color: @text-color-inverse;\n }\n }\n }\n }\n\n // ====================== Date Panel ======================\n &-date-panel {\n .@{picker-prefix-cls}-body {\n padding: @padding-xs @padding-sm;\n }\n\n .@{picker-prefix-cls}-content {\n width: @picker-panel-cell-width * 7;\n\n th {\n width: @picker-panel-cell-width;\n }\n }\n }\n\n // ==================== Datetime Panel ====================\n &-datetime-panel {\n display: flex;\n\n .@{picker-prefix-cls}-time-panel {\n border-left: @border-width-base @border-style-base @picker-border-color;\n }\n\n .@{picker-prefix-cls}-date-panel,\n .@{picker-prefix-cls}-time-panel {\n transition: opacity @animation-duration-slow;\n }\n\n // Keyboard\n &-active {\n .@{picker-prefix-cls}-date-panel,\n .@{picker-prefix-cls}-time-panel {\n opacity: 0.3;\n\n &-active {\n opacity: 1;\n }\n }\n }\n }\n\n // ====================== Time Panel ======================\n &-time-panel {\n width: auto;\n min-width: auto;\n\n .@{picker-prefix-cls}-content {\n display: flex;\n flex: auto;\n height: @picker-time-panel-column-height;\n }\n\n &-column {\n flex: 1 0 auto;\n width: @picker-time-panel-column-width;\n margin: 0;\n padding: 0;\n overflow-y: hidden;\n text-align: left;\n list-style: none;\n transition: background @animation-duration-slow;\n\n &::after {\n display: block;\n height: @picker-time-panel-column-height - @picker-time-panel-cell-height;\n content: '';\n .@{picker-prefix-cls}-datetime-panel & {\n height: @picker-time-panel-column-height - @picker-time-panel-cell-height + 2 *\n @border-width-base;\n }\n }\n\n &:not(:first-child) {\n border-left: @border-width-base @border-style-base @picker-border-color;\n }\n\n &-active {\n background: @calendar-column-active-bg;\n }\n\n &:hover {\n overflow-y: auto;\n }\n\n > li {\n margin: 0;\n padding: 0;\n\n &.@{picker-prefix-cls}-time-panel-cell {\n .@{picker-prefix-cls}-time-panel-cell-inner {\n display: block;\n width: 100%;\n height: @picker-time-panel-cell-height;\n margin: 0;\n padding: 0 0 0 ((@picker-time-panel-column-width - 28px) / 2);\n color: @text-color;\n line-height: @picker-time-panel-cell-height;\n border-radius: 0;\n cursor: pointer;\n transition: background @animation-duration-slow;\n\n &:hover {\n background: @item-hover-bg;\n }\n }\n\n &-selected {\n .@{picker-prefix-cls}-time-panel-cell-inner {\n background: @calendar-item-active-bg;\n }\n }\n\n &-disabled {\n .@{picker-prefix-cls}-time-panel-cell-inner {\n color: @disabled-color;\n background: transparent;\n cursor: not-allowed;\n }\n }\n }\n }\n }\n }\n}\n\n// Fix IE11 render bug by css hacks\n// https://github.com/ant-design/ant-design/issues/21559\n// https://codepen.io/afc163-1472555193/pen/mdJRaNj?editors=0110\n/* stylelint-disable selector-type-no-unknown,selector-no-vendor-prefix */\n_:-ms-fullscreen,\n:root {\n .@{picker-prefix-cls}-range-wrapper {\n .@{picker-prefix-cls}-month-panel .@{picker-prefix-cls}-cell,\n .@{picker-prefix-cls}-year-panel .@{picker-prefix-cls}-cell {\n padding: 21px 0;\n }\n }\n}\n",".@{picker-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-suffix {\n .@{picker-prefix-cls}-rtl & {\n margin-right: (@padding-xs / 2);\n margin-left: 0;\n }\n }\n\n &-clear {\n .@{picker-prefix-cls}-rtl & {\n right: auto;\n left: 0;\n }\n }\n\n &-separator {\n .@{picker-prefix-cls}-rtl & {\n transform: rotate(180deg);\n }\n }\n\n &-header {\n &-view {\n button {\n &:not(:first-child) {\n .@{picker-prefix-cls}-panel-rtl & {\n margin-right: @padding-xs;\n margin-left: 0;\n }\n }\n }\n }\n }\n\n // ======================== Range =========================\n &-range {\n // Clear\n .@{picker-prefix-cls}-clear {\n .@{picker-prefix-cls}-rtl& {\n right: auto;\n left: @input-padding-horizontal-base;\n }\n }\n\n // Active bar\n .@{picker-prefix-cls}-active-bar {\n .@{picker-prefix-cls}-rtl& {\n margin-right: @input-padding-horizontal-base;\n margin-left: 0;\n }\n }\n\n &.@{picker-prefix-cls}-small {\n .@{picker-prefix-cls}-active-bar {\n .@{picker-prefix-cls}-rtl& {\n margin-right: @input-padding-horizontal-sm;\n }\n }\n }\n }\n\n // ======================== Ranges ========================\n &-ranges {\n .@{picker-prefix-cls}-dropdown-rtl & {\n text-align: right;\n }\n\n .@{picker-prefix-cls}-ok {\n .@{picker-prefix-cls}-dropdown-rtl & {\n float: left;\n margin-right: @padding-xs;\n margin-left: 0;\n }\n }\n }\n\n // ======================== Panel ========================\n &-panel {\n &-rtl {\n direction: rtl;\n }\n }\n\n &-prev-icon,\n &-super-prev-icon {\n .@{picker-prefix-cls}-panel-rtl & {\n transform: rotate(135deg);\n }\n }\n\n &-next-icon,\n &-super-next-icon {\n .@{picker-prefix-cls}-panel-rtl & {\n transform: rotate(-45deg);\n }\n }\n\n &-cell {\n .picker-cell-inner(~'@{picker-cell-inner-cls}');\n }\n\n // ======================== Body ==========================\n .picker-cell-inner(@cellClassName) {\n .@{cellClassName} {\n position: relative;\n z-index: 2;\n display: inline-block;\n min-width: @picker-panel-cell-height;\n height: @picker-panel-cell-height;\n line-height: @picker-panel-cell-height;\n border-radius: @border-radius-base;\n transition: background @animation-duration-slow, border @animation-duration-slow;\n }\n\n &-in-view&-range-start::before {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 50%;\n left: 0;\n }\n }\n\n &-in-view&-range-end::before {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 0;\n left: 50%;\n }\n }\n\n &-in-view&-range-start&-range-end::before {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 50%;\n left: 50%;\n }\n }\n\n .@{picker-prefix-cls}-date-panel\n &-in-view&-in-range&-range-hover-start\n .@{cellClassName}::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 0;\n left: -5px - @border-width-base;\n }\n }\n\n .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName}::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: -5px - @border-width-base;\n left: 0;\n }\n }\n\n // Hover with range start & end\n &-range-hover&-range-start::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 0;\n left: 50%;\n }\n }\n\n &-range-hover&-range-end::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 50%;\n left: 0;\n }\n }\n\n // range start border-radius\n &-in-view&-range-start:not(&-range-start-single):not(&-range-end) .@{cellClassName} {\n .@{picker-prefix-cls}-panel-rtl & {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n\n // range end border-radius\n &-in-view&-range-end:not(&-range-end-single):not(&-range-start) .@{cellClassName} {\n .@{picker-prefix-cls}-panel-rtl & {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n // Edge start\n tr > &-in-view&-range-hover:not(&-selected):first-child::after,\n &-in-view&-start&-range-hover-edge-start&-range-hover-edge-start-near-range::after,\n &-in-view&-range-hover-edge-start:not(&-range-hover-edge-start-near-range)::after,\n &-in-view&-range-hover-start::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 6px;\n left: 0;\n border-right: @border-width-base dashed @picker-date-hover-range-border-color;\n border-left: none;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n\n // Edge end\n tr > &-in-view&-range-hover:not(&-selected):last-child::after,\n &-in-view&-end&-range-hover-edge-end&-range-hover-edge-end-near-range::after,\n &-in-view&-range-hover-edge-end:not(&-range-hover-edge-end-near-range)::after,\n &-in-view&-range-hover-end::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 0;\n left: 6px;\n border-right: none;\n border-left: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n tr > &-in-view&-range-hover-start:last-child::after,\n tr > &-in-view&-range-hover-end:first-child::after,\n &-in-view&-start&-range-hover-edge-start:not(&-range-hover)::after,\n &-in-view&-start&-range-hover-end&-range-hover-edge-start:not(&-range-hover)::after,\n &-in-view&-end&-range-hover-start&-range-hover-edge-end:not(&-range-hover)::after,\n tr > &-in-view&-start&-range-hover&-range-hover-edge-start:last-child::after,\n tr > &-in-view&-end&-range-hover&-range-hover-edge-end:first-child::after {\n .@{picker-prefix-cls}-panel-rtl & {\n right: 6px;\n left: 6px;\n border-right: @border-width-base dashed @picker-date-hover-range-border-color;\n border-left: @border-width-base dashed @picker-date-hover-range-border-color;\n border-radius: @border-radius-base;\n }\n }\n }\n\n // ======================== Footer ========================\n &-footer {\n &-extra {\n .@{picker-prefix-cls}-dropdown-rtl & {\n direction: rtl;\n text-align: right;\n }\n }\n }\n\n // ====================== Time Panel ======================\n &-time-panel {\n .@{picker-prefix-cls}-panel-rtl & {\n direction: ltr;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tag-prefix-cls: ~'@{ant-prefix}-tag';\n\n.@{tag-prefix-cls} {\n .reset-component();\n\n display: inline-block;\n height: auto;\n margin-right: 8px;\n padding: 0 7px;\n font-size: @tag-font-size;\n line-height: @tag-line-height;\n white-space: nowrap;\n background: @tag-default-bg;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @tag-border-radius;\n opacity: 1;\n transition: all 0.3s;\n\n &,\n a,\n a:hover {\n color: @tag-default-color;\n }\n\n > a:first-child:last-child {\n display: inline-block;\n margin: 0 -8px;\n padding: 0 8px;\n }\n\n &-close-icon {\n margin-left: 3px;\n color: @text-color-secondary;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n color: @heading-color;\n }\n }\n\n &-has-color {\n border-color: transparent;\n &,\n a,\n a:hover,\n .@{iconfont-css-prefix}-close,\n .@{iconfont-css-prefix}-close:hover {\n color: @text-color-inverse;\n }\n }\n\n &-checkable {\n background-color: transparent;\n border-color: transparent;\n cursor: pointer;\n\n &:not(&-checked):hover {\n color: @primary-color;\n }\n\n &:active,\n &-checked {\n color: @text-color-inverse;\n }\n\n &-checked {\n background-color: @primary-6;\n }\n\n &:active {\n background-color: @primary-7;\n }\n }\n\n &-hidden {\n display: none;\n }\n\n // mixin to iterate over colors and create CSS class for each one\n .make-color-classes(@i: length(@preset-colors)) when (@i > 0) {\n .make-color-classes(@i - 1);\n @color: extract(@preset-colors, @i);\n @lightColor: '@{color}-1';\n @lightBorderColor: '@{color}-3';\n @darkColor: '@{color}-6';\n @textColor: '@{color}-7';\n &-@{color} {\n color: @@textColor;\n background: @@lightColor;\n border-color: @@lightBorderColor;\n }\n &-@{color}-inverse {\n color: @text-color-inverse;\n background: @@darkColor;\n border-color: @@darkColor;\n }\n }\n\n .make-status-color-classes(@status, @cssVariableType) {\n @bgColor: '@{cssVariableType}-color-deprecated-bg';\n @borderColor: '@{cssVariableType}-color-deprecated-border';\n @textColor: '@{cssVariableType}-color';\n &-@{status} {\n color: @@textColor;\n background: @@bgColor;\n border-color: @@borderColor;\n }\n }\n\n .make-color-classes();\n\n .make-status-color-classes(success, success);\n .make-status-color-classes(processing, info);\n .make-status-color-classes(error, error);\n .make-status-color-classes(warning, warning);\n\n // To ensure that a space will be placed between character and `Icon`.\n > .@{iconfont-css-prefix} + span,\n > span + .@{iconfont-css-prefix} {\n margin-left: 7px;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tag-prefix-cls: ~'@{ant-prefix}-tag';\n\n.@{tag-prefix-cls} {\n &&-rtl {\n margin-right: 0;\n margin-left: 8px;\n direction: rtl;\n text-align: right;\n }\n\n &-close-icon {\n .@{tag-prefix-cls}-rtl & {\n margin-right: 3px;\n margin-left: 0;\n }\n }\n\n > .@{iconfont-css-prefix} + span,\n > span + .@{iconfont-css-prefix} {\n .@{tag-prefix-cls}-rtl& {\n margin-right: 7px;\n margin-left: 0;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@radio-prefix-cls: ~'@{ant-prefix}-radio';\n@radio-group-prefix-cls: ~'@{radio-prefix-cls}-group';\n@radio-inner-prefix-cls: ~'@{radio-prefix-cls}-inner';\n@radio-duration: 0.3s;\n@radio-focus-shadow: 0 0 0 3px @slider-handle-color-focus-shadow;\n@radio-button-focus-shadow: @radio-focus-shadow;\n\n.@{radio-group-prefix-cls} {\n .reset-component();\n\n display: inline-block;\n font-size: 0;\n\n .@{ant-prefix}-badge-count {\n z-index: 1;\n }\n\n > .@{ant-prefix}-badge:not(:first-child) > .@{radio-prefix-cls}-button-wrapper {\n border-left: none;\n }\n}\n\n// 一般状态\n.@{radio-prefix-cls}-wrapper {\n .reset-component();\n position: relative;\n display: inline-flex;\n align-items: baseline;\n margin-right: @radio-wrapper-margin-right;\n cursor: pointer;\n\n &-disabled {\n cursor: not-allowed;\n }\n\n &::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n }\n\n &&-in-form-item {\n input[type='radio'] {\n width: 14px;\n height: 14px;\n }\n }\n}\n\n.@{radio-prefix-cls} {\n .reset-component();\n\n position: relative;\n top: @radio-top;\n display: inline-block;\n outline: none;\n cursor: pointer;\n\n .@{radio-prefix-cls}-wrapper:hover &,\n &:hover .@{radio-inner-prefix-cls},\n &-input:focus + .@{radio-inner-prefix-cls} {\n border-color: @radio-dot-color;\n }\n\n &-input:focus + .@{radio-inner-prefix-cls} {\n box-shadow: @radio-focus-shadow;\n }\n\n &-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid @radio-dot-color;\n border-radius: 50%;\n visibility: hidden;\n animation: antRadioEffect 0.36s ease-in-out;\n animation-fill-mode: both;\n content: '';\n }\n\n &:hover::after,\n .@{radio-prefix-cls}-wrapper:hover &::after {\n visibility: visible;\n }\n\n &-inner {\n &::after {\n position: absolute;\n top: 50%;\n left: 50%;\n display: block;\n width: @radio-size;\n height: @radio-size;\n margin-top: -(@radio-size / 2);\n margin-left: -(@radio-size / 2);\n background-color: @radio-dot-color;\n border-top: 0;\n border-left: 0;\n border-radius: @radio-size;\n transform: scale(0);\n opacity: 0;\n transition: all @radio-duration @ease-in-out-circ;\n content: ' ';\n }\n\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: @radio-size;\n height: @radio-size;\n background-color: @radio-button-bg;\n border-color: @border-color-base;\n border-style: solid;\n border-width: @radio-border-width;\n border-radius: 50%;\n transition: all @radio-duration;\n }\n\n &-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n cursor: pointer;\n opacity: 0;\n }\n\n &&-disabled {\n .@{radio-inner-prefix-cls} {\n border-color: @border-color-base;\n }\n }\n}\n\n// 选中状态\n.@{radio-prefix-cls}-checked {\n .@{radio-inner-prefix-cls} {\n border-color: @radio-dot-color;\n\n &::after {\n transform: scale((unit(@radio-dot-size) / unit(@radio-size)));\n opacity: 1;\n transition: all @radio-duration @ease-in-out-circ;\n }\n }\n}\n\n.@{radio-prefix-cls}-disabled {\n cursor: not-allowed;\n\n .@{radio-inner-prefix-cls} {\n background-color: @input-disabled-bg;\n cursor: not-allowed;\n\n &::after {\n background-color: @radio-dot-disabled-color;\n }\n }\n\n .@{radio-prefix-cls}-input {\n cursor: not-allowed;\n }\n\n & + span {\n color: @disabled-color;\n cursor: not-allowed;\n }\n}\n\nspan.@{radio-prefix-cls} + * {\n padding-right: 8px;\n padding-left: 8px;\n}\n\n.@{radio-prefix-cls}-button-wrapper {\n position: relative;\n display: inline-block;\n height: @btn-height-base;\n margin: 0;\n padding: 0 @radio-button-padding-horizontal;\n color: @radio-button-color;\n font-size: @font-size-base;\n line-height: @btn-height-base - 2px;\n background: @radio-button-bg;\n border: @border-width-base @border-style-base @border-color-base;\n // strange align fix for chrome but works\n // https://gw.alipayobjects.com/zos/rmsportal/VFTfKXJuogBAXcvfAUWJ.gif\n border-top-width: @border-width-base + 0.02px;\n border-left-width: 0;\n cursor: pointer;\n transition: color 0.3s, background 0.3s, border-color 0.3s, box-shadow 0.3s;\n\n a {\n color: @radio-button-color;\n }\n\n > .@{radio-prefix-cls}-button {\n position: absolute;\n top: 0;\n left: 0;\n z-index: -1;\n width: 100%;\n height: 100%;\n }\n\n .@{radio-group-prefix-cls}-large & {\n height: @input-height-lg;\n font-size: @font-size-lg;\n line-height: @input-height-lg - 2px;\n }\n\n .@{radio-group-prefix-cls}-small & {\n height: @input-height-sm;\n padding: 0 @control-padding-horizontal-sm - 1px;\n line-height: @input-height-sm - 2px;\n }\n\n &:not(:first-child) {\n &::before {\n position: absolute;\n top: @border-width-base * -1;\n left: -1px;\n display: block;\n box-sizing: content-box;\n width: 1px;\n height: 100%;\n padding: @border-width-base 0;\n background-color: @border-color-base;\n transition: background-color 0.3s;\n content: '';\n }\n }\n\n &:first-child {\n border-left: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n\n &:last-child {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n\n &:first-child:last-child {\n border-radius: @border-radius-base;\n }\n\n &:hover {\n position: relative;\n color: @radio-dot-color;\n }\n\n &:focus-within {\n box-shadow: @radio-button-focus-shadow;\n }\n\n .@{radio-prefix-cls}-inner,\n input[type='checkbox'],\n input[type='radio'] {\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n &-checked:not(&-disabled) {\n z-index: 1;\n color: @radio-dot-color;\n background: @radio-button-checked-bg;\n border-color: @radio-dot-color;\n\n &::before {\n background-color: @radio-dot-color;\n }\n\n &:first-child {\n border-color: @radio-dot-color;\n }\n\n &:hover {\n color: @radio-button-hover-color;\n border-color: @radio-button-hover-color;\n\n &::before {\n background-color: @radio-button-hover-color;\n }\n }\n\n &:active {\n color: @radio-button-active-color;\n border-color: @radio-button-active-color;\n\n &::before {\n background-color: @radio-button-active-color;\n }\n }\n\n &:focus-within {\n box-shadow: @radio-button-focus-shadow;\n }\n }\n\n .@{radio-group-prefix-cls}-solid &-checked:not(&-disabled) {\n color: @radio-solid-checked-color;\n background: @radio-dot-color;\n border-color: @radio-dot-color;\n\n &:hover {\n color: @radio-solid-checked-color;\n background: @radio-button-hover-color;\n border-color: @radio-button-hover-color;\n }\n\n &:active {\n color: @radio-solid-checked-color;\n background: @radio-button-active-color;\n border-color: @radio-button-active-color;\n }\n\n &:focus-within {\n box-shadow: @radio-button-focus-shadow;\n }\n }\n\n &-disabled {\n color: @disabled-color;\n background-color: @input-disabled-bg;\n border-color: @border-color-base;\n cursor: not-allowed;\n\n &:first-child,\n &:hover {\n color: @disabled-color;\n background-color: @input-disabled-bg;\n border-color: @border-color-base;\n }\n\n &:first-child {\n border-left-color: @border-color-base;\n }\n }\n\n &-disabled&-checked {\n color: @radio-disabled-button-checked-color;\n background-color: @radio-disabled-button-checked-bg;\n border-color: @border-color-base;\n box-shadow: none;\n }\n}\n\n@keyframes antRadioEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@radio-prefix-cls: ~'@{ant-prefix}-radio';\n@radio-group-prefix-cls: ~'@{radio-prefix-cls}-group';\n@radio-prefix-cls-button-wrapper: ~'@{radio-prefix-cls}-button-wrapper';\n\n.@{radio-group-prefix-cls} {\n &&-rtl {\n direction: rtl;\n }\n}\n\n// 一般状态\n.@{radio-prefix-cls}-wrapper {\n &&-rtl {\n margin-right: 0;\n margin-left: @radio-wrapper-margin-right;\n direction: rtl;\n }\n}\n\n.@{radio-prefix-cls-button-wrapper} {\n &&-rtl {\n border-right-width: 0;\n border-left-width: @border-width-base;\n }\n\n &:not(:first-child) {\n &::before {\n .@{radio-prefix-cls-button-wrapper}.@{radio-prefix-cls-button-wrapper}-rtl& {\n right: -1px;\n left: 0;\n }\n }\n }\n\n &:first-child {\n .@{radio-prefix-cls-button-wrapper}.@{radio-prefix-cls-button-wrapper}-rtl& {\n border-right: @border-width-base @border-style-base @border-color-base;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n .@{radio-prefix-cls-button-wrapper}-checked:not([class*=~\"' @{radio-prefix-cls}-button-wrapper-disabled'\"])& {\n border-right-color: @radio-button-hover-color;\n }\n }\n\n &:last-child {\n .@{radio-prefix-cls-button-wrapper}.@{radio-prefix-cls-button-wrapper}-rtl& {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n &-disabled {\n &:first-child {\n .@{radio-prefix-cls-button-wrapper}.@{radio-prefix-cls-button-wrapper}-rtl& {\n border-right-color: @border-color-base;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@card-prefix-cls: ~'@{ant-prefix}-card';\n@card-hoverable-hover-border: transparent;\n@card-action-icon-size: 16px;\n\n@gradient-min: fade(@card-skeleton-bg, 20%);\n@gradient-max: fade(@card-skeleton-bg, 40%);\n\n.@{card-prefix-cls} {\n .reset-component();\n\n position: relative;\n background: @card-background;\n border-radius: @card-radius;\n\n &-rtl {\n direction: rtl;\n }\n\n &-hoverable {\n cursor: pointer;\n transition: box-shadow 0.3s, border-color 0.3s;\n\n &:hover {\n border-color: @card-hoverable-hover-border;\n box-shadow: @card-shadow;\n }\n }\n\n &-bordered {\n border: @border-width-base @border-style-base @border-color-split;\n }\n\n &-head {\n min-height: @card-head-height;\n margin-bottom: -1px; // Fix card grid overflow bug: https://gw.alipayobjects.com/zos/rmsportal/XonYxBikwpgbqIQBeuhk.png\n padding: 0 @card-padding-base;\n color: @card-head-color;\n font-weight: 500;\n font-size: @card-head-font-size;\n background: @card-head-background;\n border-bottom: @border-width-base @border-style-base @border-color-split;\n border-radius: @card-radius @card-radius 0 0;\n .clearfix();\n\n &-wrapper {\n display: flex;\n align-items: center;\n }\n\n &-title {\n display: inline-block;\n flex: 1;\n padding: @card-head-padding 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n > .@{ant-prefix}-typography,\n > .@{ant-prefix}-typography-edit-content {\n left: 0;\n margin-top: 0;\n margin-bottom: 0;\n }\n }\n\n .@{ant-prefix}-tabs-top {\n clear: both;\n margin-bottom: @card-head-tabs-margin-bottom;\n color: @text-color;\n font-weight: normal;\n font-size: @font-size-base;\n\n &-bar {\n border-bottom: @border-width-base @border-style-base @border-color-split;\n }\n }\n }\n\n &-extra {\n // https://stackoverflow.com/a/22429853/3040605\n margin-left: auto;\n padding: @card-head-padding 0;\n color: @card-head-extra-color;\n font-weight: normal;\n font-size: @font-size-base;\n\n .@{card-prefix-cls}-rtl & {\n margin-right: auto;\n margin-left: 0;\n }\n }\n\n &-body {\n padding: @card-padding-base;\n .clearfix();\n }\n\n &-contain-grid &-body {\n display: flex;\n flex-wrap: wrap;\n }\n\n &-contain-grid:not(&-loading) &-body {\n margin: -1px 0 0 -1px;\n padding: 0;\n }\n\n &-grid {\n width: 33.33%;\n padding: @card-padding-base;\n border: 0;\n border-radius: 0;\n box-shadow: 1px 0 0 0 @border-color-split, 0 1px 0 0 @border-color-split,\n 1px 1px 0 0 @border-color-split, 1px 0 0 0 @border-color-split inset,\n 0 1px 0 0 @border-color-split inset;\n transition: all 0.3s;\n\n &-hoverable {\n &:hover {\n position: relative;\n z-index: 1;\n box-shadow: @card-shadow;\n }\n }\n }\n\n &-contain-tabs > &-head &-head-title {\n min-height: @card-head-height - @card-head-padding;\n padding-bottom: 0;\n }\n\n &-contain-tabs > &-head &-extra {\n padding-bottom: 0;\n }\n\n &-bordered &-cover {\n margin-top: -1px;\n margin-right: -1px;\n margin-left: -1px;\n }\n\n &-cover {\n > * {\n display: block;\n width: 100%;\n }\n\n img {\n border-radius: @card-radius @card-radius 0 0;\n }\n }\n\n &-actions {\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n background: @card-actions-background;\n border-top: @border-width-base @border-style-base @border-color-split;\n .clearfix();\n\n & > li {\n margin: @card-actions-li-margin;\n color: @text-color-secondary;\n text-align: center;\n\n > span {\n position: relative;\n display: block;\n min-width: 32px;\n font-size: @font-size-base;\n line-height: @line-height-base;\n cursor: pointer;\n\n &:hover {\n color: @primary-color;\n transition: color 0.3s;\n }\n\n a:not(.@{ant-prefix}-btn),\n > .@{iconfont-css-prefix} {\n display: inline-block;\n width: 100%;\n color: @text-color-secondary;\n line-height: 22px;\n transition: color 0.3s;\n\n &:hover {\n color: @primary-color;\n }\n }\n\n > .@{iconfont-css-prefix} {\n font-size: @card-action-icon-size;\n line-height: 22px;\n }\n }\n\n &:not(:last-child) {\n border-right: @border-width-base @border-style-base @border-color-split;\n\n .@{card-prefix-cls}-rtl & {\n border-right: none;\n border-left: @border-width-base @border-style-base @border-color-split;\n }\n }\n }\n }\n\n &-type-inner &-head {\n padding: 0 @card-padding-base;\n background: @background-color-light;\n\n &-title {\n padding: @card-inner-head-padding 0;\n font-size: @font-size-base;\n }\n }\n\n &-type-inner &-body {\n padding: 16px @card-padding-base;\n }\n\n &-type-inner &-extra {\n padding: @card-inner-head-padding + 1.5px 0;\n }\n\n &-meta {\n display: flex;\n margin: -4px 0;\n .clearfix();\n\n &-avatar {\n padding-right: 16px;\n\n .@{card-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 16px;\n }\n }\n\n &-detail {\n overflow: hidden;\n\n > div:not(:last-child) {\n margin-bottom: @margin-xs;\n }\n }\n\n &-title {\n overflow: hidden;\n color: @card-head-color;\n font-weight: 500;\n font-size: @font-size-lg;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-description {\n color: @text-color-secondary;\n }\n }\n\n &-loading {\n overflow: hidden;\n }\n\n &-loading &-body {\n user-select: none;\n }\n}\n\n@import './size';\n\n@root-entry-name: default;",".@{card-prefix-cls}-small {\n > .@{card-prefix-cls}-head {\n min-height: @card-head-height-sm;\n padding: 0 @card-padding-base-sm;\n font-size: @card-head-font-size-sm;\n\n > .@{card-prefix-cls}-head-wrapper {\n > .@{card-prefix-cls}-head-title {\n padding: @card-head-padding-sm 0;\n }\n > .@{card-prefix-cls}-extra {\n padding: @card-head-padding-sm 0;\n font-size: @card-head-font-size-sm;\n }\n }\n }\n > .@{card-prefix-cls}-body {\n padding: @card-padding-base-sm;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@skeleton-prefix-cls: ~'@{ant-prefix}-skeleton';\n@skeleton-avatar-prefix-cls: ~'@{skeleton-prefix-cls}-avatar';\n@skeleton-title-prefix-cls: ~'@{skeleton-prefix-cls}-title';\n@skeleton-paragraph-prefix-cls: ~'@{skeleton-prefix-cls}-paragraph';\n@skeleton-button-prefix-cls: ~'@{skeleton-prefix-cls}-button';\n@skeleton-input-prefix-cls: ~'@{skeleton-prefix-cls}-input';\n@skeleton-image-prefix-cls: ~'@{skeleton-prefix-cls}-image';\n@skeleton-block-radius: @border-radius-base;\n\n.@{skeleton-prefix-cls} {\n display: table;\n width: 100%;\n\n &-header {\n display: table-cell;\n padding-right: @padding-md;\n vertical-align: top;\n\n // Avatar\n .@{skeleton-avatar-prefix-cls} {\n .skeleton-element-avatar();\n }\n }\n\n &-content {\n display: table-cell;\n width: 100%;\n vertical-align: top;\n\n // Title\n .@{skeleton-title-prefix-cls} {\n width: 100%;\n height: @skeleton-title-height;\n background: @skeleton-color;\n border-radius: @skeleton-block-radius;\n\n + .@{skeleton-paragraph-prefix-cls} {\n margin-top: @skeleton-title-paragraph-margin-top;\n }\n }\n\n // paragraph\n .@{skeleton-paragraph-prefix-cls} {\n padding: 0;\n\n > li {\n width: 100%;\n height: @skeleton-paragraph-li-height;\n list-style: none;\n background: @skeleton-color;\n border-radius: @skeleton-block-radius;\n\n &:last-child:not(:first-child):not(:nth-child(2)) {\n width: 61%;\n }\n\n + li {\n margin-top: @skeleton-paragraph-li-margin-top;\n }\n }\n }\n }\n\n &-with-avatar &-content {\n // Title\n .@{skeleton-title-prefix-cls} {\n margin-top: @margin-sm;\n\n + .@{skeleton-paragraph-prefix-cls} {\n margin-top: @skeleton-paragraph-margin-top;\n }\n }\n }\n\n &-round &-content {\n .@{skeleton-title-prefix-cls},\n .@{skeleton-paragraph-prefix-cls} > li {\n border-radius: 100px;\n }\n }\n\n // With active animation\n &-active {\n .@{skeleton-title-prefix-cls},\n .@{skeleton-paragraph-prefix-cls} > li,\n .@{skeleton-avatar-prefix-cls},\n .@{skeleton-button-prefix-cls},\n .@{skeleton-input-prefix-cls},\n .@{skeleton-image-prefix-cls} {\n .skeleton-color();\n }\n }\n\n // Skeleton Block Button, Input\n &.@{skeleton-prefix-cls}-block {\n width: 100%;\n\n .@{skeleton-button-prefix-cls} {\n width: 100%;\n }\n\n .@{skeleton-input-prefix-cls} {\n width: 100%;\n }\n }\n\n // Skeleton element\n &-element {\n display: inline-block;\n width: auto;\n\n .@{skeleton-button-prefix-cls} {\n .skeleton-element-button();\n }\n\n .@{skeleton-avatar-prefix-cls} {\n .skeleton-element-avatar();\n }\n\n .@{skeleton-input-prefix-cls} {\n .skeleton-element-input();\n }\n\n .@{skeleton-image-prefix-cls} {\n .skeleton-element-image();\n }\n }\n}\n// Button\n.skeleton-element-button() {\n display: inline-block;\n vertical-align: top;\n background: @skeleton-color;\n border-radius: @border-radius-base;\n\n .skeleton-element-button-size(@btn-height-base);\n\n &-lg {\n .skeleton-element-button-size(@btn-height-lg);\n }\n\n &-sm {\n .skeleton-element-button-size(@btn-height-sm);\n }\n}\n// Avatar\n.skeleton-element-avatar() {\n display: inline-block;\n vertical-align: top;\n background: @skeleton-color;\n\n .skeleton-element-avatar-size(@avatar-size-base);\n\n &-lg {\n .skeleton-element-avatar-size(@avatar-size-lg);\n }\n\n &-sm {\n .skeleton-element-avatar-size(@avatar-size-sm);\n }\n}\n\n// Input\n.skeleton-element-input() {\n display: inline-block;\n vertical-align: top;\n background: @skeleton-color;\n\n .skeleton-element-input-size(@input-height-base);\n\n &-lg {\n .skeleton-element-input-size(@input-height-lg);\n }\n\n &-sm {\n .skeleton-element-input-size(@input-height-sm);\n }\n}\n\n// Image\n.skeleton-element-image() {\n display: flex;\n align-items: center;\n justify-content: center;\n vertical-align: top;\n background: @skeleton-color;\n\n .skeleton-element-image-size(@image-size-base*2);\n\n &-path {\n fill: #bfbfbf;\n }\n\n &-svg {\n .skeleton-element-image-size(@image-size-base);\n max-width: @image-size-base * 4;\n max-height: @image-size-base * 4;\n }\n}\n\n.skeleton-element-avatar-size(@size) {\n width: @size;\n .skeleton-element-common-size(@size);\n\n &.@{skeleton-avatar-prefix-cls}-circle {\n border-radius: 50%;\n }\n}\n\n.skeleton-element-button-size(@size) {\n width: @size * 2;\n min-width: @size * 2;\n .skeleton-element-common-size(@size);\n\n &.@{skeleton-button-prefix-cls}-square {\n width: @size;\n min-width: @size;\n }\n\n &.@{skeleton-button-prefix-cls}-circle {\n width: @size;\n min-width: @size;\n border-radius: 50%;\n }\n\n &.@{skeleton-button-prefix-cls}-round {\n border-radius: @size;\n }\n}\n\n.skeleton-element-input-size(@size) {\n width: @size * 5;\n min-width: @size * 5;\n .skeleton-element-common-size(@size);\n}\n\n.skeleton-element-image-size(@size) {\n width: @size;\n .skeleton-element-common-size(@size);\n\n &.@{skeleton-image-prefix-cls}-circle {\n border-radius: 50%;\n }\n}\n\n.skeleton-element-common-size(@size) {\n height: @size;\n line-height: @size;\n}\n\n.skeleton-color() {\n position: relative;\n // fix https://github.com/ant-design/ant-design/issues/36444\n // https://monshin.github.io/202109/css/safari-border-radius-overflow-hidden/\n /* stylelint-disable-next-line property-no-vendor-prefix,value-no-vendor-prefix */\n z-index: 0;\n overflow: hidden;\n background: transparent;\n\n &::after {\n position: absolute;\n top: 0;\n right: -150%;\n bottom: 0;\n left: -150%;\n background: linear-gradient(\n 90deg,\n @skeleton-color 25%,\n @skeleton-to-color 37%,\n @skeleton-color 63%\n );\n animation: ~'@{skeleton-prefix-cls}-loading' 1.4s ease infinite;\n content: '';\n }\n}\n\n@keyframes ~\"@{skeleton-prefix-cls}-loading\" {\n 0% {\n transform: translateX(-37.5%);\n }\n\n 100% {\n transform: translateX(37.5%);\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@skeleton-prefix-cls: ~'@{ant-prefix}-skeleton';\n@skeleton-avatar-prefix-cls: ~'@{skeleton-prefix-cls}-avatar';\n@skeleton-title-prefix-cls: ~'@{skeleton-prefix-cls}-title';\n@skeleton-paragraph-prefix-cls: ~'@{skeleton-prefix-cls}-paragraph';\n\n.@{skeleton-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-header {\n .@{skeleton-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 16px;\n }\n }\n\n // With active animation\n &.@{skeleton-prefix-cls}-active {\n & .@{skeleton-prefix-cls}-content {\n .@{skeleton-title-prefix-cls},\n .@{skeleton-paragraph-prefix-cls} > li {\n .@{skeleton-prefix-cls}-rtl& {\n animation-name: ~'@{skeleton-prefix-cls}-loading-rtl';\n }\n }\n }\n\n .@{skeleton-avatar-prefix-cls} {\n .@{skeleton-prefix-cls}-rtl& {\n animation-name: ~'@{skeleton-prefix-cls}-loading-rtl';\n }\n }\n }\n}\n\n@keyframes ~\"@{skeleton-prefix-cls}-loading-rtl\" {\n 0% {\n background-position: 0% 50%;\n }\n\n 100% {\n background-position: 100% 50%;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls} {\n &-small {\n > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n padding: @tabs-horizontal-padding-sm;\n font-size: @tabs-title-font-size-sm;\n }\n }\n }\n\n &-large {\n > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n padding: @tabs-horizontal-padding-lg;\n font-size: @tabs-title-font-size-lg;\n }\n }\n }\n\n &-card {\n &.@{tab-prefix-cls}-small {\n > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n padding: @tabs-card-horizontal-padding-sm;\n }\n }\n }\n\n &.@{tab-prefix-cls}-large {\n > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n padding: @tabs-card-horizontal-padding-lg;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './size';\n@import './rtl';\n@import './position';\n@import './dropdown';\n@import './card';\n\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls} {\n .reset-component();\n\n display: flex;\n\n // ========================== Navigation ==========================\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n position: relative;\n display: flex;\n flex: none;\n align-items: center;\n\n .@{tab-prefix-cls}-nav-wrap {\n position: relative;\n display: inline-block;\n display: flex;\n flex: auto;\n align-self: stretch;\n overflow: hidden;\n white-space: nowrap;\n transform: translate(0); // Fix chrome render bug\n\n // >>>>> Ping shadow\n &::before,\n &::after {\n position: absolute;\n z-index: 1;\n opacity: 0;\n transition: opacity @animation-duration-slow;\n content: '';\n pointer-events: none;\n }\n }\n\n .@{tab-prefix-cls}-nav-list {\n position: relative;\n display: flex;\n transition: transform @animation-duration-slow;\n }\n\n // >>>>>>>> Operations\n .@{tab-prefix-cls}-nav-operations {\n display: flex;\n align-self: stretch;\n\n &-hidden {\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n }\n }\n\n .@{tab-prefix-cls}-nav-more {\n position: relative;\n padding: @tabs-card-horizontal-padding;\n background: transparent;\n border: 0;\n\n &::after {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 5px;\n transform: translateY(100%);\n content: '';\n }\n }\n\n .@{tab-prefix-cls}-nav-add {\n min-width: @tabs-card-height;\n margin-left: @tabs-card-gutter;\n padding: 0 @padding-xs;\n background: @tabs-card-head-background;\n border: @border-width-base @border-style-base @border-color-split;\n border-radius: @border-radius-base @border-radius-base 0 0;\n outline: none;\n cursor: pointer;\n transition: all @animation-duration-slow @ease-in-out;\n\n &:hover {\n color: @tabs-hover-color;\n }\n\n &:active,\n &:focus {\n color: @tabs-active-color;\n }\n }\n }\n\n &-extra-content {\n flex: none;\n }\n\n &-centered {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-nav-wrap {\n &:not([class*='@{tab-prefix-cls}-nav-wrap-ping']) {\n justify-content: center;\n }\n }\n }\n }\n\n // ============================ InkBar ============================\n &-ink-bar {\n position: absolute;\n background: @tabs-ink-bar-color;\n pointer-events: none;\n }\n\n // ============================= Tabs =============================\n &-tab {\n position: relative;\n display: inline-flex;\n align-items: center;\n padding: @tabs-horizontal-padding;\n font-size: @tabs-title-font-size;\n background: transparent;\n border: 0;\n outline: none;\n cursor: pointer;\n\n &-btn,\n &-remove {\n &:focus,\n &:active {\n color: @tabs-active-color;\n }\n }\n\n &-btn {\n outline: none;\n transition: all 0.3s;\n }\n\n &-remove {\n flex: none;\n margin-right: -@margin-xss;\n margin-left: @margin-xs;\n color: @text-color-secondary;\n font-size: @font-size-sm;\n background: transparent;\n border: none;\n outline: none;\n cursor: pointer;\n transition: all @animation-duration-slow;\n\n &:hover {\n color: @heading-color;\n }\n }\n\n &:hover {\n color: @tabs-hover-color;\n }\n\n &&-active &-btn {\n color: @tabs-highlight-color;\n text-shadow: 0 0 0.25px currentcolor;\n }\n\n &&-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n }\n\n &&-disabled &-btn,\n &&-disabled &-remove {\n &:focus,\n &:active {\n color: @disabled-color;\n }\n }\n\n & &-remove .@{iconfont-css-prefix} {\n margin: 0;\n }\n\n .@{iconfont-css-prefix} {\n margin-right: @margin-sm;\n }\n }\n\n &-tab + &-tab {\n margin: @tabs-horizontal-margin;\n }\n\n // =========================== TabPanes ===========================\n &-content {\n &-holder {\n flex: auto;\n min-width: 0;\n min-height: 0;\n }\n\n display: flex;\n width: 100%;\n\n &-animated {\n transition: margin @animation-duration-slow;\n }\n }\n\n &-tabpane {\n flex: none;\n width: 100%;\n outline: none;\n }\n}\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls} {\n &-rtl {\n direction: rtl;\n\n .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n margin: @tabs-horizontal-margin-rtl;\n\n &:last-of-type {\n margin-left: 0;\n }\n\n .@{iconfont-css-prefix} {\n margin-right: 0;\n margin-left: @margin-sm;\n }\n\n .@{tab-prefix-cls}-tab-remove {\n margin-right: @margin-xs;\n margin-left: -@margin-xss;\n\n .@{iconfont-css-prefix} {\n margin: 0;\n }\n }\n }\n }\n\n &.@{tab-prefix-cls}-left {\n > .@{tab-prefix-cls}-nav {\n order: 1;\n }\n > .@{tab-prefix-cls}-content-holder {\n order: 0;\n }\n }\n\n &.@{tab-prefix-cls}-right {\n > .@{tab-prefix-cls}-nav {\n order: 0;\n }\n > .@{tab-prefix-cls}-content-holder {\n order: 1;\n }\n }\n }\n\n // ====================== Card ======================\n &-card {\n &.@{tab-prefix-cls}-top,\n &.@{tab-prefix-cls}-bottom {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab + .@{tab-prefix-cls}-tab {\n .@{tab-prefix-cls}-rtl& {\n margin-right: @tabs-card-gutter;\n margin-left: 0;\n }\n }\n .@{tab-prefix-cls}-nav-add {\n .@{tab-prefix-cls}-rtl& {\n margin-right: @tabs-card-gutter;\n margin-left: 0;\n }\n }\n }\n }\n }\n}\n\n.@{tab-prefix-cls}-dropdown {\n &-rtl {\n direction: rtl;\n }\n\n &-menu-item {\n .@{tab-prefix-cls}-dropdown-rtl & {\n text-align: right;\n }\n }\n}\n","@import '../../style/themes/index';\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls} {\n // ========================== Top & Bottom ==========================\n &-top,\n &-bottom {\n flex-direction: column;\n\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n margin: @tabs-bar-margin;\n\n &::before {\n position: absolute;\n right: 0;\n left: 0;\n border-bottom: @border-width-base @border-style-base @border-color-split;\n content: '';\n }\n\n .@{tab-prefix-cls}-ink-bar {\n height: 2px;\n\n &-animated {\n transition: width @animation-duration-slow, left @animation-duration-slow,\n right @animation-duration-slow;\n }\n }\n\n .@{tab-prefix-cls}-nav-wrap {\n &::before,\n &::after {\n top: 0;\n bottom: 0;\n width: 30px;\n }\n\n &::before {\n left: 0;\n box-shadow: inset 10px 0 8px -8px fade(@shadow-color, 8%);\n }\n\n &::after {\n right: 0;\n box-shadow: inset -10px 0 8px -8px fade(@shadow-color, 8%);\n }\n\n &.@{tab-prefix-cls}-nav-wrap-ping-left::before {\n opacity: 1;\n }\n &.@{tab-prefix-cls}-nav-wrap-ping-right::after {\n opacity: 1;\n }\n }\n }\n }\n\n &-top {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n &::before {\n bottom: 0;\n }\n\n .@{tab-prefix-cls}-ink-bar {\n bottom: 0;\n }\n }\n }\n\n &-bottom {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n order: 1;\n margin-top: @margin-md;\n margin-bottom: 0;\n\n &::before {\n top: 0;\n }\n\n .@{tab-prefix-cls}-ink-bar {\n top: 0;\n }\n }\n\n > .@{tab-prefix-cls}-content-holder,\n > div > .@{tab-prefix-cls}-content-holder {\n order: 0;\n }\n }\n\n // ========================== Left & Right ==========================\n &-left,\n &-right {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n flex-direction: column;\n min-width: 50px;\n\n // >>>>>>>>>>> Tab\n .@{tab-prefix-cls}-tab {\n padding: @tabs-vertical-padding;\n text-align: center;\n }\n\n .@{tab-prefix-cls}-tab + .@{tab-prefix-cls}-tab {\n margin: @tabs-vertical-margin;\n }\n\n // >>>>>>>>>>> Nav\n .@{tab-prefix-cls}-nav-wrap {\n flex-direction: column;\n\n &::before,\n &::after {\n right: 0;\n left: 0;\n height: 30px;\n }\n\n &::before {\n top: 0;\n box-shadow: inset 0 10px 8px -8px fade(@shadow-color, 8%);\n }\n\n &::after {\n bottom: 0;\n box-shadow: inset 0 -10px 8px -8px fade(@shadow-color, 8%);\n }\n\n &.@{tab-prefix-cls}-nav-wrap-ping-top::before {\n opacity: 1;\n }\n &.@{tab-prefix-cls}-nav-wrap-ping-bottom::after {\n opacity: 1;\n }\n }\n\n // >>>>>>>>>>> Ink Bar\n .@{tab-prefix-cls}-ink-bar {\n width: 2px;\n\n &-animated {\n transition: height @animation-duration-slow, top @animation-duration-slow;\n }\n }\n\n .@{tab-prefix-cls}-nav-list,\n .@{tab-prefix-cls}-nav-operations {\n flex: 1 0 auto; // fix safari scroll problem\n flex-direction: column;\n }\n }\n }\n\n &-left {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-ink-bar {\n right: 0;\n }\n }\n\n > .@{tab-prefix-cls}-content-holder,\n > div > .@{tab-prefix-cls}-content-holder {\n margin-left: -@border-width-base;\n border-left: @border-width-base @border-style-base @border-color-split;\n\n > .@{tab-prefix-cls}-content > .@{tab-prefix-cls}-tabpane {\n padding-left: @padding-lg;\n }\n }\n }\n\n &-right {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n order: 1;\n\n .@{tab-prefix-cls}-ink-bar {\n left: 0;\n }\n }\n\n > .@{tab-prefix-cls}-content-holder,\n > div > .@{tab-prefix-cls}-content-holder {\n order: 0;\n margin-right: -@border-width-base;\n border-right: @border-width-base @border-style-base @border-color-split;\n\n > .@{tab-prefix-cls}-content > .@{tab-prefix-cls}-tabpane {\n padding-right: @padding-lg;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls}-dropdown {\n .reset-component();\n\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: @zindex-dropdown;\n display: block;\n\n &-hidden {\n display: none;\n }\n\n &-menu {\n max-height: 200px;\n margin: 0;\n padding: @dropdown-edge-child-vertical-padding 0;\n overflow-x: hidden;\n overflow-y: auto;\n text-align: left;\n list-style-type: none;\n background-color: @dropdown-menu-bg;\n background-clip: padding-box;\n border-radius: @border-radius-base;\n outline: none;\n box-shadow: @box-shadow-base;\n\n &-item {\n display: flex;\n align-items: center;\n min-width: 120px;\n margin: 0;\n padding: @dropdown-vertical-padding @control-padding-horizontal;\n overflow: hidden;\n color: @text-color;\n font-weight: normal;\n font-size: @dropdown-font-size;\n line-height: @dropdown-line-height;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: all 0.3s;\n\n > span {\n flex: 1;\n white-space: nowrap;\n }\n\n &-remove {\n flex: none;\n margin-left: @margin-sm;\n color: @text-color-secondary;\n font-size: @font-size-sm;\n background: transparent;\n border: 0;\n cursor: pointer;\n\n &:hover {\n color: @tabs-hover-color;\n }\n }\n\n &:hover {\n background: @item-hover-bg;\n }\n\n &-disabled {\n &,\n &:hover {\n color: @disabled-color;\n background: transparent;\n cursor: not-allowed;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@tab-prefix-cls: ~'@{ant-prefix}-tabs';\n\n.@{tab-prefix-cls}-card {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n margin: 0;\n padding: @tabs-card-horizontal-padding;\n background: @tabs-card-head-background;\n border: @border-width-base @border-style-base @border-color-split;\n transition: all @animation-duration-slow @ease-in-out;\n\n &-active {\n color: @tabs-card-active-color;\n background: @component-background;\n }\n }\n\n .@{tab-prefix-cls}-ink-bar {\n visibility: hidden;\n }\n }\n\n // ========================== Top & Bottom ==========================\n &.@{tab-prefix-cls}-top,\n &.@{tab-prefix-cls}-bottom {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab + .@{tab-prefix-cls}-tab {\n margin-left: @tabs-card-gutter;\n }\n }\n }\n\n &.@{tab-prefix-cls}-top {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n border-radius: @border-radius-base @border-radius-base 0 0;\n\n &-active {\n border-bottom-color: @component-background;\n }\n }\n }\n }\n &.@{tab-prefix-cls}-bottom {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n border-radius: 0 0 @border-radius-base @border-radius-base;\n\n &-active {\n border-top-color: @component-background;\n }\n }\n }\n }\n\n // ========================== Left & Right ==========================\n &.@{tab-prefix-cls}-left,\n &.@{tab-prefix-cls}-right {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab + .@{tab-prefix-cls}-tab {\n margin-top: @tabs-card-gutter;\n }\n }\n }\n\n &.@{tab-prefix-cls}-left {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n\n &-active {\n border-right-color: @component-background;\n }\n }\n }\n }\n &.@{tab-prefix-cls}-right {\n > .@{tab-prefix-cls}-nav,\n > div > .@{tab-prefix-cls}-nav {\n .@{tab-prefix-cls}-tab {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n\n &-active {\n border-left-color: @component-background;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@carousel-prefix-cls: ~'@{ant-prefix}-carousel';\n\n.@{carousel-prefix-cls} {\n .reset-component();\n\n .slick-slider {\n position: relative;\n display: block;\n box-sizing: border-box;\n touch-action: pan-y;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n }\n\n .slick-list {\n position: relative;\n display: block;\n margin: 0;\n padding: 0;\n overflow: hidden;\n\n &:focus {\n outline: none;\n }\n\n &.dragging {\n cursor: pointer;\n }\n\n .slick-slide {\n pointer-events: none;\n\n // https://github.com/ant-design/ant-design/issues/23294\n input.@{ant-prefix}-radio-input,\n input.@{ant-prefix}-checkbox-input {\n visibility: hidden;\n }\n\n &.slick-active {\n pointer-events: auto;\n\n input.@{ant-prefix}-radio-input,\n input.@{ant-prefix}-checkbox-input {\n visibility: visible;\n }\n }\n\n // fix Carousel content height not match parent node\n // when children is empty node\n // https://github.com/ant-design/ant-design/issues/25878\n > div > div {\n vertical-align: bottom;\n }\n }\n }\n\n .slick-slider .slick-track,\n .slick-slider .slick-list {\n transform: translate3d(0, 0, 0);\n touch-action: pan-y;\n }\n\n .slick-track {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n\n &::before,\n &::after {\n display: table;\n content: '';\n }\n\n &::after {\n clear: both;\n }\n\n .slick-loading & {\n visibility: hidden;\n }\n }\n\n .slick-slide {\n display: none;\n float: left;\n height: 100%;\n min-height: 1px;\n\n img {\n display: block;\n }\n\n &.slick-loading img {\n display: none;\n }\n\n &.dragging img {\n pointer-events: none;\n }\n }\n\n .slick-initialized .slick-slide {\n display: block;\n }\n\n .slick-loading .slick-slide {\n visibility: hidden;\n }\n\n .slick-vertical .slick-slide {\n display: block;\n height: auto;\n }\n\n .slick-arrow.slick-hidden {\n display: none;\n }\n\n // Arrows\n .slick-prev,\n .slick-next {\n position: absolute;\n top: 50%;\n display: block;\n width: 20px;\n height: 20px;\n margin-top: -10px;\n padding: 0;\n color: transparent;\n font-size: 0;\n line-height: 0;\n background: transparent;\n border: 0;\n outline: none;\n cursor: pointer;\n\n &:hover,\n &:focus {\n color: transparent;\n background: transparent;\n outline: none;\n\n &::before {\n opacity: 1;\n }\n }\n\n &.slick-disabled::before {\n opacity: 0.25;\n }\n }\n\n .slick-prev {\n left: -25px;\n\n &::before {\n content: '←';\n }\n }\n\n .slick-next {\n right: -25px;\n\n &::before {\n content: '→';\n }\n }\n\n // Dots\n .slick-dots {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex !important;\n justify-content: center;\n margin-right: 15%;\n margin-left: 15%;\n padding-left: 0;\n list-style: none;\n\n &-bottom {\n bottom: 12px;\n }\n\n &-top {\n top: 12px;\n bottom: auto;\n }\n\n li {\n position: relative;\n display: inline-block;\n flex: 0 1 auto;\n box-sizing: content-box;\n width: @carousel-dot-width;\n height: @carousel-dot-height;\n margin: 0 2px;\n margin-right: 3px;\n margin-left: 3px;\n padding: 0;\n text-align: center;\n text-indent: -999px;\n vertical-align: top;\n transition: all 0.5s;\n\n button {\n display: block;\n width: 100%;\n height: @carousel-dot-height;\n padding: 0;\n color: transparent;\n font-size: 0;\n background: @component-background;\n border: 0;\n border-radius: 1px;\n outline: none;\n cursor: pointer;\n opacity: 0.3;\n transition: all 0.5s;\n\n &:hover,\n &:focus {\n opacity: 0.75;\n }\n }\n\n &.slick-active {\n width: @carousel-dot-active-width;\n\n & button {\n background: @component-background;\n opacity: 1;\n }\n\n &:hover,\n &:focus {\n opacity: 1;\n }\n }\n }\n }\n}\n\n.@{ant-prefix}-carousel-vertical {\n .slick-dots {\n top: 50%;\n bottom: auto;\n flex-direction: column;\n width: @carousel-dot-height;\n height: auto;\n margin: 0;\n transform: translateY(-50%);\n\n &-left {\n right: auto;\n left: 12px;\n }\n\n &-right {\n right: 12px;\n left: auto;\n }\n\n li {\n width: @carousel-dot-height;\n height: @carousel-dot-width;\n margin: 4px 2px;\n vertical-align: baseline;\n\n button {\n width: @carousel-dot-height;\n height: @carousel-dot-width;\n }\n\n &.slick-active {\n width: @carousel-dot-height;\n height: @carousel-dot-active-width;\n\n button {\n width: @carousel-dot-height;\n height: @carousel-dot-active-width;\n }\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@carousel-prefix-cls: ~'@{ant-prefix}-carousel';\n\n.@{carousel-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n .slick-track {\n .@{carousel-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n\n .slick-prev {\n .@{carousel-prefix-cls}-rtl & {\n right: -25px;\n left: auto;\n\n &::before {\n content: '→';\n }\n }\n }\n\n .slick-next {\n .@{carousel-prefix-cls}-rtl & {\n right: auto;\n left: -25px;\n\n &::before {\n content: '←';\n }\n }\n }\n\n // Dots\n .slick-dots {\n .@{carousel-prefix-cls}-rtl& {\n flex-direction: row-reverse;\n }\n }\n}\n\n.@{ant-prefix}-carousel-vertical {\n .slick-dots {\n .@{carousel-prefix-cls}-rtl& {\n flex-direction: column;\n }\n }\n}\n","@import '../../style/mixins/index';\n\n.antCheckboxFn(@checkbox-prefix-cls: ~'@{ant-prefix}-checkbox') {\n @checkbox-inner-prefix-cls: ~'@{checkbox-prefix-cls}-inner';\n // 一般状态\n .@{checkbox-prefix-cls} {\n .reset-component();\n\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n\n .@{checkbox-prefix-cls}-wrapper:hover &-inner,\n &:hover &-inner,\n &-input:focus + &-inner {\n border-color: @checkbox-color;\n }\n\n &-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid @checkbox-color;\n border-radius: @border-radius-base;\n visibility: hidden;\n animation: antCheckboxEffect 0.36s ease-in-out;\n animation-fill-mode: backwards;\n content: '';\n }\n\n &:hover::after,\n .@{checkbox-prefix-cls}-wrapper:hover &::after {\n visibility: visible;\n }\n\n &-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: @checkbox-size;\n height: @checkbox-size;\n direction: ltr;\n background-color: @checkbox-check-bg;\n border: @checkbox-border-width @border-style-base @border-color-base;\n border-radius: @checkbox-border-radius;\n // Fix IE checked style\n // https://github.com/ant-design/ant-design/issues/12597\n border-collapse: separate;\n transition: all 0.3s;\n\n &::after {\n @check-width: (@checkbox-size / 14) * 5px;\n @check-height: (@checkbox-size / 14) * 8px;\n\n position: absolute;\n top: 50%;\n // https://github.com/ant-design/ant-design/pull/19452\n // https://github.com/ant-design/ant-design/pull/31726\n left: 21.5%;\n display: table;\n width: @check-width;\n height: @check-height;\n border: 2px solid @checkbox-check-color;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s @ease-in-back, opacity 0.1s;\n content: ' ';\n }\n }\n\n &-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n }\n }\n\n // 选中状态\n .@{checkbox-prefix-cls}-checked .@{checkbox-inner-prefix-cls}::after {\n position: absolute;\n display: table;\n border: 2px solid @checkbox-check-color;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s @ease-out-back 0.1s;\n content: ' ';\n }\n\n .@{checkbox-prefix-cls}-checked {\n .@{checkbox-inner-prefix-cls} {\n background-color: @checkbox-color;\n border-color: @checkbox-color;\n }\n }\n\n .@{checkbox-prefix-cls}-disabled {\n cursor: not-allowed;\n\n &.@{checkbox-prefix-cls}-checked {\n .@{checkbox-inner-prefix-cls}::after {\n border-color: @disabled-color;\n animation-name: none;\n }\n }\n\n .@{checkbox-prefix-cls}-input {\n cursor: not-allowed;\n pointer-events: none;\n }\n\n .@{checkbox-inner-prefix-cls} {\n background-color: @input-disabled-bg;\n border-color: @border-color-base !important;\n\n &::after {\n border-color: @input-disabled-bg;\n border-collapse: separate;\n animation-name: none;\n }\n }\n\n & + span {\n color: @disabled-color;\n cursor: not-allowed;\n }\n\n // Not show highlight border of checkbox when disabled\n &:hover::after,\n .@{checkbox-prefix-cls}-wrapper:hover &::after {\n visibility: hidden;\n }\n }\n\n .@{checkbox-prefix-cls}-wrapper {\n .reset-component();\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n\n &::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n }\n\n &.@{checkbox-prefix-cls}-wrapper-disabled {\n cursor: not-allowed;\n }\n\n & + & {\n margin-left: 8px;\n }\n\n &&-in-form-item {\n input[type='checkbox'] {\n width: 14px;\n height: 14px;\n }\n }\n }\n\n .@{checkbox-prefix-cls} + span {\n padding-right: 8px;\n padding-left: 8px;\n }\n\n .@{checkbox-prefix-cls}-group {\n .reset-component();\n display: inline-block;\n\n &-item {\n margin-right: @checkbox-group-item-margin-right;\n\n &:last-child {\n margin-right: 0;\n }\n }\n\n &-item + &-item {\n margin-left: 0;\n }\n }\n\n // 半选状态\n .@{checkbox-prefix-cls}-indeterminate {\n .@{checkbox-inner-prefix-cls} {\n background-color: @checkbox-check-bg;\n border-color: @border-color-base;\n }\n .@{checkbox-inner-prefix-cls}::after {\n @indeterminate-width: @checkbox-size - 8px;\n @indeterminate-height: @checkbox-size - 8px;\n\n top: 50%;\n left: 50%;\n width: @indeterminate-width;\n height: @indeterminate-height;\n background-color: @checkbox-color;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n }\n\n &.@{checkbox-prefix-cls}-disabled .@{checkbox-inner-prefix-cls}::after {\n background-color: @disabled-color;\n border-color: @disabled-color;\n }\n }\n}\n\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import '../../checkbox/style/mixin';\n\n@cascader-prefix-cls: ~'@{ant-prefix}-cascader';\n\n.antCheckboxFn(@checkbox-prefix-cls: ~'@{cascader-prefix-cls}-checkbox');\n\n.@{cascader-prefix-cls} {\n width: 184px;\n\n &-checkbox {\n top: 0;\n margin-right: @padding-xs;\n }\n\n &-menus {\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n\n &.@{cascader-prefix-cls}-menu-empty {\n .@{cascader-prefix-cls}-menu {\n width: 100%;\n height: auto;\n }\n }\n }\n\n &-menu {\n flex-grow: 1;\n min-width: 111px;\n height: 180px;\n margin: 0;\n margin: -@dropdown-edge-child-vertical-padding 0;\n padding: @cascader-dropdown-edge-child-vertical-padding 0;\n overflow: auto;\n vertical-align: top;\n list-style: none;\n border-right: @border-width-base @border-style-base @cascader-menu-border-color-split;\n -ms-overflow-style: -ms-autohiding-scrollbar; // https://github.com/ant-design/ant-design/issues/11857\n\n &-item {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n padding: @cascader-dropdown-vertical-padding @control-padding-horizontal;\n overflow: hidden;\n line-height: @cascader-dropdown-line-height;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n background: @item-hover-bg;\n }\n\n &-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n\n &:hover {\n background: transparent;\n }\n }\n\n .@{cascader-prefix-cls}-menu-empty & {\n color: @disabled-color;\n cursor: default;\n pointer-events: none;\n }\n\n &-active:not(&-disabled) {\n &,\n &:hover {\n font-weight: @select-item-selected-font-weight;\n background-color: @cascader-item-selected-bg;\n }\n }\n\n &-content {\n flex: auto;\n }\n\n &-expand &-expand-icon,\n &-loading-icon {\n margin-left: @padding-xss;\n color: @text-color-secondary;\n font-size: 10px;\n\n .@{cascader-prefix-cls}-menu-item-disabled& {\n color: @disabled-color;\n }\n }\n\n &-keyword {\n color: @highlight-color;\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","// We can not import reference of `./index` directly since it will make dead loop in less\n@import (reference) '../../style/themes/index';\n@cascader-prefix-cls: ~'@{ant-prefix}-cascader';\n\n.@{cascader-prefix-cls}-rtl {\n .@{cascader-prefix-cls}-menu-item {\n &-expand-icon,\n &-loading-icon {\n margin-right: @padding-xss;\n margin-left: 0;\n }\n }\n\n .@{cascader-prefix-cls}-checkbox {\n top: 0;\n margin-right: 0;\n margin-left: @padding-xs;\n }\n}\n","/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n.ant-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-checkbox-wrapper:hover .ant-checkbox-inner,\n.ant-checkbox:hover .ant-checkbox-inner,\n.ant-checkbox-input:focus + .ant-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n animation: antCheckboxEffect 0.36s ease-in-out;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-checkbox:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox::after {\n visibility: visible;\n}\n.ant-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-checkbox-checked .ant-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-checkbox-checked .ant-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n animation-name: none;\n}\n.ant-checkbox-disabled .ant-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-checkbox-disabled .ant-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-checkbox-disabled .ant-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n animation-name: none;\n}\n.ant-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-checkbox-disabled:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-checkbox-wrapper + .ant-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-checkbox-group-item + .ant-checkbox-group-item {\n margin-left: 0;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-checkbox-rtl {\n direction: rtl;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item {\n margin-right: 0;\n margin-left: 8px;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child {\n margin-left: 0 !important;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item + .ant-checkbox-group-item {\n margin-left: 8px;\n}\n","@import '../../style/mixins/index';\n\n.antCheckboxFn(@checkbox-prefix-cls: ~'@{ant-prefix}-checkbox') {\n .@{checkbox-prefix-cls}-rtl {\n direction: rtl;\n }\n\n .@{checkbox-prefix-cls}-group {\n &-item {\n .@{checkbox-prefix-cls}-group-rtl & {\n margin-right: 0;\n margin-left: @checkbox-group-item-margin-right;\n }\n\n &:last-child {\n .@{checkbox-prefix-cls}-group-rtl & {\n margin-left: 0 !important;\n }\n }\n }\n\n &-item + &-item {\n .@{checkbox-prefix-cls}-group-rtl & {\n margin-left: @checkbox-group-item-margin-right;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './mixin';\n\n// Grid system\n.@{row-prefix-cls} {\n display: flex;\n flex-flow: row wrap;\n\n &::before,\n &::after {\n display: flex;\n }\n\n // No wrap of flex\n &-no-wrap {\n flex-wrap: nowrap;\n }\n}\n\n// x轴原点\n.@{row-prefix-cls}-start {\n justify-content: flex-start;\n}\n\n// x轴居中\n.@{row-prefix-cls}-center {\n justify-content: center;\n}\n\n// x轴反方向\n.@{row-prefix-cls}-end {\n justify-content: flex-end;\n}\n\n// x轴平分\n.@{row-prefix-cls}-space-between {\n justify-content: space-between;\n}\n\n// x轴有间隔地平分\n.@{row-prefix-cls}-space-around {\n justify-content: space-around;\n}\n\n// x轴有间隔地均分\n.@{row-prefix-cls}-space-evenly {\n justify-content: space-evenly;\n}\n\n// 顶部对齐\n.@{row-prefix-cls}-top {\n align-items: flex-start;\n}\n\n// 居中对齐\n.@{row-prefix-cls}-middle {\n align-items: center;\n}\n\n// 底部对齐\n.@{row-prefix-cls}-bottom {\n align-items: flex-end;\n}\n\n.@{col-prefix-cls} {\n position: relative;\n max-width: 100%;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n}\n\n.make-grid();\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(-xs);\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(-sm);\n}\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(-md);\n}\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(-lg);\n}\n\n// Extra Large grid\n//\n// Columns, offsets, pushes, and pulls for the full hd device range.\n\n@media (min-width: @screen-xl-min) {\n .make-grid(-xl);\n}\n\n// Extra Extra Large grid\n//\n// Columns, offsets, pushes, and pulls for the full hd device range.\n\n@media (min-width: @screen-xxl-min) {\n .make-grid(-xxl);\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/mixins/index';\n\n@row-prefix-cls: ~'@{ant-prefix}-row';\n@col-prefix-cls: ~'@{ant-prefix}-col';\n\n// mixins for grid system\n// ------------------------\n\n.loop-grid-columns(@index, @class) when (@index > 0) {\n .@{col-prefix-cls}@{class}-@{index} {\n display: block;\n flex: 0 0 percentage((@index / @grid-columns));\n max-width: percentage((@index / @grid-columns));\n }\n .@{col-prefix-cls}@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n .@{col-prefix-cls}@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n .@{col-prefix-cls}@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n .@{col-prefix-cls}@{class}-order-@{index} {\n order: @index;\n }\n .loop-grid-columns((@index - 1), @class);\n}\n\n.loop-grid-columns(@index, @class) when (@index = 0) {\n .@{col-prefix-cls}@{class}-@{index} {\n display: none;\n }\n .@{col-prefix-cls}-push-@{index} {\n left: auto;\n }\n .@{col-prefix-cls}-pull-@{index} {\n right: auto;\n }\n .@{col-prefix-cls}@{class}-push-@{index} {\n left: auto;\n }\n .@{col-prefix-cls}@{class}-pull-@{index} {\n right: auto;\n }\n .@{col-prefix-cls}@{class}-offset-@{index} {\n margin-left: 0;\n }\n .@{col-prefix-cls}@{class}-order-@{index} {\n order: 0;\n }\n}\n\n.make-grid(@class: ~'') {\n .loop-grid-columns(@grid-columns, @class);\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './mixin';\n\n.@{row-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n\n// mixin\n.loop-grid-columns(@index, @class) when (@index > 0) {\n .@{col-prefix-cls}@{class}-push-@{index} {\n // reset property in RTL direction\n &.@{col-prefix-cls}-rtl {\n right: percentage((@index / @grid-columns));\n left: auto;\n }\n }\n\n .@{col-prefix-cls}@{class}-pull-@{index} {\n // reset property in RTL direction\n &.@{col-prefix-cls}-rtl {\n right: auto;\n left: percentage((@index / @grid-columns));\n }\n }\n\n .@{col-prefix-cls}@{class}-offset-@{index} {\n // reset property in RTL direction\n &.@{col-prefix-cls}-rtl {\n margin-right: percentage((@index / @grid-columns));\n margin-left: 0;\n }\n }\n}\n\n.loop-grid-columns(@index, @class) when (@index = 0) {\n .@{col-prefix-cls}-push-@{index} {\n // reset property in RTL direction\n &.@{col-prefix-cls}-rtl {\n right: auto;\n }\n }\n\n .@{col-prefix-cls}-pull-@{index} {\n &.@{col-prefix-cls}-rtl {\n left: auto;\n }\n }\n\n .@{col-prefix-cls}@{class}-push-@{index} {\n &.@{col-prefix-cls}-rtl {\n right: auto;\n }\n }\n\n .@{col-prefix-cls}@{class}-pull-@{index} {\n &.@{col-prefix-cls}-rtl {\n left: auto;\n }\n }\n\n .@{col-prefix-cls}@{class}-offset-@{index} {\n &.@{col-prefix-cls}-rtl {\n margin-right: 0;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@collapse-prefix-cls: ~'@{ant-prefix}-collapse';\n\n.@{collapse-prefix-cls} {\n .reset-component();\n\n background-color: @collapse-header-bg;\n border: @border-width-base @border-style-base @border-color-base;\n border-bottom: 0;\n border-radius: @collapse-panel-border-radius;\n\n & > &-item {\n border-bottom: @border-width-base @border-style-base @border-color-base;\n\n &:last-child {\n &,\n & > .@{collapse-prefix-cls}-header {\n border-radius: 0 0 @collapse-panel-border-radius @collapse-panel-border-radius;\n }\n }\n\n > .@{collapse-prefix-cls}-header {\n position: relative; // Compatible with old version of antd, should remove in next version\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n padding: @collapse-header-padding;\n color: @heading-color;\n line-height: @line-height-base;\n cursor: pointer;\n transition: all 0.3s, visibility 0s;\n\n .@{collapse-prefix-cls}-arrow {\n display: inline-block;\n margin-right: @margin-sm;\n font-size: @font-size-sm;\n vertical-align: -1px;\n\n & svg {\n transition: transform 0.24s;\n }\n }\n\n .@{collapse-prefix-cls}-extra {\n margin-left: auto;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n .@{collapse-prefix-cls}-header-collapsible-only {\n cursor: default;\n .@{collapse-prefix-cls}-header-text {\n cursor: pointer;\n }\n }\n\n &.@{collapse-prefix-cls}-no-arrow {\n > .@{collapse-prefix-cls}-header {\n padding-left: @padding-sm;\n }\n }\n }\n\n // Expand Icon end\n &-icon-position-end {\n & > .@{collapse-prefix-cls}-item {\n > .@{collapse-prefix-cls}-header {\n position: relative;\n padding: @collapse-header-padding;\n padding-right: @collapse-header-padding-extra;\n\n .@{collapse-prefix-cls}-arrow {\n position: absolute;\n top: 50%;\n right: @padding-md;\n left: auto;\n margin: 0;\n transform: translateY(-50%);\n }\n }\n }\n }\n\n &-content {\n color: @text-color;\n background-color: @collapse-content-bg;\n border-top: @border-width-base @border-style-base @border-color-base;\n\n & > &-box {\n padding: @collapse-content-padding;\n }\n\n &-hidden {\n display: none;\n }\n }\n\n &-item:last-child {\n > .@{collapse-prefix-cls}-content {\n border-radius: 0 0 @collapse-panel-border-radius @collapse-panel-border-radius;\n }\n }\n\n &-borderless {\n background-color: @collapse-header-bg;\n border: 0;\n }\n\n &-borderless > &-item {\n border-bottom: 1px solid @border-color-base;\n }\n\n &-borderless > &-item:last-child,\n &-borderless > &-item:last-child &-header {\n border-radius: 0;\n }\n\n // hide the last border-bottom in borderless mode\n &-borderless > &-item:last-child {\n border-bottom: 0;\n }\n\n &-borderless > &-item > &-content {\n background-color: transparent;\n border-top: 0;\n }\n\n &-borderless > &-item > &-content > &-content-box {\n padding-top: 4px;\n }\n\n &-ghost {\n background-color: transparent;\n border: 0;\n > .@{collapse-prefix-cls}-item {\n border-bottom: 0;\n > .@{collapse-prefix-cls}-content {\n background-color: transparent;\n border-top: 0;\n > .@{collapse-prefix-cls}-content-box {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n }\n }\n }\n\n & &-item-disabled > &-header {\n &,\n & > .arrow {\n color: @disabled-color;\n cursor: not-allowed;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@collapse-prefix-cls: ~'@{ant-prefix}-collapse';\n\n.@{collapse-prefix-cls} {\n &-rtl {\n direction: rtl;\n\n // Expand Icon end\n &.@{collapse-prefix-cls}.@{collapse-prefix-cls}-icon-position-end {\n & > .@{collapse-prefix-cls}-item {\n > .@{collapse-prefix-cls}-header {\n position: relative;\n padding: @collapse-header-padding;\n padding-left: @collapse-header-padding-extra;\n\n .@{collapse-prefix-cls}-arrow {\n position: absolute;\n top: 50%;\n right: auto;\n left: @padding-md;\n margin: 0;\n transform: translateY(-50%);\n }\n }\n }\n }\n }\n\n & > &-item {\n > .@{collapse-prefix-cls}-header {\n .@{collapse-prefix-cls}-rtl & {\n padding: @collapse-header-padding;\n padding-right: @collapse-header-padding-extra;\n }\n\n .@{collapse-prefix-cls}-arrow {\n .@{collapse-prefix-cls}-rtl& {\n margin-right: 0;\n margin-left: @margin-sm;\n }\n\n & svg {\n .@{collapse-prefix-cls}-rtl& {\n transform: rotate(180deg);\n }\n }\n }\n\n .@{collapse-prefix-cls}-extra {\n .@{collapse-prefix-cls}-rtl& {\n margin-right: auto;\n margin-left: 0;\n }\n }\n }\n\n &.@{collapse-prefix-cls}-no-arrow {\n > .@{collapse-prefix-cls}-header {\n .@{collapse-prefix-cls}-rtl& {\n padding-right: @padding-sm;\n padding-left: 0;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@comment-prefix-cls: ~'@{ant-prefix}-comment';\n\n.@{comment-prefix-cls} {\n position: relative;\n background-color: @comment-bg;\n\n &-inner {\n display: flex;\n padding: @comment-padding-base;\n }\n\n &-avatar {\n position: relative;\n flex-shrink: 0;\n margin-right: @margin-sm;\n cursor: pointer;\n\n img {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n }\n }\n\n &-content {\n position: relative;\n flex: 1 1 auto;\n min-width: 1px;\n font-size: @comment-font-size-base;\n word-wrap: break-word;\n\n &-author {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n margin-bottom: @margin-xss;\n font-size: @comment-font-size-base;\n\n & > a,\n & > span {\n padding-right: @padding-xs;\n font-size: @comment-font-size-sm;\n line-height: 18px;\n }\n\n &-name {\n color: @comment-author-name-color;\n font-size: @comment-font-size-base;\n transition: color 0.3s;\n\n > * {\n color: @comment-author-name-color;\n\n &:hover {\n color: @comment-author-name-color;\n }\n }\n }\n\n &-time {\n color: @comment-author-time-color;\n white-space: nowrap;\n cursor: auto;\n }\n }\n\n &-detail p {\n margin-bottom: @comment-content-detail-p-margin-bottom;\n white-space: pre-wrap;\n }\n }\n\n &-actions {\n margin-top: @comment-actions-margin-top;\n margin-bottom: @comment-actions-margin-bottom;\n padding-left: 0;\n\n > li {\n display: inline-block;\n color: @comment-action-color;\n\n > span {\n margin-right: 10px;\n color: @comment-action-color;\n font-size: @comment-font-size-sm;\n cursor: pointer;\n transition: color 0.3s;\n user-select: none;\n\n &:hover {\n color: @comment-action-hover-color;\n }\n }\n }\n }\n\n &-nested {\n margin-left: @comment-nest-indent;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@comment-prefix-cls: ~'@{ant-prefix}-comment';\n\n.@{comment-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-avatar {\n .@{comment-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 12px;\n }\n }\n\n &-content {\n &-author {\n & > a,\n & > span {\n .@{comment-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 8px;\n }\n }\n }\n }\n\n &-actions {\n .@{comment-prefix-cls}-rtl & {\n padding-right: 0;\n }\n\n > li {\n > span {\n .@{comment-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 10px;\n }\n }\n }\n }\n\n &-nested {\n .@{comment-prefix-cls}-rtl & {\n margin-right: @comment-nest-indent;\n margin-left: 0;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@descriptions-prefix-cls: ~'@{ant-prefix}-descriptions';\n\n.@{descriptions-prefix-cls} {\n &-header {\n display: flex;\n align-items: center;\n margin-bottom: @descriptions-title-margin-bottom;\n }\n\n &-title {\n flex: auto;\n overflow: hidden;\n color: @heading-color;\n font-weight: bold;\n font-size: @font-size-lg;\n line-height: @line-height-base;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-extra {\n margin-left: auto;\n color: @descriptions-extra-color;\n font-size: @font-size-base;\n }\n\n &-view {\n width: 100%;\n border-radius: @border-radius-base;\n\n table {\n width: 100%;\n table-layout: fixed;\n }\n }\n\n &-row {\n > th,\n > td {\n padding-bottom: @descriptions-item-padding-bottom;\n }\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n &-item-label {\n color: @heading-color;\n font-weight: normal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n text-align: start;\n\n &::after {\n & when (@descriptions-item-trailing-colon=true) {\n content: ':';\n }\n & when not (@descriptions-item-trailing-colon=true) {\n content: ' ';\n }\n\n position: relative;\n top: -0.5px;\n margin: 0 @descriptions-item-label-colon-margin-right 0\n @descriptions-item-label-colon-margin-left;\n }\n\n &.@{descriptions-prefix-cls}-item-no-colon::after {\n content: ' ';\n }\n }\n\n &-item-no-label {\n &::after {\n margin: 0;\n content: '';\n }\n }\n\n &-item-content {\n display: table-cell;\n flex: 1;\n color: @text-color;\n font-size: @font-size-base;\n line-height: @line-height-base;\n word-break: break-word;\n overflow-wrap: break-word;\n }\n\n &-item {\n padding-bottom: 0;\n vertical-align: top;\n\n &-container {\n display: flex;\n\n .@{descriptions-prefix-cls}-item-label,\n .@{descriptions-prefix-cls}-item-content {\n display: inline-flex;\n align-items: baseline;\n }\n }\n }\n\n &-middle {\n .@{descriptions-prefix-cls}-row {\n > th,\n > td {\n padding-bottom: @padding-sm;\n }\n }\n }\n\n &-small {\n .@{descriptions-prefix-cls}-row {\n > th,\n > td {\n padding-bottom: @padding-xs;\n }\n }\n }\n\n &-bordered {\n .@{descriptions-prefix-cls}-view {\n border: 1px solid @border-color-split;\n\n > table {\n table-layout: auto;\n border-collapse: collapse;\n }\n }\n\n .@{descriptions-prefix-cls}-item-label,\n .@{descriptions-prefix-cls}-item-content {\n padding: @descriptions-default-padding;\n border-right: 1px solid @border-color-split;\n\n &:last-child {\n border-right: none;\n }\n }\n\n .@{descriptions-prefix-cls}-item-label {\n background-color: @descriptions-bg;\n\n &::after {\n display: none;\n }\n }\n\n .@{descriptions-prefix-cls}-row {\n border-bottom: 1px solid @border-color-split;\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n &.@{descriptions-prefix-cls}-middle {\n .@{descriptions-prefix-cls}-item-label,\n .@{descriptions-prefix-cls}-item-content {\n padding: @descriptions-middle-padding;\n }\n }\n\n &.@{descriptions-prefix-cls}-small {\n .@{descriptions-prefix-cls}-item-label,\n .@{descriptions-prefix-cls}-item-content {\n padding: @descriptions-small-padding;\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@descriptions-prefix-cls: ~'@{ant-prefix}-descriptions';\n\n.@{descriptions-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-item-label {\n &::after {\n .@{descriptions-prefix-cls}-rtl & {\n margin: 0 @descriptions-item-label-colon-margin-left 0\n @descriptions-item-label-colon-margin-right;\n }\n }\n }\n\n &-bordered {\n .@{descriptions-prefix-cls}-item-label,\n .@{descriptions-prefix-cls}-item-content {\n .@{descriptions-prefix-cls}-rtl& {\n border-right: none;\n border-left: 1px solid @border-color-split;\n\n &:last-child {\n border-left: none;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@divider-prefix-cls: ~'@{ant-prefix}-divider';\n\n.@{divider-prefix-cls} {\n .reset-component();\n\n border-top: @border-width-base solid @divider-color;\n\n &-vertical {\n position: relative;\n top: -0.06em;\n display: inline-block;\n height: 0.9em;\n margin: 0 @divider-vertical-gutter;\n vertical-align: middle;\n border-top: 0;\n border-left: @border-width-base solid @divider-color;\n }\n\n &-horizontal {\n display: flex;\n clear: both;\n width: 100%;\n min-width: 100%; // Fix https://github.com/ant-design/ant-design/issues/10914\n margin: 24px 0;\n }\n\n &-horizontal&-with-text {\n display: flex;\n margin: 16px 0;\n color: @heading-color;\n font-weight: 500;\n font-size: @font-size-lg;\n white-space: nowrap;\n text-align: center;\n border-top: 0;\n border-top-color: @divider-color;\n\n &::before,\n &::after {\n position: relative;\n top: 50%;\n width: 50%;\n border-top: @border-width-base solid transparent;\n // Chrome not accept `inherit` in `border-top`\n border-top-color: inherit;\n border-bottom: 0;\n transform: translateY(50%);\n content: '';\n }\n }\n\n &-horizontal&-with-text-left {\n &::before {\n top: 50%;\n width: @divider-orientation-margin;\n }\n\n &::after {\n top: 50%;\n width: 100% - @divider-orientation-margin;\n }\n }\n\n &-horizontal&-with-text-right {\n &::before {\n top: 50%;\n width: 100% - @divider-orientation-margin;\n }\n\n &::after {\n top: 50%;\n width: @divider-orientation-margin;\n }\n }\n\n &-inner-text {\n display: inline-block;\n padding: 0 @divider-text-padding;\n }\n\n &-dashed {\n background: none;\n border-color: @divider-color;\n border-style: dashed;\n border-width: @border-width-base 0 0;\n }\n\n &-horizontal&-with-text&-dashed {\n &::before,\n &::after {\n border-style: dashed none none;\n }\n }\n\n &-vertical&-dashed {\n border-width: 0 0 0 @border-width-base;\n }\n\n &-plain&-with-text {\n color: @text-color;\n font-weight: normal;\n font-size: @font-size-base;\n }\n\n &-horizontal&-with-text-left&-no-default-orientation-margin-left {\n &::before {\n width: 0;\n }\n\n &::after {\n width: 100%;\n }\n\n .@{divider-prefix-cls}-inner-text {\n padding-left: 0;\n }\n }\n\n &-horizontal&-with-text-right&-no-default-orientation-margin-right {\n &::before {\n width: 100%;\n }\n\n &::after {\n width: 0;\n }\n\n .@{divider-prefix-cls}-inner-text {\n padding-right: 0;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@divider-prefix-cls: ~'@{ant-prefix}-divider';\n\n.@{divider-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-horizontal&-with-text-left {\n &::before {\n .@{divider-prefix-cls}-rtl& {\n width: 100% - @divider-orientation-margin;\n }\n }\n\n &::after {\n .@{divider-prefix-cls}-rtl& {\n width: @divider-orientation-margin;\n }\n }\n }\n\n &-horizontal&-with-text-right {\n &::before {\n .@{divider-prefix-cls}-rtl& {\n width: @divider-orientation-margin;\n }\n }\n\n &::after {\n .@{divider-prefix-cls}-rtl& {\n width: 100% - @divider-orientation-margin;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n\n@drawer-prefix-cls: ~'@{ant-prefix}-drawer';\n@picker-prefix-cls: ~'@{ant-prefix}-picker';\n@drawer-animation-ease: @ease-out-quint;\n\n.@{drawer-prefix-cls} {\n position: fixed;\n z-index: @zindex-modal;\n pointer-events: none;\n inset: 0;\n\n &-inline {\n position: absolute;\n }\n\n // ====================== Mask ======================\n &-mask {\n position: absolute;\n z-index: @zindex-modal;\n background: @modal-mask-bg;\n pointer-events: auto;\n inset: 0;\n }\n\n // ==================== Content =====================\n &-content-wrapper {\n position: absolute;\n z-index: @zindex-modal;\n transition: transform @animation-duration-slow;\n\n // Placement\n .@{drawer-prefix-cls}-left & {\n top: 0;\n bottom: 0;\n left: 0;\n }\n\n .@{drawer-prefix-cls}-right & {\n top: 0;\n right: 0;\n bottom: 0;\n }\n\n .@{drawer-prefix-cls}-top & {\n top: 0;\n right: 0;\n left: 0;\n }\n\n .@{drawer-prefix-cls}-bottom & {\n right: 0;\n bottom: 0;\n left: 0;\n }\n }\n\n &-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n pointer-events: auto;\n\n &-hidden {\n display: none;\n }\n\n // Placement\n .@{drawer-prefix-cls}-left & {\n box-shadow: @shadow-1-right;\n }\n\n .@{drawer-prefix-cls}-right & {\n box-shadow: @shadow-1-left;\n }\n\n .@{drawer-prefix-cls}-top & {\n box-shadow: @shadow-1-down;\n }\n\n .@{drawer-prefix-cls}-bottom & {\n box-shadow: @shadow-1-up;\n }\n }\n\n // @drawer-footer-padding-vertical: @modal-footer-padding-vertical;\n // @drawer-footer-padding-horizontal: @modal-footer-padding-horizontal;\n // @drawer-header-close-size: 56px;\n // ===================== Panel ======================\n &-wrapper-body {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: @drawer-bg;\n }\n\n // Header\n &-header {\n display: flex;\n flex: 0;\n align-items: center;\n padding: @drawer-header-padding;\n font-size: @drawer-title-font-size;\n line-height: @drawer-title-line-height;\n border-bottom: @border-width-base @border-style-base @border-color-split;\n\n &-title {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n min-height: 0;\n }\n }\n\n &-extra {\n flex: 0;\n }\n\n &-close {\n display: inline-block;\n margin-right: 12px;\n color: @modal-close-color;\n font-weight: 700;\n font-size: @font-size-lg;\n font-style: normal;\n line-height: 1;\n text-align: center;\n text-transform: none;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color @animation-duration-slow;\n text-rendering: auto;\n\n &:focus,\n &:hover {\n color: @icon-color-hover;\n text-decoration: none;\n }\n }\n\n &-title {\n flex: 1;\n margin: 0;\n color: @heading-color;\n font-weight: 500;\n font-size: @drawer-title-font-size;\n line-height: @drawer-title-line-height;\n }\n\n // Body\n &-body {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: @drawer-body-padding;\n overflow: auto;\n }\n\n // Footer\n &-footer {\n flex-shrink: 0;\n padding: @drawer-footer-padding-vertical @drawer-footer-padding-horizontal;\n border-top: @border-width-base @border-style-base @border-color-split;\n }\n}\n\n// .@{drawer-prefix-cls} {\n// @drawer-header-close-padding: ceil(((@drawer-header-close-size - @font-size-lg) / 2));\n\n// position: fixed;\n// z-index: @zindex-modal;\n// width: 0%;\n// height: 100%;\n// transition: width 0s ease @animation-duration-slow, height 0s ease @animation-duration-slow;\n\n// &-content-wrapper {\n// position: absolute;\n// width: 100%;\n// height: 100%;\n// transition: transform @animation-duration-slow @drawer-animation-ease,\n// box-shadow @animation-duration-slow @drawer-animation-ease;\n// }\n\n// .@{drawer-prefix-cls}-content {\n// width: 100%;\n// height: 100%;\n// }\n\n// &-left,\n// &-right {\n// top: 0;\n// width: 0%;\n// height: 100%;\n// .@{drawer-prefix-cls}-content-wrapper {\n// height: 100%;\n// }\n// &.@{drawer-prefix-cls}-open {\n// width: 100%;\n// transition: transform @animation-duration-slow @drawer-animation-ease;\n// }\n// }\n\n// &-left {\n// left: 0;\n\n// .@{drawer-prefix-cls} {\n// &-content-wrapper {\n// left: 0;\n// }\n// }\n\n// &.@{drawer-prefix-cls}-open {\n// .@{drawer-prefix-cls}-content-wrapper {\n// box-shadow: @shadow-1-right;\n// }\n// }\n// }\n\n// &-right {\n// right: 0;\n\n// .@{drawer-prefix-cls} {\n// &-content-wrapper {\n// right: 0;\n// }\n// }\n// &.@{drawer-prefix-cls}-open {\n// .@{drawer-prefix-cls}-content-wrapper {\n// box-shadow: @shadow-1-left;\n// }\n// // https://github.com/ant-design/ant-design/issues/18607, Avoid edge alignment bug.\n// &.no-mask {\n// right: 1px;\n// transform: translateX(1px);\n// }\n// }\n// }\n\n// &-top,\n// &-bottom {\n// left: 0;\n// width: 100%;\n// height: 0%;\n\n// .@{drawer-prefix-cls}-content-wrapper {\n// width: 100%;\n// }\n// &.@{drawer-prefix-cls}-open {\n// height: 100%;\n// transition: transform @animation-duration-slow @drawer-animation-ease;\n// }\n// }\n\n// &-top {\n// top: 0;\n\n// &.@{drawer-prefix-cls}-open {\n// .@{drawer-prefix-cls}-content-wrapper {\n// box-shadow: @shadow-1-down;\n// }\n// }\n// }\n\n// &-bottom {\n// bottom: 0;\n\n// .@{drawer-prefix-cls} {\n// &-content-wrapper {\n// bottom: 0;\n// }\n// }\n// &.@{drawer-prefix-cls}-open {\n// .@{drawer-prefix-cls}-content-wrapper {\n// box-shadow: @shadow-1-up;\n// }\n\n// &.no-mask {\n// bottom: 1px;\n// transform: translateY(1px);\n// }\n// }\n// }\n\n// &.@{drawer-prefix-cls}-open .@{drawer-prefix-cls}-mask {\n// height: 100%;\n// opacity: 1;\n// transition: none;\n// animation: antdDrawerFadeIn @animation-duration-slow @drawer-animation-ease;\n// pointer-events: auto;\n// }\n\n// &-title {\n// flex: 1;\n// margin: 0;\n// color: @heading-color;\n// font-weight: 500;\n// font-size: @drawer-title-font-size;\n// line-height: @drawer-title-line-height;\n// }\n\n// &-content {\n// position: relative;\n// z-index: 1;\n// overflow: auto;\n// background-color: @drawer-bg;\n// background-clip: padding-box;\n// border: 0;\n// }\n\n// &-close {\n// display: inline-block;\n// margin-right: 12px;\n// color: @modal-close-color;\n// font-weight: 700;\n// font-size: @font-size-lg;\n// font-style: normal;\n// line-height: 1;\n// text-align: center;\n// text-transform: none;\n// text-decoration: none;\n// background: transparent;\n// border: 0;\n// outline: 0;\n// cursor: pointer;\n// transition: color @animation-duration-slow;\n// text-rendering: auto;\n\n// &:focus,\n// &:hover {\n// color: @icon-color-hover;\n// text-decoration: none;\n// }\n// }\n\n// &-header {\n// position: relative;\n// display: flex;\n// align-items: center;\n// justify-content: space-between;\n// padding: @drawer-header-padding;\n// color: @text-color;\n// background: @drawer-bg;\n// border-bottom: @border-width-base @border-style-base @border-color-split;\n// border-radius: @border-radius-base @border-radius-base 0 0;\n\n// &-title {\n// display: flex;\n// flex: 1;\n// align-items: center;\n// justify-content: space-between;\n// }\n\n// &-close-only {\n// padding-bottom: 0;\n// border: none;\n// }\n// }\n\n// &-wrapper-body {\n// display: flex;\n// flex-flow: column nowrap;\n// width: 100%;\n// height: 100%;\n// }\n\n// &-body {\n// flex-grow: 1;\n// padding: @drawer-body-padding;\n// overflow: auto;\n// font-size: @font-size-base;\n// line-height: @line-height-base;\n// word-wrap: break-word;\n// }\n\n// &-footer {\n// flex-shrink: 0;\n// padding: @drawer-footer-padding-vertical @drawer-footer-padding-horizontal;\n// border-top: @border-width-base @border-style-base @border-color-split;\n// }\n\n// &-mask {\n// position: absolute;\n// top: 0;\n// left: 0;\n// width: 100%;\n// height: 0;\n// background-color: @modal-mask-bg;\n// opacity: 0;\n// transition: opacity @animation-duration-slow linear, height 0s ease @animation-duration-slow;\n// pointer-events: none;\n// }\n\n// // =================== Hook Components ===================\n// .@{picker-prefix-cls} {\n// &-clear {\n// background: @popover-background;\n// }\n// }\n// }\n\n// @keyframes antdDrawerFadeIn {\n// 0% {\n// opacity: 0;\n// }\n\n// 100% {\n// opacity: 1;\n// }\n// }\n","/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-drawer {\n position: fixed;\n z-index: 1000;\n pointer-events: none;\n inset: 0;\n}\n.ant-drawer-inline {\n position: absolute;\n}\n.ant-drawer-mask {\n position: absolute;\n z-index: 1000;\n background: rgba(0, 0, 0, 0.45);\n pointer-events: auto;\n inset: 0;\n}\n.ant-drawer-content-wrapper {\n position: absolute;\n z-index: 1000;\n transition: transform 0.3s;\n}\n.ant-drawer-left .ant-drawer-content-wrapper {\n top: 0;\n bottom: 0;\n left: 0;\n}\n.ant-drawer-right .ant-drawer-content-wrapper {\n top: 0;\n right: 0;\n bottom: 0;\n}\n.ant-drawer-top .ant-drawer-content-wrapper {\n top: 0;\n right: 0;\n left: 0;\n}\n.ant-drawer-bottom .ant-drawer-content-wrapper {\n right: 0;\n bottom: 0;\n left: 0;\n}\n.ant-drawer-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n pointer-events: auto;\n}\n.ant-drawer-content-hidden {\n display: none;\n}\n.ant-drawer-left .ant-drawer-content {\n box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-right .ant-drawer-content {\n box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-top .ant-drawer-content {\n box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-bottom .ant-drawer-content {\n box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-wrapper-body {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: #fff;\n}\n.ant-drawer-header {\n display: flex;\n flex: 0;\n align-items: center;\n padding: 16px 24px;\n font-size: 16px;\n line-height: 22px;\n border-bottom: 1px solid #f0f0f0;\n}\n.ant-drawer-header-title {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n min-height: 0;\n}\n.ant-drawer-extra {\n flex: 0;\n}\n.ant-drawer-close {\n display: inline-block;\n margin-right: 12px;\n color: rgba(0, 0, 0, 0.45);\n font-weight: 700;\n font-size: 16px;\n font-style: normal;\n line-height: 1;\n text-align: center;\n text-transform: none;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color 0.3s;\n text-rendering: auto;\n}\n.ant-drawer-close:focus,\n.ant-drawer-close:hover {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n}\n.ant-drawer-title {\n flex: 1;\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n}\n.ant-drawer-body {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 24px;\n overflow: auto;\n}\n.ant-drawer-footer {\n flex-shrink: 0;\n padding: 10px 16px;\n border-top: 1px solid #f0f0f0;\n}\n.panel-motion-enter-active,\n.panel-motion-appear-active,\n.panel-motion-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active,\n.ant-drawer-mask-motion-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter,\n.ant-drawer-mask-motion-appear {\n opacity: 0;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active {\n opacity: 1;\n}\n.ant-drawer-mask-motion-leave {\n opacity: 1;\n}\n.ant-drawer-mask-motion-leave-active {\n opacity: 0;\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active,\n.ant-drawer-panel-motion-left-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-left-enter,\n.ant-drawer-panel-motion-left-appear {\n transform: translateX(-100%);\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave-active {\n transform: translateX(-100%);\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active,\n.ant-drawer-panel-motion-right-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-right-enter,\n.ant-drawer-panel-motion-right-appear {\n transform: translateX(100%);\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave {\n transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave-active {\n transform: translateX(100%);\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active,\n.ant-drawer-panel-motion-top-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-top-enter,\n.ant-drawer-panel-motion-top-appear {\n transform: translateY(-100%);\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave-active {\n transform: translateY(-100%);\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active,\n.ant-drawer-panel-motion-bottom-leave-active {\n transition: all 0.3s;\n}\n.ant-drawer-panel-motion-bottom-enter,\n.ant-drawer-panel-motion-bottom-appear {\n transform: translateY(100%);\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave {\n transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave-active {\n transform: translateY(100%);\n}\n.ant-drawer-rtl {\n direction: rtl;\n}\n.ant-drawer-rtl .ant-drawer-close {\n margin-right: 0;\n margin-left: 12px;\n}\n","@import (reference) '../../style/themes/index';\n\n@drawer-prefix-cls: ~'@{ant-prefix}-drawer';\n\n.panel-motion {\n &-enter,\n &-appear,\n &-leave {\n &-active {\n transition: all @animation-duration-slow;\n }\n }\n}\n\n.@{drawer-prefix-cls} {\n // ======================== Mask ========================\n &-mask-motion {\n &-enter,\n &-appear,\n &-leave {\n &-active {\n transition: all @animation-duration-slow;\n }\n }\n\n &-enter,\n &-appear {\n opacity: 0;\n\n &-active {\n opacity: 1;\n }\n }\n\n &-leave {\n opacity: 1;\n\n &-active {\n opacity: 0;\n }\n }\n }\n\n // ======================= Panel ========================\n &-panel-motion {\n // Left\n &-left {\n .panel-motion();\n\n &-enter,\n &-appear {\n transform: translateX(-100%);\n\n &-active {\n transform: translateX(0);\n }\n }\n\n &-leave {\n transform: translateX(0);\n\n &-active {\n transform: translateX(-100%);\n }\n }\n }\n\n // Right\n &-right {\n .panel-motion();\n\n &-enter,\n &-appear {\n transform: translateX(100%);\n\n &-active {\n transform: translateX(0);\n }\n }\n\n &-leave {\n transform: translateX(0);\n\n &-active {\n transform: translateX(100%);\n }\n }\n }\n\n // Top\n &-top {\n .panel-motion();\n\n &-enter,\n &-appear {\n transform: translateY(-100%);\n\n &-active {\n transform: translateY(0);\n }\n }\n\n &-leave {\n transform: translateY(0);\n\n &-active {\n transform: translateY(-100%);\n }\n }\n }\n\n // Bottom\n &-bottom {\n .panel-motion();\n\n &-enter,\n &-appear {\n transform: translateY(100%);\n\n &-active {\n transform: translateY(0);\n }\n }\n\n &-leave {\n transform: translateY(0);\n\n &-active {\n transform: translateY(100%);\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n\n@drawer-prefix-cls: ~'@{ant-prefix}-drawer';\n\n.@{drawer-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-close {\n .@{drawer-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 12px;\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n// ================================================================\n// = Children Component =\n// ================================================================\n// FIXME: useless, remove in v5\n.@{form-item-prefix-cls} {\n .@{ant-prefix}-input-number {\n + .@{form-prefix-cls}-text {\n margin-left: 8px;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import '../../button/style/mixin';\n@import '../../grid/style/mixin';\n@import './components';\n@import './inline';\n@import './horizontal';\n@import './vertical';\n@import './status';\n@import './mixin';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n@form-font-height: ceil(@font-size-base * @line-height-base);\n\n.@{form-prefix-cls} {\n .reset-component();\n .reset-form();\n\n .@{form-prefix-cls}-text {\n display: inline-block;\n padding-right: 8px;\n }\n\n // ================================================================\n // = Size =\n // ================================================================\n .formSize(@input-height) {\n .@{form-item-prefix-cls}-label > label {\n height: @input-height;\n }\n\n .@{form-item-prefix-cls}-control-input {\n min-height: @input-height;\n }\n }\n\n &-small {\n .formSize(@input-height-sm);\n }\n\n &-large {\n .formSize(@input-height-lg);\n }\n}\n\n.explainAndExtraDistance(@num) when (@num >= 0) {\n padding-top: floor(@num);\n}\n\n.explainAndExtraDistance(@num) when (@num < 0) {\n margin-top: ceil(@num);\n margin-bottom: ceil(@num);\n}\n\n// ================================================================\n// = Item =\n// ================================================================\n.@{form-item-prefix-cls} {\n .reset-component();\n\n margin-bottom: @form-item-margin-bottom;\n vertical-align: top;\n\n &-with-help {\n transition: none;\n }\n\n &-hidden,\n &-hidden.@{ant-prefix}-row {\n // https://github.com/ant-design/ant-design/issues/26141\n display: none;\n }\n\n // ==============================================================\n // = Label =\n // ==============================================================\n &-label {\n display: inline-block;\n flex-grow: 0;\n overflow: hidden;\n white-space: nowrap;\n text-align: right;\n vertical-align: middle;\n\n &-left {\n text-align: left;\n }\n\n &-wrap {\n overflow: unset;\n line-height: (@line-height-base - 0.25em);\n white-space: unset;\n }\n\n > label {\n position: relative;\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: @form-item-label-height;\n color: @label-color;\n font-size: @form-item-label-font-size;\n\n > .@{iconfont-css-prefix} {\n font-size: @form-item-label-font-size;\n vertical-align: top;\n }\n\n // Required mark\n &.@{form-item-prefix-cls}-required:not(.@{form-item-prefix-cls}-required-mark-optional)::before {\n display: inline-block;\n margin-right: 4px;\n color: @label-required-color;\n font-size: @form-item-label-font-size;\n font-family: SimSun, sans-serif;\n line-height: 1;\n content: '*';\n\n .@{form-prefix-cls}-hide-required-mark & {\n display: none;\n }\n }\n\n // Optional mark\n .@{form-item-prefix-cls}-optional {\n display: inline-block;\n margin-left: @margin-xss;\n color: @text-color-secondary;\n\n .@{form-prefix-cls}-hide-required-mark & {\n display: none;\n }\n }\n\n // Optional mark\n .@{form-item-prefix-cls}-tooltip {\n color: @text-color-secondary;\n cursor: help;\n writing-mode: horizontal-tb;\n margin-inline-start: @margin-xss;\n }\n\n &::after {\n & when (@form-item-trailing-colon=true) {\n content: ':';\n }\n & when not (@form-item-trailing-colon=true) {\n content: ' ';\n }\n\n position: relative;\n top: -0.5px;\n margin: 0 @form-item-label-colon-margin-right 0 @form-item-label-colon-margin-left;\n }\n\n &.@{form-item-prefix-cls}-no-colon::after {\n content: ' ';\n }\n }\n }\n\n // ==============================================================\n // = Input =\n // ==============================================================\n &-control {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n\n &:first-child:not([class^=~\"'@{ant-prefix}-col-'\"]):not([class*=~\"' @{ant-prefix}-col-'\"]) {\n width: 100%;\n }\n }\n\n &-control-input {\n position: relative;\n display: flex;\n align-items: center;\n min-height: @input-height-base;\n\n &-content {\n flex: auto;\n max-width: 100%;\n }\n }\n\n // ==============================================================\n // = Explain =\n // ==============================================================\n &-explain,\n &-extra {\n clear: both;\n color: @text-color-secondary;\n font-size: @font-size-base;\n line-height: @line-height-base;\n transition: color 0.3s @ease-out; // sync input color transition\n .explainAndExtraDistance((@form-item-margin-bottom - @form-font-height) / 2);\n }\n\n &-explain-connected {\n width: 100%;\n }\n\n &-extra {\n min-height: @form-item-margin-bottom;\n }\n\n &-with-help &-explain {\n height: auto;\n // min-height: @form-item-margin-bottom;\n opacity: 1;\n }\n\n // ==============================================================\n // = Feedback Icon =\n // ==============================================================\n &-feedback-icon {\n font-size: @font-size-base;\n text-align: center;\n visibility: visible;\n animation: zoomIn 0.3s @ease-out-back;\n pointer-events: none;\n\n &-success {\n color: @success-color;\n }\n\n &-error {\n color: @error-color;\n }\n\n &-warning {\n color: @warning-color;\n }\n\n &-validating {\n color: @primary-color;\n }\n }\n}\n\n// >>>>>>>>>> Motion <<<<<<<<<<\n// Explain holder\n.@{ant-prefix}-show-help {\n transition: opacity @animation-duration-slow @ease-in-out;\n\n &-appear,\n &-enter {\n opacity: 0;\n\n &-active {\n opacity: 1;\n }\n }\n\n &-leave {\n opacity: 1;\n\n &-active {\n opacity: 0;\n }\n }\n}\n\n// Explain\n.@{ant-prefix}-show-help-item {\n overflow: hidden;\n transition: height @animation-duration-slow @ease-in-out,\n opacity @animation-duration-slow @ease-in-out, transform @animation-duration-slow @ease-in-out !important;\n\n &-appear,\n &-enter {\n transform: translateY(-5px);\n opacity: 0;\n\n &-active {\n transform: translateY(0);\n opacity: 1;\n }\n }\n\n &-leave {\n transition: height @animation-duration-base @ease-in-out,\n opacity @animation-duration-base @ease-in-out, transform @animation-duration-base @ease-in-out !important;\n }\n\n &-leave-active {\n transform: translateY(-5px);\n }\n}\n\n// need there different zoom animation\n// otherwise won't trigger anim\n@keyframes diffZoomIn1 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes diffZoomIn2 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes diffZoomIn3 {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import (reference) '../../style/themes/index';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n.@{form-prefix-cls}-inline {\n display: flex;\n flex-wrap: wrap;\n\n .@{form-prefix-cls}-item {\n flex: none;\n flex-wrap: nowrap;\n margin-right: 16px;\n margin-bottom: 0;\n\n &-with-help {\n margin-bottom: @form-item-margin-bottom;\n }\n\n > .@{form-item-prefix-cls}-label,\n > .@{form-item-prefix-cls}-control {\n display: inline-block;\n vertical-align: top;\n }\n\n > .@{form-item-prefix-cls}-label {\n flex: none;\n }\n\n .@{form-prefix-cls}-text {\n display: inline-block;\n }\n\n .@{form-item-prefix-cls}-has-feedback {\n display: inline-block;\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n.@{form-prefix-cls}-horizontal {\n .@{form-item-prefix-cls}-label {\n flex-grow: 0;\n }\n .@{form-item-prefix-cls}-control {\n flex: 1 1 0;\n // https://github.com/ant-design/ant-design/issues/32777\n // https://github.com/ant-design/ant-design/issues/33773\n min-width: 0;\n }\n // https://github.com/ant-design/ant-design/issues/32980\n // https://github.com/ant-design/ant-design/issues/34903\n .@{form-item-prefix-cls}-label[class$='-24'] + .@{form-item-prefix-cls}-control,\n .@{form-item-prefix-cls}-label[class*='-24 '] + .@{form-item-prefix-cls}-control {\n min-width: unset;\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n// ================== Label ==================\n.make-vertical-layout-label() {\n & when (@form-vertical-label-margin > 0) {\n margin: @form-vertical-label-margin;\n }\n padding: @form-vertical-label-padding;\n line-height: @line-height-base;\n white-space: initial;\n text-align: left;\n\n > label {\n margin: 0;\n\n &::after {\n display: none;\n }\n }\n}\n\n.make-vertical-layout() {\n .@{form-prefix-cls}-item .@{form-prefix-cls}-item-label {\n .make-vertical-layout-label();\n }\n .@{form-prefix-cls} {\n .@{form-prefix-cls}-item {\n flex-wrap: wrap;\n .@{form-prefix-cls}-item-label,\n .@{form-prefix-cls}-item-control {\n flex: 0 0 100%;\n max-width: 100%;\n }\n }\n }\n}\n\n.@{form-prefix-cls}-vertical {\n .@{form-item-prefix-cls} {\n flex-direction: column;\n\n &-label > label {\n height: auto;\n }\n\n .@{form-prefix-cls}-item-control {\n width: 100%;\n }\n }\n}\n\n.@{form-prefix-cls}-vertical .@{form-item-prefix-cls}-label,\n/* when labelCol is 24, it is a vertical form */\n.@{ant-prefix}-col-24.@{form-item-prefix-cls}-label,\n.@{ant-prefix}-col-xl-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n}\n\n@media (max-width: @screen-xs-max) {\n .make-vertical-layout();\n .@{ant-prefix}-col-xs-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n }\n}\n\n@media (max-width: @screen-sm-max) {\n .@{ant-prefix}-col-sm-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n }\n}\n\n@media (max-width: @screen-md-max) {\n .@{ant-prefix}-col-md-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n }\n}\n\n@media (max-width: @screen-lg-max) {\n .@{ant-prefix}-col-lg-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n }\n}\n\n@media (max-width: @screen-xl-max) {\n .@{ant-prefix}-col-xl-24.@{form-item-prefix-cls}-label {\n .make-vertical-layout-label();\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import '../../button/style/mixin';\n@import '../../grid/style/mixin';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n.@{form-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n\n// ================================================================\n// = Item =\n// ================================================================\n.@{form-item-prefix-cls} {\n // ==============================================================\n // = Label =\n // ==============================================================\n &-label {\n .@{form-prefix-cls}-rtl & {\n text-align: left;\n }\n\n > label {\n &.@{form-item-prefix-cls}-required::before {\n .@{form-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n\n &::after {\n .@{form-prefix-cls}-rtl & {\n margin: 0 @form-item-label-colon-margin-left 0 @form-item-label-colon-margin-right;\n }\n }\n\n .@{form-item-prefix-cls}-optional {\n .@{form-prefix-cls}-rtl & {\n margin-right: @margin-xss;\n margin-left: 0;\n }\n }\n }\n }\n\n // ==============================================================\n // = Input =\n // ==============================================================\n &-control {\n .@{ant-prefix}-col-rtl &:first-child {\n width: 100%;\n }\n }\n\n // status\n &-has-feedback {\n .@{ant-prefix}-input {\n .@{form-prefix-cls}-rtl & {\n padding-right: @input-padding-horizontal-base;\n padding-left: 24px;\n }\n }\n\n .@{ant-prefix}-input-affix-wrapper {\n .@{ant-prefix}-input-suffix {\n .@{form-prefix-cls}-rtl & {\n padding-right: @input-padding-horizontal-base;\n padding-left: 18px;\n }\n }\n .@{ant-prefix}-input {\n .@{form-prefix-cls}-rtl & {\n padding: 0;\n }\n }\n }\n\n .@{ant-prefix}-input-number-affix-wrapper {\n .@{ant-prefix}-input-number {\n .@{form-prefix-cls}-rtl & {\n padding: 0;\n }\n }\n }\n\n .@{ant-prefix}-input-search:not(.@{ant-prefix}-input-search-enter-button) {\n .@{ant-prefix}-input-suffix {\n .@{form-prefix-cls}-rtl & {\n right: auto;\n left: 28px;\n }\n }\n }\n\n .@{ant-prefix}-input-number {\n .@{form-prefix-cls}-rtl & {\n padding-left: 18px;\n }\n }\n\n > .@{ant-prefix}-select .@{ant-prefix}-select-arrow,\n > .@{ant-prefix}-select .@{ant-prefix}-select-clear,\n :not(.@{ant-prefix}-input-group-addon) > .@{ant-prefix}-select .@{ant-prefix}-select-arrow,\n :not(.@{ant-prefix}-input-group-addon) > .@{ant-prefix}-select .@{ant-prefix}-select-clear,\n :not(.@{ant-prefix}-input-number-group-addon)\n > .@{ant-prefix}-select\n .@{ant-prefix}-select-arrow,\n :not(.@{ant-prefix}-input-number-group-addon)\n > .@{ant-prefix}-select\n .@{ant-prefix}-select-clear {\n .@{form-prefix-cls}-rtl & {\n right: auto;\n left: 32px;\n }\n }\n\n > .@{ant-prefix}-select .@{ant-prefix}-select-selection-selected-value,\n :not(.@{ant-prefix}-input-group-addon)\n > .@{ant-prefix}-select\n .@{ant-prefix}-select-selection-selected-value,\n :not(.@{ant-prefix}-input-number-group-addon)\n > .@{ant-prefix}-select\n .@{ant-prefix}-select-selection-selected-value {\n .@{form-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 42px;\n }\n }\n\n .@{ant-prefix}-cascader-picker {\n &-arrow {\n .@{form-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 19px;\n }\n }\n\n &-clear {\n .@{form-prefix-cls}-rtl & {\n right: auto;\n left: 32px;\n }\n }\n }\n\n .@{ant-prefix}-picker {\n .@{form-prefix-cls}-rtl & {\n padding-right: @input-padding-horizontal-base;\n padding-left: @input-padding-horizontal-base + @font-size-base * 1.3;\n }\n\n &-large {\n .@{form-prefix-cls}-rtl & {\n padding-right: @input-padding-horizontal-lg;\n padding-left: @input-padding-horizontal-lg + @font-size-base * 1.3;\n }\n }\n\n &-small {\n .@{form-prefix-cls}-rtl & {\n padding-right: @input-padding-horizontal-sm;\n padding-left: @input-padding-horizontal-sm + @font-size-base * 1.3;\n }\n }\n }\n\n &.@{form-item-prefix-cls} {\n &-has-success,\n &-has-warning,\n &-has-error,\n &-is-validating {\n // ====================== Icon ======================\n .@{form-item-prefix-cls}-children-icon {\n .@{form-prefix-cls}-rtl & {\n right: auto;\n left: 0;\n }\n }\n }\n }\n }\n}\n\n// inline\n.@{form-prefix-cls}-inline {\n .@{form-prefix-cls}-item {\n .@{form-prefix-cls}-rtl& {\n margin-right: 0;\n margin-left: 16px;\n }\n }\n}\n\n// vertical\n.make-vertical-layout-label() {\n .@{form-prefix-cls}-rtl& {\n text-align: right;\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@form-prefix-cls: ~'@{ant-prefix}-form';\n@form-item-prefix-cls: ~'@{form-prefix-cls}-item';\n\n.@{form-item-prefix-cls} {\n // ================================================================\n // = Status =\n // ================================================================\n\n /* Some non-status related component style is in `components.less` */\n\n // ========================= Explain =========================\n\n /* To support leave along ErrorList. We add additional className to handle explain style */\n &-explain {\n &-error {\n color: @error-color;\n }\n\n &-warning {\n color: @warning-color;\n }\n }\n\n &-has-feedback {\n // ======================== Switch =========================\n .@{ant-prefix}-switch {\n margin: 2px 0 4px;\n }\n }\n\n // ======================== Warning ========================\n &-has-warning {\n .form-control-validation(@warning-color; @warning-color; @form-warning-input-bg; @warning-color-hover; @warning-color-outline);\n }\n\n // ========================= Error =========================\n &-has-error {\n .form-control-validation(@error-color; @error-color; @form-error-input-bg; @error-color-hover; @error-color-outline);\n }\n}\n","@import '../../input/style/mixin';\n\n.form-control-validation(\n @text-color: @input-color;\n @border-color: @input-border-color;\n @background-color: @input-bg;\n @hoverBorderColor: @primary-color-hover;\n @outlineColor: @primary-color-outline;\n) {\n .@{ant-prefix}-form-item-split {\n color: @text-color;\n }\n}\n\n// Reset form styles\n// -----------------------------\n// Based on Bootstrap framework\n.reset-form() {\n legend {\n display: block;\n width: 100%;\n margin-bottom: 20px;\n padding: 0;\n color: @text-color-secondary;\n font-size: @font-size-lg;\n line-height: inherit;\n border: 0;\n border-bottom: @border-width-base @border-style-base @border-color-base;\n }\n\n label {\n font-size: @font-size-base;\n }\n\n input[type='search'] {\n box-sizing: border-box;\n }\n\n // Position radios and checkboxes better\n input[type='radio'],\n input[type='checkbox'] {\n line-height: normal;\n }\n\n input[type='file'] {\n display: block;\n }\n\n // Make range inputs behave like textual form controls\n input[type='range'] {\n display: block;\n width: 100%;\n }\n\n // Make multiple select elements height not fixed\n select[multiple],\n select[size] {\n height: auto;\n }\n\n // Focus for file, radio, and checkbox\n input[type='file']:focus,\n input[type='radio']:focus,\n input[type='checkbox']:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n }\n\n // Adjust output element\n output {\n display: block;\n padding-top: 15px;\n color: @input-color;\n font-size: @font-size-base;\n line-height: @line-height-base;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@image-prefix-cls: ~'@{ant-prefix}-image';\n@image-preview-prefix-cls: ~'@{image-prefix-cls}-preview';\n\n.@{image-prefix-cls} {\n position: relative;\n display: inline-block;\n\n &-img {\n width: 100%;\n height: auto;\n vertical-align: middle;\n\n &-placeholder {\n background-color: @image-bg;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=');\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 30%;\n }\n }\n\n &-mask {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: @text-color-inverse;\n background: fade(@black, 50%);\n cursor: pointer;\n opacity: 0;\n transition: opacity @animation-duration-slow;\n\n &-info {\n padding: 0 @padding-xss;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n .@{iconfont-css-prefix} {\n margin-inline-end: @margin-xss;\n }\n }\n\n &:hover {\n opacity: 1;\n }\n }\n\n &-placeholder {\n .box();\n }\n\n &-preview {\n .modal-mask();\n\n height: 100%;\n text-align: center;\n\n &-body {\n .box();\n overflow: hidden;\n }\n\n &-img {\n max-width: 100%;\n max-height: 100%;\n vertical-align: middle;\n transform: scale3d(1, 1, 1);\n cursor: grab;\n transition: transform 0.3s @ease-out 0s;\n user-select: none;\n pointer-events: auto;\n\n &-wrapper {\n .box();\n transition: transform 0.3s @ease-out 0s;\n\n &::before {\n display: inline-block;\n width: 1px;\n height: 50%;\n margin-right: -1px;\n content: '';\n }\n }\n }\n\n &-moving {\n .@{image-prefix-cls}-preview-img {\n cursor: grabbing;\n\n &-wrapper {\n transition-duration: 0s;\n }\n }\n }\n\n &-wrap {\n z-index: @zindex-image;\n }\n\n &-operations {\n .reset-component();\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: flex;\n flex-direction: row-reverse;\n align-items: center;\n width: 100%;\n color: @image-preview-operation-color;\n list-style: none;\n background: fade(@modal-mask-bg, 10%);\n pointer-events: auto;\n\n &-operation {\n margin-left: @control-padding-horizontal;\n padding: @control-padding-horizontal;\n cursor: pointer;\n\n &-disabled {\n color: @image-preview-operation-disabled-color;\n pointer-events: none;\n }\n\n &:last-of-type {\n margin-left: 0;\n }\n }\n\n &-progress {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n\n &-icon {\n font-size: @image-preview-operation-size;\n }\n }\n\n &-switch-left,\n &-switch-right {\n position: absolute;\n top: 50%;\n right: 10px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n margin-top: -22px;\n color: @image-preview-operation-color;\n background: fade(@modal-mask-bg, 10%);\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n\n &-disabled {\n color: @image-preview-operation-disabled-color;\n cursor: not-allowed;\n > .@{iconfont-css-prefix} {\n cursor: not-allowed;\n }\n }\n > .@{iconfont-css-prefix} {\n font-size: 18px;\n }\n }\n\n &-switch-left {\n left: 10px;\n }\n\n &-switch-right {\n right: 10px;\n }\n }\n}\n\n@root-entry-name: default;",".box(@position: absolute) {\n position: @position;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n","@import 'box';\n\n.modal-mask() {\n pointer-events: none;\n\n &.@{ant-prefix}-zoom-enter,\n &.@{ant-prefix}-zoom-appear {\n transform: none; // reset scale avoid mousePosition bug\n opacity: 0;\n animation-duration: @animation-duration-slow;\n user-select: none; // https://github.com/ant-design/ant-design/issues/11777\n }\n\n &-mask {\n .box(fixed);\n z-index: @zindex-modal-mask;\n height: 100%;\n background-color: @modal-mask-bg;\n\n &-hidden {\n display: none;\n }\n }\n\n &-wrap {\n .box(fixed);\n overflow: auto;\n outline: 0;\n }\n}\n","@import '../../input/style/mixin';\n@import (reference) '../../style/themes/index';\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n@input-affix-margin: 4px;\n\n.@{ant-prefix}-input-number {\n &-affix-wrapper {\n .input();\n // or number handler will cover form status\n position: relative;\n display: inline-flex;\n width: 90px;\n padding: 0;\n padding-inline-start: @input-padding-horizontal-base;\n\n &:not(&-disabled):hover {\n .hover();\n z-index: 1;\n }\n\n &-focused,\n &:focus {\n z-index: 1;\n }\n\n &-disabled {\n .@{ant-prefix}-input-number[disabled] {\n background: transparent;\n }\n }\n\n > div.@{ant-prefix}-input-number {\n width: 100%;\n border: none;\n outline: none;\n\n &.@{ant-prefix}-input-number-focused {\n box-shadow: none !important;\n }\n }\n\n input.@{ant-prefix}-input-number-input {\n padding: 0;\n }\n\n &::before {\n width: 0;\n visibility: hidden;\n content: '\\a0';\n }\n\n .@{ant-prefix}-input-number-handler-wrap {\n z-index: 2;\n }\n }\n\n &-prefix,\n &-suffix {\n display: flex;\n flex: none;\n align-items: center;\n pointer-events: none;\n }\n\n &-prefix {\n margin-inline-end: @input-affix-margin;\n }\n\n &-suffix {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n height: 100%;\n margin-right: @input-padding-horizontal-base;\n margin-left: @input-affix-margin;\n }\n}\n\n.@{ant-prefix}-input-number-group-wrapper .@{ant-prefix}-input-number-affix-wrapper {\n width: 100%;\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import './affix';\n@import './status';\n\n@input-number-prefix-cls: ~'@{ant-prefix}-input-number';\n@form-item-prefix-cls: ~'@{ant-prefix}-form-item';\n\n.@{input-number-prefix-cls} {\n .reset-component();\n .input();\n\n //== Style for input-group: input with label, with button or dropdown...\n &-group {\n .reset-component();\n .input-group(~'@{input-number-prefix-cls}');\n\n &-wrapper {\n display: inline-block;\n text-align: start;\n vertical-align: top; // https://github.com/ant-design/ant-design/issues/6403\n }\n }\n\n display: inline-block;\n width: 90px;\n margin: 0;\n padding: 0;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base;\n\n &-handler {\n position: relative;\n display: block;\n width: 100%;\n height: 50%;\n overflow: hidden;\n color: @text-color-secondary;\n font-weight: bold;\n line-height: 0;\n text-align: center;\n border-left: @border-width-base @border-style-base @input-number-handler-border-color;\n transition: all 0.1s linear;\n\n &:active {\n background: @input-number-handler-active-bg;\n }\n\n &:hover &-up-inner,\n &:hover &-down-inner {\n color: @input-number-handler-hover-bg;\n }\n }\n\n &-handler-up-inner,\n &-handler-down-inner {\n .iconfont-mixin();\n\n position: absolute;\n right: 4px;\n width: 12px;\n height: 12px;\n color: @text-color-secondary;\n line-height: 12px;\n transition: all 0.1s linear;\n user-select: none;\n }\n\n &:hover {\n .hover(@input-number-hover-border-color);\n & + .@{form-item-prefix-cls}-children-icon {\n opacity: 0;\n transition: opacity 0.24s linear 0.24s;\n }\n }\n\n &-focused {\n .active();\n }\n\n &-disabled {\n .disabled();\n .@{input-number-prefix-cls}-input {\n cursor: not-allowed;\n }\n .@{input-number-prefix-cls}-handler-wrap {\n display: none;\n }\n }\n\n &-readonly {\n .@{input-number-prefix-cls}-handler-wrap {\n display: none;\n }\n }\n\n &-input {\n width: 100%;\n height: @input-height-base - 2px;\n padding: 0 @control-padding-horizontal - 1px;\n text-align: left;\n background-color: transparent;\n border: 0;\n border-radius: @border-radius-base;\n outline: 0;\n transition: all 0.3s linear;\n appearance: textfield !important;\n .placeholder();\n\n &[type='number']::-webkit-inner-spin-button,\n &[type='number']::-webkit-outer-spin-button {\n margin: 0;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-appearance: none;\n appearance: none;\n }\n }\n\n &-lg {\n padding: 0;\n font-size: @font-size-lg;\n\n input {\n height: @input-height-lg - 2px;\n }\n }\n\n &-sm {\n padding: 0;\n\n input {\n height: @input-height-sm - 2px;\n padding: 0 @control-padding-horizontal-sm - 1px;\n }\n }\n\n &-handler-wrap {\n position: absolute;\n top: 0;\n right: 0;\n width: 22px;\n height: 100%;\n background: @input-number-handler-bg;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n opacity: 0;\n transition: opacity 0.24s linear 0.1s;\n\n // Fix input number inside Menu makes icon too large\n // We arise the selector priority by nest selector here\n // https://github.com/ant-design/ant-design/issues/14367\n .@{input-number-prefix-cls}-handler {\n .@{input-number-prefix-cls}-handler-up-inner,\n .@{input-number-prefix-cls}-handler-down-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: auto;\n margin-right: 0;\n font-size: 7px;\n }\n }\n\n .@{input-number-prefix-cls}-borderless & {\n border-left-width: 0;\n }\n }\n\n &-handler-wrap:hover &-handler {\n height: 40%;\n }\n\n &:hover &-handler-wrap,\n &-focused &-handler-wrap {\n opacity: 1;\n }\n\n &-handler-up {\n border-top-right-radius: @border-radius-base;\n cursor: pointer;\n\n &-inner {\n top: 50%;\n margin-top: -5px;\n text-align: center;\n }\n\n &:hover {\n height: 60% !important;\n }\n }\n\n &-handler-down {\n top: 0;\n border-top: @border-width-base @border-style-base @border-color-base;\n border-bottom-right-radius: @border-radius-base;\n cursor: pointer;\n\n &-inner {\n top: 50%;\n text-align: center;\n transform: translateY(-50%);\n }\n\n &:hover {\n height: 60% !important;\n }\n .@{input-number-prefix-cls}-borderless & {\n border-top-width: 0;\n }\n }\n\n &-handler-up-disabled,\n &-handler-down-disabled {\n cursor: not-allowed;\n }\n\n &-handler-up-disabled:hover &-handler-up-inner,\n &-handler-down-disabled:hover &-handler-down-inner {\n color: @disabled-color;\n }\n\n &-borderless {\n box-shadow: none;\n }\n\n // ===================== Out Of Range =====================\n &-out-of-range {\n input {\n color: @error-color;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../input/style/mixin';\n\n@input-number-prefix-cls: ~'@{ant-prefix}-input-number';\n\n@input-number-wrapper-cls: @input-number-prefix-cls, ~'@{input-number-prefix-cls}-affix-wrapper';\n\neach(@input-number-wrapper-cls, {\n .@{value} {\n &-status-error {\n .status-color(@value, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n .status-color-common(@input-number-prefix-cls, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline)\n }\n\n &-status-warning {\n .status-color(@value, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n .status-color-common(@input-number-prefix-cls, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline)\n }\n }\n});\n\n.@{input-number-prefix-cls}-group-wrapper {\n &-status-error {\n .group-status-color(@input-number-prefix-cls, @error-color, @error-color);\n }\n\n &-status-warning {\n .group-status-color(@input-number-prefix-cls, @warning-color, @warning-color);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n\n@input-number-prefix-cls: ~'@{ant-prefix}-input-number';\n\n.@{input-number-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-handler {\n .@{input-number-prefix-cls}-rtl & {\n border-right: @border-width-base @border-style-base @input-number-handler-border-color;\n border-left: 0;\n }\n\n &-wrap {\n .@{input-number-prefix-cls}-rtl & {\n right: auto;\n left: 0;\n }\n\n .@{input-number-prefix-cls}-rtl.@{input-number-prefix-cls}-borderless & {\n border-right-width: 0;\n }\n }\n\n &-up {\n .@{input-number-prefix-cls}-rtl & {\n border-top-right-radius: 0;\n }\n }\n\n &-down {\n .@{input-number-prefix-cls}-rtl & {\n border-bottom-right-radius: 0;\n }\n }\n }\n\n &-input {\n .@{input-number-prefix-cls}-rtl & {\n direction: ltr;\n text-align: right;\n }\n }\n}\n\n// https://github.com/ant-design/ant-design/issues/35870\n.input-group(@input-number-prefix-cls) {\n > .@{input-number-prefix-cls}-rtl:first-child {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n > .@{input-number-prefix-cls}-rtl:last-child {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n\n &-addon {\n .@{input-number-prefix-cls}-group-rtl &:first-child {\n border-right: @border-width-base @border-style-base @input-border-color;\n border-left: 0;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n .@{input-number-prefix-cls}-group-rtl &:last-child {\n border-right: 0;\n border-left: @border-width-base @border-style-base @input-border-color;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n}\n","@import './mixin';\n@import (reference) '../../style/themes/index';\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n@input-affix-margin: 4px;\n\n.@{ant-prefix}-input {\n &-affix-wrapper {\n .input();\n display: inline-flex;\n\n &:not(&-disabled):hover {\n .hover();\n z-index: 1;\n .@{ant-prefix}-input-search-with-button & {\n z-index: 0;\n }\n }\n\n &-focused,\n &:focus {\n z-index: 1;\n }\n\n &-disabled {\n .@{ant-prefix}-input[disabled] {\n background: transparent;\n }\n }\n\n > input.@{ant-prefix}-input {\n padding: 0;\n border: none;\n outline: none;\n\n &:focus {\n box-shadow: none !important;\n }\n }\n\n &::before {\n width: 0;\n visibility: hidden;\n content: '\\a0';\n }\n }\n\n &-prefix,\n &-suffix {\n display: flex;\n flex: none;\n align-items: center;\n\n > *:not(:last-child) {\n margin-right: 8px;\n }\n }\n\n &-show-count-suffix {\n color: @text-color-secondary;\n }\n\n &-show-count-has-suffix {\n margin-right: 2px;\n }\n\n &-prefix {\n margin-right: @input-affix-margin;\n }\n\n &-suffix {\n margin-left: @input-affix-margin;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './mixin';\n@import './affix';\n@import './allow-clear';\n@import './status';\n\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n// Input styles\n.@{input-prefix-cls} {\n .reset-component();\n .input();\n\n //== Style for input-group: input with label, with button or dropdown...\n &-group {\n .reset-component();\n .input-group(~'@{input-prefix-cls}');\n\n &-wrapper {\n display: inline-block;\n width: 100%;\n text-align: start;\n vertical-align: top; // https://github.com/ant-design/ant-design/issues/6403\n }\n }\n\n &-password-icon.@{iconfont-css-prefix} {\n color: @text-color-secondary;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n color: @input-icon-hover-color;\n }\n }\n\n &[type='color'] {\n height: @input-height-base;\n\n &.@{input-prefix-cls}-lg {\n height: @input-height-lg;\n }\n &.@{input-prefix-cls}-sm {\n height: @input-height-sm;\n padding-top: 3px;\n padding-bottom: 3px;\n }\n }\n\n &-textarea-show-count {\n // https://github.com/ant-design/ant-design/issues/33049\n > .@{input-prefix-cls} {\n height: 100%;\n }\n\n &::after {\n float: right;\n color: @text-color-secondary;\n white-space: nowrap;\n content: attr(data-count);\n pointer-events: none;\n }\n\n &.@{input-prefix-cls}-textarea-in-form-item {\n &::after {\n margin-bottom: -22px;\n }\n }\n }\n\n &-textarea-suffix {\n position: absolute;\n top: 0;\n right: @input-padding-horizontal-base;\n bottom: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: auto;\n }\n}\n\n@import './search-input';\n@import './rtl';\n@import './IE11';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n//== Style for input-group: input with label, with button or dropdown...\n.@{ant-prefix}-input-group {\n &-wrapper {\n &-rtl {\n direction: rtl;\n }\n }\n\n &-rtl {\n direction: rtl;\n }\n}\n\n// affix\n@input-affix-margin: 4px;\n\n.@{ant-prefix}-input {\n &-affix-wrapper&-affix-wrapper-rtl {\n > input.@{ant-prefix}-input {\n border: none;\n outline: none;\n }\n }\n\n &-affix-wrapper-rtl {\n .@{ant-prefix}-input-prefix {\n margin: 0 0 0 @input-affix-margin;\n }\n\n .@{ant-prefix}-input-suffix {\n margin: 0 @input-affix-margin 0 0;\n }\n }\n\n &-textarea {\n &-rtl {\n direction: rtl;\n }\n\n &-rtl&-show-count::after {\n text-align: left;\n }\n }\n}\n\n// allow-clear\n.@{ant-prefix}-input-clear-icon {\n &-has-suffix {\n .@{ant-prefix}-input-affix-wrapper-rtl & {\n margin-right: 0;\n margin-left: @input-affix-margin;\n }\n }\n\n .@{ant-prefix}-input-affix-wrapper-rtl & {\n right: auto;\n left: 8px;\n }\n}\n\n// mixin\n@input-rtl-cls: ~'@{ant-prefix}-input-rtl';\n\n.active() {\n .@{input-rtl-cls} & {\n border-right-width: 0;\n border-left-width: @border-width-base !important;\n }\n}\n\n.hover() {\n .@{input-rtl-cls} & {\n border-right-width: 0;\n border-left-width: @border-width-base !important;\n }\n}\n\n.input() {\n &-rtl {\n direction: rtl;\n }\n}\n\n// label input\n.input-group(@inputClass) {\n > .@{inputClass}-rtl:first-child,\n &-rtl &-addon:first-child {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n\n &-addon:first-child {\n .@{inputClass}-group-rtl & {\n border-right: @border-width-base @border-style-base @input-border-color;\n border-left: 0;\n }\n }\n\n &-addon:last-child {\n .@{inputClass}-group-rtl & {\n border-right: 0;\n border-left: @border-width-base @border-style-base @input-border-color;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n > .@{inputClass}:last-child,\n &-addon:last-child {\n .@{inputClass}-group-rtl& {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n .@{inputClass}-affix-wrapper {\n &:not(:first-child) {\n .@{inputClass}-group-rtl& {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n &:not(:last-child) {\n .@{inputClass}-group-rtl& {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n }\n\n &&-compact {\n & > *:not(:last-child) {\n .@{inputClass}-group-rtl& {\n margin-right: 0;\n margin-left: -@border-width-base;\n border-left-width: @border-width-base;\n }\n }\n\n & > *:first-child,\n & > .@{ant-prefix}-select:first-child > .@{ant-prefix}-select-selector,\n & > .@{ant-prefix}-select-auto-complete:first-child .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker:first-child .@{ant-prefix}-input {\n .@{inputClass}-group-rtl& {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n\n & > *:last-child,\n & > .@{ant-prefix}-select:last-child > .@{ant-prefix}-select-selector,\n & > .@{ant-prefix}-select-auto-complete:last-child .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker:last-child .@{ant-prefix}-input,\n & > .@{ant-prefix}-cascader-picker-focused:last-child .@{ant-prefix}-input {\n .@{inputClass}-group-rtl& {\n border-left-width: @border-width-base;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n\n .@{ant-prefix}-input-group-wrapper-rtl + .@{ant-prefix}-input-group-wrapper-rtl {\n margin-right: -1px;\n margin-left: 0;\n }\n\n .@{ant-prefix}-input-group-wrapper-rtl:not(:last-child) {\n &.@{ant-prefix}-input-search > .@{ant-prefix}-input-group {\n & > .@{ant-prefix}-input {\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n }\n }\n }\n}\n\n// search-input\n@search-prefix: ~'@{ant-prefix}-input-search';\n@search-rtl-cls: ~'@{search-prefix}-rtl';\n\n.@{search-prefix}-rtl {\n direction: rtl;\n\n .@{ant-prefix}-input {\n &:hover,\n &:focus {\n + .@{ant-prefix}-input-group-addon .@{search-prefix}-button:not(.@{ant-prefix}-btn-primary) {\n border-right-color: @input-hover-border-color;\n border-left-color: @border-color-base;\n }\n }\n }\n\n > .@{ant-prefix}-input-group {\n > .@{ant-prefix}-input-affix-wrapper {\n &:hover,\n &-focused {\n border-right-color: @input-hover-border-color;\n }\n }\n\n > .@{ant-prefix}-input-group-addon {\n right: -1px;\n left: auto;\n .@{search-prefix}-button {\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n// ========================= Input =========================\n.@{iconfont-css-prefix}.@{ant-prefix}-input-clear-icon,\n.@{ant-prefix}-input-clear-icon {\n margin: 0;\n color: @disabled-color;\n font-size: @font-size-sm;\n vertical-align: -1px;\n // https://github.com/ant-design/ant-design/pull/18151\n // https://codesandbox.io/s/wizardly-sun-u10br\n cursor: pointer;\n transition: color 0.3s;\n\n &:hover {\n color: @text-color-secondary;\n }\n\n &:active {\n color: @text-color;\n }\n\n &-hidden {\n visibility: hidden;\n }\n\n &-has-suffix {\n margin: 0 @input-affix-margin;\n }\n}\n\n// ======================= TextArea ========================\n.@{ant-prefix}-input-affix-wrapper-textarea-with-clear-btn {\n padding: 0 !important;\n border: 0 !important;\n\n .@{ant-prefix}-input-clear-icon {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 1;\n }\n}\n","@import './mixin';\n\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n@input-wrapper-cls: @input-prefix-cls, ~'@{input-prefix-cls}-affix-wrapper';\n\neach(@input-wrapper-cls, {\n .@{value} {\n &-status-error {\n .status-color(@value, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n .status-color-common(@input-prefix-cls, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n }\n\n &-status-warning {\n .status-color(@value, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n .status-color-common(@input-prefix-cls, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n }\n }\n});\n\n.@{input-prefix-cls}-textarea {\n &-status-error,\n &-status-warning,\n &-status-success,\n &-status-validating {\n &.@{input-prefix-cls}-textarea-has-feedback {\n .@{input-prefix-cls} {\n padding-right: 24px;\n }\n }\n }\n}\n\n.@{input-prefix-cls}-group-wrapper {\n &-status-error {\n .group-status-color(@input-prefix-cls, @error-color, @error-color);\n }\n\n &-status-warning {\n .group-status-color(@input-prefix-cls, @warning-color, @warning-color);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../button/style/mixin';\n@import './mixin';\n\n@search-prefix: ~'@{ant-prefix}-input-search';\n\n.@{search-prefix} {\n .@{ant-prefix}-input {\n &:hover,\n &:focus {\n border-color: @input-hover-border-color;\n\n + .@{ant-prefix}-input-group-addon .@{search-prefix}-button:not(.@{ant-prefix}-btn-primary) {\n border-left-color: @input-hover-border-color;\n }\n }\n }\n\n .@{ant-prefix}-input-affix-wrapper {\n border-radius: 0;\n }\n\n // fix slight height diff in Firefox:\n // https://ant.design/components/auto-complete-cn/#components-auto-complete-demo-certain-category\n .@{ant-prefix}-input-lg {\n line-height: @line-height-base - 0.0002;\n }\n\n > .@{ant-prefix}-input-group {\n > .@{ant-prefix}-input-group-addon:last-child {\n left: -1px;\n padding: 0;\n border: 0;\n\n .@{search-prefix}-button {\n padding-top: 0;\n padding-bottom: 0;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n }\n\n .@{search-prefix}-button:not(.@{ant-prefix}-btn-primary) {\n color: @text-color-secondary;\n\n &.@{ant-prefix}-btn-loading::before {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n }\n }\n }\n\n &-button {\n height: @input-height-base;\n\n &:hover,\n &:focus {\n z-index: 1;\n }\n }\n\n &-large &-button {\n height: @input-height-lg;\n }\n\n &-small &-button {\n height: @input-height-sm;\n }\n}\n","// Fix Input component height issue in IE11\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .@{ant-prefix}-input {\n height: @input-height-base;\n\n &-lg {\n height: @input-height-lg;\n }\n\n &-sm {\n height: @input-height-sm;\n }\n\n &-affix-wrapper {\n > input.@{ant-prefix}-input {\n height: auto;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@layout-prefix-cls: ~'@{ant-prefix}-layout';\n@layout-menu-prefix-cls: ~'@{ant-prefix}-menu';\n\n.@{layout-prefix-cls} {\n display: flex;\n flex: auto;\n flex-direction: column;\n\n /* fix firefox can't set height smaller than content on flex item */\n min-height: 0;\n background: @layout-body-background;\n\n &,\n * {\n box-sizing: border-box;\n }\n\n &&-has-sider {\n flex-direction: row;\n\n > .@{layout-prefix-cls},\n > .@{layout-prefix-cls}-content {\n width: 0; // https://segmentfault.com/a/1190000019498300\n }\n }\n\n &-header,\n &-footer {\n flex: 0 0 auto;\n }\n\n &-header {\n height: @layout-header-height;\n padding: @layout-header-padding;\n color: @layout-header-color;\n line-height: @layout-header-height;\n background: @layout-header-background;\n }\n\n &-footer {\n padding: @layout-footer-padding;\n color: @text-color;\n font-size: @font-size-base;\n background: @layout-footer-background;\n }\n\n &-content {\n flex: auto;\n\n /* fix firefox can't set height smaller than content on flex item */\n min-height: 0;\n }\n\n &-sider {\n position: relative;\n\n /* fix firefox can't set width smaller than content on flex item */\n min-width: 0;\n background: @layout-sider-background;\n transition: all 0.2s;\n\n &-children {\n height: 100%;\n margin-top: -0.1px;\n // Hack for fixing margin collaspe bug\n // https://github.com/ant-design/ant-design/issues/7967\n // solution from https://stackoverflow.com/a/33132624/3040605\n padding-top: 0.1px;\n\n .@{layout-menu-prefix-cls}.@{layout-menu-prefix-cls}-inline-collapsed {\n width: auto;\n }\n }\n\n &-has-trigger {\n padding-bottom: @layout-trigger-height;\n }\n\n &-right {\n order: 1;\n }\n\n &-trigger {\n position: fixed;\n bottom: 0;\n z-index: 1;\n height: @layout-trigger-height;\n color: @layout-trigger-color;\n line-height: @layout-trigger-height;\n text-align: center;\n background: @layout-trigger-background;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n &-zero-width {\n > * {\n overflow: hidden;\n }\n\n &-trigger {\n position: absolute;\n top: @layout-header-height;\n right: -@layout-zero-trigger-width;\n z-index: 1;\n width: @layout-zero-trigger-width;\n height: @layout-zero-trigger-height;\n color: @layout-trigger-color;\n font-size: (@layout-zero-trigger-width / 2);\n line-height: @layout-zero-trigger-height;\n text-align: center;\n background: @layout-sider-background;\n border-radius: 0 @border-radius-base @border-radius-base 0;\n cursor: pointer;\n transition: background 0.3s ease;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n transition: all 0.3s;\n content: '';\n }\n\n &:hover::after {\n background: rgba(255, 255, 255, 0.1);\n }\n\n &-right {\n left: -@layout-zero-trigger-width;\n border-radius: @border-radius-base 0 0 @border-radius-base;\n }\n }\n }\n }\n}\n\n@import './light';\n@import './rtl';\n\n@root-entry-name: default;",".@{layout-prefix-cls}-sider-light {\n background: @layout-sider-background-light;\n .@{layout-prefix-cls}-sider-trigger {\n color: @layout-trigger-color-light;\n background: @layout-trigger-background-light;\n }\n .@{layout-prefix-cls}-sider-zero-width-trigger {\n color: @layout-trigger-color-light;\n background: @layout-trigger-background-light;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@layout-prefix-cls: ~'@{ant-prefix}-layout';\n\n.@{layout-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './customize.less';\n\n@list-prefix-cls: ~'@{ant-prefix}-list';\n\n.@{list-prefix-cls} {\n .reset-component();\n\n position: relative;\n\n * {\n outline: none;\n }\n\n &-pagination {\n margin-top: @margin-lg;\n text-align: right;\n\n // https://github.com/ant-design/ant-design/issues/20037\n .@{ant-prefix}-pagination-options {\n text-align: left;\n }\n }\n\n &-more {\n margin-top: @margin-sm;\n text-align: center;\n\n button {\n padding-right: 32px;\n padding-left: 32px;\n }\n }\n\n &-spin {\n min-height: 40px;\n text-align: center;\n }\n\n &-empty-text {\n padding: @list-empty-text-padding;\n color: @disabled-color;\n font-size: @font-size-base;\n text-align: center;\n }\n\n &-items {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: @list-item-padding;\n color: @text-color;\n\n &-meta {\n display: flex;\n flex: 1;\n align-items: flex-start;\n max-width: 100%;\n\n &-avatar {\n margin-right: @list-item-meta-avatar-margin-right;\n }\n\n &-content {\n flex: 1 0;\n width: 0;\n color: @text-color;\n }\n\n &-title {\n margin-bottom: 4px;\n color: @text-color;\n font-size: @font-size-base;\n line-height: @line-height-base;\n\n > a {\n color: @text-color;\n transition: all 0.3s;\n\n &:hover {\n color: @primary-color;\n }\n }\n }\n\n &-description {\n color: @text-color-secondary;\n font-size: @list-item-meta-description-font-size;\n line-height: @line-height-base;\n }\n }\n\n &-action {\n flex: 0 0 auto;\n margin-left: 48px;\n padding: 0;\n font-size: 0;\n list-style: none;\n\n & > li {\n position: relative;\n display: inline-block;\n padding: 0 @padding-xs;\n color: @text-color-secondary;\n font-size: @font-size-base;\n line-height: @line-height-base;\n text-align: center;\n\n &:first-child {\n padding-left: 0;\n }\n }\n\n &-split {\n position: absolute;\n top: 50%;\n right: 0;\n width: 1px;\n height: 14px;\n margin-top: -7px;\n background-color: @border-color-split;\n }\n }\n }\n\n &-header {\n background: @list-header-background;\n }\n\n &-footer {\n background: @list-footer-background;\n }\n\n &-header,\n &-footer {\n padding-top: @padding-sm;\n padding-bottom: @padding-sm;\n }\n\n &-empty {\n padding: @padding-md 0;\n color: @text-color-secondary;\n font-size: 12px;\n text-align: center;\n }\n\n &-split &-item {\n border-bottom: 1px solid @border-color-split;\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n &-split &-header {\n border-bottom: 1px solid @border-color-split;\n }\n\n &-split&-empty &-footer {\n border-top: 1px solid @border-color-split;\n }\n\n &-loading &-spin-nested-loading {\n min-height: 32px;\n }\n\n &-split&-something-after-last-item .@{ant-prefix}-spin-container > &-items > &-item:last-child {\n border-bottom: 1px solid @border-color-split;\n }\n\n &-lg &-item {\n padding: @list-item-padding-lg;\n }\n\n &-sm &-item {\n padding: @list-item-padding-sm;\n }\n\n &-vertical &-item {\n align-items: initial;\n\n &-main {\n display: block;\n flex: 1;\n }\n\n &-extra {\n margin-left: 40px;\n }\n\n &-meta {\n margin-bottom: @list-item-meta-margin-bottom;\n\n &-title {\n margin-bottom: @list-item-meta-title-margin-bottom;\n color: @heading-color;\n font-size: @font-size-lg;\n line-height: 24px;\n }\n }\n\n &-action {\n margin-top: @padding-md;\n margin-left: auto;\n\n > li {\n padding: 0 @padding-md;\n\n &:first-child {\n padding-left: 0;\n }\n }\n }\n }\n\n &-grid .@{ant-prefix}-col > &-item {\n display: block;\n max-width: 100%;\n margin-bottom: @margin-md;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: none;\n }\n\n // ============================ without flex ============================\n &-item-no-flex {\n display: block;\n }\n\n // Horizontal\n &:not(.@{list-prefix-cls}-vertical) {\n .@{list-prefix-cls}-item-no-flex {\n .@{list-prefix-cls}-item-action {\n float: right;\n }\n }\n }\n}\n\n@import './bordered';\n@import './responsive';\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n\n.@{list-prefix-cls}-bordered {\n border: 1px solid @border-color-base;\n border-radius: @border-radius-base;\n .@{list-prefix-cls}-header {\n padding-right: @padding-lg;\n padding-left: @padding-lg;\n }\n\n .@{list-prefix-cls}-footer {\n padding-right: @padding-lg;\n padding-left: @padding-lg;\n }\n\n .@{list-prefix-cls}-item {\n padding-right: @padding-lg;\n padding-left: @padding-lg;\n }\n\n .@{list-prefix-cls}-pagination {\n margin: @margin-md @margin-lg;\n }\n\n &.@{list-prefix-cls}-sm {\n .@{list-prefix-cls}-item {\n padding: @list-item-padding-sm;\n }\n .@{list-prefix-cls}-header,\n .@{list-prefix-cls}-footer {\n padding: @list-item-padding-sm;\n }\n }\n\n &.@{list-prefix-cls}-lg {\n .@{list-prefix-cls}-item {\n padding: @list-item-padding-lg;\n }\n .@{list-prefix-cls}-header,\n .@{list-prefix-cls}-footer {\n padding: @list-item-padding-lg;\n }\n }\n}\n","@media screen and (max-width: @screen-md) {\n .@{list-prefix-cls} {\n &-item {\n &-action {\n margin-left: 24px;\n }\n }\n }\n\n .@{list-prefix-cls}-vertical {\n .@{list-prefix-cls}-item {\n &-extra {\n margin-left: 24px;\n }\n }\n }\n}\n\n@media screen and (max-width: @screen-sm) {\n .@{list-prefix-cls} {\n &-item {\n flex-wrap: wrap;\n\n &-action {\n margin-left: 12px;\n }\n }\n }\n\n .@{list-prefix-cls}-vertical {\n .@{list-prefix-cls}-item {\n flex-wrap: wrap-reverse;\n\n &-main {\n min-width: 220px;\n }\n\n &-extra {\n margin: auto auto 16px;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './customize.less';\n\n@list-prefix-cls: ~'@{ant-prefix}-list';\n\n.@{list-prefix-cls} {\n &-rtl {\n direction: rtl;\n text-align: right;\n\n // fix for virtual scroll style attribute > (direction:ltr)\n .ReactVirtualized__List .@{list-prefix-cls}-item {\n direction: rtl;\n }\n }\n\n &-pagination {\n .@{list-prefix-cls}-rtl & {\n text-align: left;\n }\n }\n\n &-item {\n &-meta {\n &-avatar {\n .@{list-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: @list-item-meta-avatar-margin-right;\n }\n }\n }\n\n &-action {\n .@{list-prefix-cls}-rtl & {\n margin-right: 48px;\n margin-left: 0;\n }\n\n & > li:first-child {\n .@{list-prefix-cls}.@{list-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: @padding-md;\n }\n }\n\n &-split {\n .@{list-prefix-cls}-rtl & {\n right: auto;\n left: 0;\n }\n }\n }\n }\n\n &-vertical &-item {\n &-extra {\n .@{list-prefix-cls}-rtl& {\n margin-right: 40px;\n margin-left: 0;\n }\n }\n\n &-action {\n .@{list-prefix-cls}-rtl& {\n margin-right: auto;\n }\n\n > li {\n &:first-child {\n .@{list-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: @padding-md;\n }\n }\n }\n }\n }\n\n // Horizontal\n &:not(.@{list-prefix-cls}-vertical) {\n .@{list-prefix-cls}-item-no-flex {\n .@{list-prefix-cls}-item-action {\n .@{list-prefix-cls}-rtl & {\n float: left;\n }\n }\n }\n }\n}\n\n// responsive\n@media screen and (max-width: @screen-md) {\n .@{list-prefix-cls} {\n &-item {\n &-action {\n .@{list-prefix-cls}-rtl & {\n margin-right: 24px;\n margin-left: 0;\n }\n }\n }\n }\n\n .@{list-prefix-cls}-vertical {\n .@{list-prefix-cls}-item {\n &-extra {\n .@{list-prefix-cls}-rtl & {\n margin-right: 24px;\n margin-left: 0;\n }\n }\n }\n }\n}\n\n@media screen and (max-width: @screen-sm) {\n .@{list-prefix-cls} {\n &-item {\n &-action {\n .@{list-prefix-cls}-rtl & {\n margin-right: 22px;\n margin-left: 0;\n }\n }\n }\n }\n\n .@{list-prefix-cls}-vertical {\n .@{list-prefix-cls}-item {\n &-extra {\n // to override margins on rtl view\n .@{list-prefix-cls}-rtl& {\n margin: auto auto 16px;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n\n@pagination-prefix-cls: ~'@{ant-prefix}-pagination';\n\n.@{pagination-prefix-cls} {\n .reset-component();\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &::after {\n display: block;\n clear: both;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n content: ' ';\n }\n\n &-total-text {\n display: inline-block;\n height: @pagination-item-size;\n margin-right: 8px;\n line-height: @pagination-item-size - 2px;\n vertical-align: middle;\n }\n\n &-item {\n display: inline-block;\n min-width: @pagination-item-size;\n height: @pagination-item-size;\n margin-right: 8px;\n font-family: @pagination-font-family;\n line-height: @pagination-item-size - 2px;\n text-align: center;\n vertical-align: middle;\n list-style: none;\n background-color: @pagination-item-bg;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base;\n outline: 0;\n cursor: pointer;\n user-select: none;\n\n a {\n display: block;\n padding: 0 6px;\n color: @text-color;\n transition: none;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n &:hover {\n border-color: @primary-color;\n transition: all 0.3s;\n\n a {\n color: @primary-color;\n }\n }\n\n // cannot merge with `&:hover`\n // see https://github.com/ant-design/ant-design/pull/34002\n &:focus-visible {\n border-color: @primary-color;\n transition: all 0.3s;\n\n a {\n color: @primary-color;\n }\n }\n\n &-active {\n font-weight: @pagination-font-weight-active;\n background: @pagination-item-bg-active;\n border-color: @primary-color;\n\n a {\n color: @primary-color;\n }\n\n &:hover {\n border-color: @primary-5;\n }\n\n &:focus-visible {\n border-color: @primary-5;\n }\n\n &:hover a {\n color: @primary-5;\n }\n\n &:focus-visible a {\n color: @primary-5;\n }\n }\n }\n\n &-jump-prev,\n &-jump-next {\n outline: 0;\n .@{pagination-prefix-cls}-item-container {\n position: relative;\n\n .@{pagination-prefix-cls}-item-link-icon {\n color: @primary-color;\n font-size: @font-size-sm;\n letter-spacing: -1px;\n opacity: 0;\n transition: all 0.2s;\n\n &-svg {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n margin: auto;\n }\n }\n\n .@{pagination-prefix-cls}-item-ellipsis {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n margin: auto;\n color: @disabled-color;\n font-family: Arial, Helvetica, sans-serif;\n letter-spacing: 2px;\n text-align: center;\n text-indent: 0.13em;\n opacity: 1;\n transition: all 0.2s;\n }\n }\n\n &:hover {\n .@{pagination-prefix-cls}-item-link-icon {\n opacity: 1;\n }\n .@{pagination-prefix-cls}-item-ellipsis {\n opacity: 0;\n }\n }\n\n &:focus-visible {\n .@{pagination-prefix-cls}-item-link-icon {\n opacity: 1;\n }\n .@{pagination-prefix-cls}-item-ellipsis {\n opacity: 0;\n }\n }\n }\n\n &-prev,\n &-jump-prev,\n &-jump-next {\n margin-right: 8px;\n }\n\n &-prev,\n &-next,\n &-jump-prev,\n &-jump-next {\n display: inline-block;\n min-width: @pagination-item-size;\n height: @pagination-item-size;\n color: @text-color;\n font-family: @pagination-font-family;\n line-height: @pagination-item-size;\n text-align: center;\n vertical-align: middle;\n list-style: none;\n border-radius: @border-radius-base;\n cursor: pointer;\n transition: all 0.3s;\n }\n\n &-prev,\n &-next {\n font-family: Arial, Helvetica, sans-serif;\n outline: 0;\n\n button {\n color: @text-color;\n cursor: pointer;\n user-select: none;\n }\n\n &:hover button {\n border-color: @primary-5;\n }\n\n .@{pagination-prefix-cls}-item-link {\n display: block;\n width: 100%;\n height: 100%;\n padding: 0;\n font-size: 12px;\n text-align: center;\n background-color: @pagination-item-link-bg;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base;\n outline: none;\n transition: all 0.3s;\n }\n\n &:focus-visible .@{pagination-prefix-cls}-item-link {\n color: @primary-color;\n border-color: @primary-color;\n }\n\n &:hover .@{pagination-prefix-cls}-item-link {\n color: @primary-color;\n border-color: @primary-color;\n }\n }\n\n &-disabled {\n &,\n &:hover {\n cursor: not-allowed;\n .@{pagination-prefix-cls}-item-link {\n color: @disabled-color;\n border-color: @border-color-base;\n cursor: not-allowed;\n }\n }\n\n &:focus-visible {\n cursor: not-allowed;\n .@{pagination-prefix-cls}-item-link {\n color: @disabled-color;\n border-color: @border-color-base;\n cursor: not-allowed;\n }\n }\n }\n\n &-slash {\n margin: 0 10px 0 5px;\n }\n\n &-options {\n display: inline-block;\n margin-left: 16px;\n vertical-align: middle;\n\n // IE11 css hack. `*::-ms-backdrop,` is a must have\n @media all and (-ms-high-contrast: none) {\n *::-ms-backdrop,\n & {\n vertical-align: top;\n }\n }\n\n &-size-changer.@{ant-prefix}-select {\n display: inline-block;\n width: auto;\n }\n\n &-quick-jumper {\n display: inline-block;\n height: @input-height-base;\n margin-left: @margin-xs;\n line-height: @input-height-base;\n vertical-align: top;\n\n input {\n .input();\n\n width: 50px;\n height: @input-height-base;\n margin: 0 8px;\n }\n }\n }\n\n &-simple &-prev,\n &-simple &-next {\n height: @pagination-item-size-sm;\n line-height: @pagination-item-size-sm;\n vertical-align: top;\n .@{pagination-prefix-cls}-item-link {\n height: @pagination-item-size-sm;\n background-color: transparent;\n border: 0;\n\n &::after {\n height: @pagination-item-size-sm;\n line-height: @pagination-item-size-sm;\n }\n }\n }\n\n &-simple &-simple-pager {\n display: inline-block;\n height: @pagination-item-size-sm;\n margin-right: 8px;\n\n input {\n box-sizing: border-box;\n height: 100%;\n margin-right: 8px;\n padding: 0 6px;\n text-align: center;\n background-color: @pagination-item-input-bg;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base;\n outline: none;\n transition: border-color 0.3s;\n\n &:hover {\n border-color: @primary-color;\n }\n\n &:focus {\n border-color: @primary-color-hover;\n box-shadow: @input-outline-offset @outline-blur-size @outline-width @primary-color-outline;\n }\n\n &[disabled] {\n color: @disabled-color;\n background: @disabled-bg;\n border-color: @border-color-base;\n cursor: not-allowed;\n }\n }\n }\n\n &&-mini &-total-text,\n &&-mini &-simple-pager {\n height: @pagination-item-size-sm;\n line-height: @pagination-item-size-sm;\n }\n\n &&-mini &-item {\n min-width: @pagination-item-size-sm;\n height: @pagination-item-size-sm;\n margin: 0;\n line-height: @pagination-item-size-sm - 2px;\n }\n\n &&-mini &-item:not(&-item-active) {\n background: transparent;\n border-color: transparent;\n }\n\n &&-mini &-prev,\n &&-mini &-next {\n min-width: @pagination-item-size-sm;\n height: @pagination-item-size-sm;\n margin: 0;\n line-height: @pagination-item-size-sm;\n }\n\n &&-mini &-prev &-item-link,\n &&-mini &-next &-item-link {\n background: transparent;\n border-color: transparent;\n\n &::after {\n height: @pagination-item-size-sm;\n line-height: @pagination-item-size-sm;\n }\n }\n\n &&-mini &-jump-prev,\n &&-mini &-jump-next {\n height: @pagination-item-size-sm;\n margin-right: 0;\n line-height: @pagination-item-size-sm;\n }\n\n &&-mini &-options {\n margin-left: 2px;\n\n &-size-changer {\n top: @pagination-mini-options-size-changer-top;\n }\n\n &-quick-jumper {\n height: @pagination-item-size-sm;\n line-height: @pagination-item-size-sm;\n\n input {\n .input-sm();\n\n width: 44px;\n height: @input-height-sm;\n }\n }\n }\n\n // ============================ Disabled ============================\n &&-disabled {\n cursor: not-allowed;\n\n .@{pagination-prefix-cls}-item {\n background: @disabled-bg;\n border-color: @border-color-base;\n cursor: not-allowed;\n\n a {\n color: @disabled-color;\n background: transparent;\n border: none;\n cursor: not-allowed;\n }\n\n &-active {\n background: @pagination-item-disabled-bg-active;\n\n a {\n color: @pagination-item-disabled-color-active;\n }\n }\n }\n\n .@{pagination-prefix-cls}-item-link {\n color: @disabled-color;\n background: @disabled-bg;\n border-color: @border-color-base;\n cursor: not-allowed;\n .@{pagination-prefix-cls}-simple& {\n background: transparent;\n }\n }\n\n .@{pagination-prefix-cls}-item-link-icon {\n opacity: 0;\n }\n\n .@{pagination-prefix-cls}-item-ellipsis {\n opacity: 1;\n }\n\n .@{pagination-prefix-cls}-simple-pager {\n color: @disabled-color;\n }\n }\n}\n\n@media only screen and (max-width: @screen-lg) {\n .@{pagination-prefix-cls}-item {\n &-after-jump-prev,\n &-before-jump-next {\n display: none;\n }\n }\n}\n\n@media only screen and (max-width: @screen-sm) {\n .@{pagination-prefix-cls}-options {\n display: none;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n\n@pagination-prefix-cls: ~'@{ant-prefix}-pagination';\n\n.@{pagination-prefix-cls}-rtl {\n .@{pagination-prefix-cls}-total-text {\n margin-right: 0;\n margin-left: 8px;\n }\n\n .@{pagination-prefix-cls}-item,\n .@{pagination-prefix-cls}-prev,\n .@{pagination-prefix-cls}-jump-prev,\n .@{pagination-prefix-cls}-jump-next {\n margin-right: 0;\n margin-left: 8px;\n }\n\n .@{pagination-prefix-cls}-slash {\n margin: 0 5px 0 10px;\n }\n\n .@{pagination-prefix-cls}-options {\n margin-right: 16px;\n margin-left: 0;\n\n .@{pagination-prefix-cls}-options-size-changer.@{ant-prefix}-select {\n margin-right: 0;\n margin-left: 8px;\n }\n\n .@{pagination-prefix-cls}-options-quick-jumper {\n margin-left: 0;\n }\n }\n\n &.@{pagination-prefix-cls}-simple {\n .@{pagination-prefix-cls}-simple-pager {\n margin-right: 0;\n margin-left: 8px;\n\n input {\n margin-right: 0;\n margin-left: 8px;\n }\n }\n }\n\n &.@{pagination-prefix-cls}.mini .@{pagination-prefix-cls}-options {\n margin-right: 2px;\n margin-left: 0;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@spin-prefix-cls: ~'@{ant-prefix}-spin';\n@spin-dot-default: @text-color-secondary;\n\n.@{spin-prefix-cls} {\n .reset-component();\n\n position: absolute;\n display: none;\n color: @primary-color;\n text-align: center;\n vertical-align: middle;\n opacity: 0;\n transition: transform 0.3s @ease-in-out-circ;\n\n &-spinning {\n position: static;\n display: inline-block;\n opacity: 1;\n }\n\n &-nested-loading {\n position: relative;\n > div > .@{spin-prefix-cls} {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 4;\n display: block;\n width: 100%;\n height: 100%;\n max-height: 400px;\n .@{spin-prefix-cls}-dot {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -(@spin-dot-size / 2);\n }\n .@{spin-prefix-cls}-text {\n position: absolute;\n top: 50%;\n width: 100%;\n padding-top: ((@spin-dot-size - @font-size-base) / 2) + 2px;\n text-shadow: 0 1px 2px @shadow-color-inverse;\n }\n &.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {\n margin-top: -(@spin-dot-size / 2) - 10px;\n }\n }\n\n > div > .@{spin-prefix-cls}-sm {\n .@{spin-prefix-cls}-dot {\n margin: -(@spin-dot-size-sm / 2);\n }\n .@{spin-prefix-cls}-text {\n padding-top: ((@spin-dot-size-sm - @font-size-base) / 2) + 2px;\n }\n &.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {\n margin-top: -(@spin-dot-size-sm / 2) - 10px;\n }\n }\n\n > div > .@{spin-prefix-cls}-lg {\n .@{spin-prefix-cls}-dot {\n margin: -(@spin-dot-size-lg / 2);\n }\n .@{spin-prefix-cls}-text {\n padding-top: ((@spin-dot-size-lg - @font-size-base) / 2) + 2px;\n }\n &.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {\n margin-top: -(@spin-dot-size-lg / 2) - 10px;\n }\n }\n }\n\n &-container {\n position: relative;\n transition: opacity 0.3s;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10;\n display: ~'none \\9';\n width: 100%;\n height: 100%;\n background: @component-background;\n opacity: 0;\n transition: all 0.3s;\n content: '';\n pointer-events: none;\n }\n }\n\n &-blur {\n clear: both;\n opacity: 0.5;\n user-select: none;\n pointer-events: none;\n\n &::after {\n opacity: 0.4;\n pointer-events: auto;\n }\n }\n\n // tip\n // ------------------------------\n &-tip {\n color: @spin-dot-default;\n }\n\n // dots\n // ------------------------------\n\n &-dot {\n position: relative;\n display: inline-block;\n font-size: @spin-dot-size;\n\n .square(1em);\n\n &-item {\n position: absolute;\n display: block;\n width: 9px;\n height: 9px;\n background-color: @primary-color;\n border-radius: 100%;\n transform: scale(0.75);\n transform-origin: 50% 50%;\n opacity: 0.3;\n animation: antSpinMove 1s infinite linear alternate;\n\n &:nth-child(1) {\n top: 0;\n left: 0;\n }\n\n &:nth-child(2) {\n top: 0;\n right: 0;\n animation-delay: 0.4s;\n }\n\n &:nth-child(3) {\n right: 0;\n bottom: 0;\n animation-delay: 0.8s;\n }\n\n &:nth-child(4) {\n bottom: 0;\n left: 0;\n animation-delay: 1.2s;\n }\n }\n\n &-spin {\n transform: rotate(0deg);\n animation: antRotate 1.2s infinite linear;\n }\n }\n\n // Sizes\n // ------------------------------\n\n // small\n &-sm &-dot {\n font-size: @spin-dot-size-sm;\n\n i {\n width: 6px;\n height: 6px;\n }\n }\n\n // large\n &-lg &-dot {\n font-size: @spin-dot-size-lg;\n\n i {\n width: 14px;\n height: 14px;\n }\n }\n\n &&-show-text &-text {\n display: block;\n }\n}\n\n@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n /* IE10+ */\n .@{spin-prefix-cls}-blur {\n background: @component-background;\n opacity: 0.5;\n }\n}\n\n@keyframes antSpinMove {\n to {\n opacity: 1;\n }\n}\n\n@keyframes antRotate {\n to {\n transform: rotate(360deg);\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{spin-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-dot {\n &-spin {\n .@{spin-prefix-cls}-rtl & {\n transform: rotate(-45deg);\n animation-name: antRotateRtl;\n }\n }\n }\n}\n\n@keyframes antRotateRtl {\n to {\n transform: rotate(-405deg);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../input/style/mixin';\n@import './status';\n\n@mention-prefix-cls: ~'@{ant-prefix}-mentions';\n\n.@{mention-prefix-cls} {\n .reset-component();\n .input();\n\n position: relative;\n display: inline-block;\n height: auto;\n padding: 0;\n overflow: hidden;\n line-height: @line-height-base;\n white-space: pre-wrap;\n vertical-align: bottom;\n\n // =================== Status ===================\n &-disabled {\n > textarea {\n .disabled();\n }\n }\n\n &-focused {\n .active();\n }\n\n // ================= Input Area =================\n > textarea,\n &-measure {\n min-height: @input-height-base - 2px;\n margin: 0;\n padding: @input-padding-vertical-base @input-padding-horizontal-base;\n overflow: inherit;\n overflow-x: hidden;\n overflow-y: auto;\n /* stylelint-disable declaration-block-no-redundant-longhand-properties */\n font-weight: inherit;\n font-size: inherit;\n font-family: inherit;\n font-style: inherit;\n font-variant: inherit;\n font-size-adjust: inherit;\n font-stretch: inherit;\n line-height: inherit;\n /* stylelint-enable declaration-block-no-redundant-longhand-properties */\n direction: inherit;\n letter-spacing: inherit;\n white-space: inherit;\n text-align: inherit;\n vertical-align: top;\n word-wrap: break-word;\n word-break: inherit;\n tab-size: inherit;\n }\n\n > textarea {\n width: 100%;\n border: none;\n outline: none;\n resize: none;\n & when (@theme = dark) {\n background-color: transparent;\n }\n .placeholder();\n }\n\n &-measure {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n color: transparent;\n pointer-events: none;\n\n > span {\n display: inline-block;\n min-height: 1em;\n }\n }\n\n // ================== Dropdown ==================\n &-dropdown {\n // Ref select dropdown style\n .reset-component();\n\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: @zindex-dropdown;\n box-sizing: border-box;\n font-size: @font-size-base;\n font-variant: initial;\n background-color: @mentions-dropdown-bg;\n border-radius: @border-radius-base;\n outline: none;\n box-shadow: @box-shadow-base;\n\n &-hidden {\n display: none;\n }\n\n &-menu {\n max-height: 250px;\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n overflow: auto;\n list-style: none;\n outline: none;\n\n &-item {\n position: relative;\n display: block;\n min-width: 100px;\n padding: 5px @control-padding-horizontal;\n overflow: hidden;\n color: @text-color;\n font-weight: normal;\n line-height: @line-height-base;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: background 0.3s ease;\n\n &:hover {\n background-color: @item-hover-bg;\n }\n\n &:first-child {\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n\n &:last-child {\n border-radius: 0 0 @border-radius-base @border-radius-base;\n }\n\n &-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n\n &:hover {\n color: @disabled-color;\n background-color: @mentions-dropdown-menu-item-hover-bg;\n cursor: not-allowed;\n }\n }\n\n &-selected {\n color: @text-color;\n font-weight: @select-item-selected-font-weight;\n background-color: @background-color-light;\n }\n\n &-active {\n background-color: @item-hover-bg;\n }\n }\n }\n }\n\n &-suffix {\n position: absolute;\n top: 0;\n right: @input-padding-horizontal-base;\n bottom: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: auto;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../input/style/mixin';\n\n@mention-prefix-cls: ~'@{ant-prefix}-mentions';\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n.@{mention-prefix-cls} {\n &-status-error {\n .status-color(@mention-prefix-cls, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n .status-color-common(@input-prefix-cls, @error-color, @error-color, @input-bg, @error-color-hover, @error-color-outline);\n }\n\n &-status-warning {\n .status-color(@mention-prefix-cls, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n .status-color-common(@input-prefix-cls, @warning-color, @warning-color, @input-bg, @warning-color-hover, @warning-color-outline);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@mention-prefix-cls: ~'@{ant-prefix}-mentions';\n\n.@{mention-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@message-prefix-cls: ~'@{ant-prefix}-message';\n\n.@{message-prefix-cls} {\n .reset-component();\n\n position: fixed;\n top: 8px;\n left: 0;\n z-index: @zindex-message;\n width: 100%;\n pointer-events: none;\n\n &-notice {\n padding: 8px;\n text-align: center;\n }\n\n &-notice-content {\n display: inline-block;\n padding: @message-notice-content-padding;\n background: @message-notice-content-bg;\n border-radius: @border-radius-base;\n box-shadow: @shadow-2;\n pointer-events: all;\n }\n\n &-success .@{iconfont-css-prefix} {\n color: @success-color;\n }\n\n &-error .@{iconfont-css-prefix} {\n color: @error-color;\n }\n\n &-warning .@{iconfont-css-prefix} {\n color: @warning-color;\n }\n\n &-info .@{iconfont-css-prefix},\n &-loading .@{iconfont-css-prefix} {\n color: @info-color;\n }\n\n .@{iconfont-css-prefix} {\n position: relative;\n top: 1px;\n margin-right: 8px;\n font-size: @font-size-lg;\n }\n\n &-notice.@{ant-prefix}-move-up-leave.@{ant-prefix}-move-up-leave-active {\n animation-name: MessageMoveOut;\n animation-duration: 0.3s;\n }\n}\n\n@keyframes MessageMoveOut {\n 0% {\n max-height: 150px;\n padding: 8px;\n opacity: 1;\n }\n\n 100% {\n max-height: 0;\n padding: 0;\n opacity: 0;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@message-prefix-cls: ~'@{ant-prefix}-message';\n\n.@{message-prefix-cls}-rtl {\n direction: rtl;\n\n span {\n direction: rtl;\n }\n\n .@{iconfont-css-prefix} {\n margin-right: 0;\n margin-left: 8px;\n }\n}\n","@dialog-prefix-cls: ~'@{ant-prefix}-modal';\n\n.@{dialog-prefix-cls} {\n .reset-component();\n .modal-mask();\n\n position: relative;\n top: 100px;\n width: auto;\n max-width: calc(100vw - 32px);\n margin: 0 auto;\n padding-bottom: 24px;\n\n &-wrap {\n z-index: @zindex-modal;\n }\n\n &-title {\n margin: 0;\n color: @modal-heading-color;\n font-weight: 500;\n font-size: @modal-header-title-font-size;\n line-height: @modal-header-title-line-height;\n word-wrap: break-word;\n }\n\n &-content {\n position: relative;\n background-color: @modal-content-bg;\n background-clip: padding-box;\n border: 0;\n border-radius: @modal-border-radius;\n box-shadow: @shadow-2;\n pointer-events: auto;\n }\n\n &-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: @zindex-popup-close;\n padding: 0;\n color: @modal-close-color;\n font-weight: 700;\n line-height: 1;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color 0.3s;\n\n &-x {\n display: block;\n width: @modal-header-close-size;\n height: @modal-header-close-size;\n font-size: @font-size-lg;\n font-style: normal;\n line-height: @modal-header-close-size;\n text-align: center;\n text-transform: none;\n text-rendering: auto;\n }\n\n &:focus,\n &:hover {\n color: @icon-color-hover;\n text-decoration: none;\n }\n }\n\n &-header {\n padding: @modal-header-padding;\n color: @text-color;\n background: @modal-header-bg;\n border-bottom: @modal-header-border-width @modal-header-border-style\n @modal-header-border-color-split;\n border-radius: @modal-border-radius @modal-border-radius 0 0;\n }\n\n &-body {\n padding: @modal-body-padding;\n font-size: @font-size-base;\n line-height: @line-height-base;\n word-wrap: break-word;\n }\n\n &-footer {\n padding: @modal-footer-padding-vertical @modal-footer-padding-horizontal;\n text-align: right;\n background: @modal-footer-bg;\n border-top: @modal-footer-border-width @modal-footer-border-style\n @modal-footer-border-color-split;\n border-radius: 0 0 @modal-border-radius @modal-border-radius;\n\n .@{ant-prefix}-btn + .@{ant-prefix}-btn:not(.@{ant-prefix}-dropdown-trigger) {\n margin-bottom: 0;\n margin-left: 8px;\n }\n }\n\n &-open {\n overflow: hidden;\n }\n}\n\n.@{dialog-prefix-cls}-centered {\n text-align: center;\n\n &::before {\n display: inline-block;\n width: 0;\n height: 100%;\n vertical-align: middle;\n content: '';\n }\n .@{dialog-prefix-cls} {\n top: 0;\n display: inline-block;\n padding-bottom: 0;\n text-align: left;\n vertical-align: middle;\n }\n}\n\n@media (max-width: @screen-sm-max) {\n .@{dialog-prefix-cls} {\n max-width: calc(100vw - 16px);\n margin: 8px auto;\n }\n .@{dialog-prefix-cls}-centered {\n .@{dialog-prefix-cls} {\n flex: 1;\n }\n }\n}\n","/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.ant-modal {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n pointer-events: none;\n position: relative;\n top: 100px;\n width: auto;\n max-width: calc(100vw - 32px);\n margin: 0 auto;\n padding-bottom: 24px;\n}\n.ant-modal.ant-zoom-enter,\n.ant-modal.ant-zoom-appear {\n transform: none;\n opacity: 0;\n animation-duration: 0.3s;\n user-select: none;\n}\n.ant-modal-mask {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1000;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-modal-mask-hidden {\n display: none;\n}\n.ant-modal-wrap {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n outline: 0;\n}\n.ant-modal-wrap {\n z-index: 1000;\n}\n.ant-modal-title {\n margin: 0;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n word-wrap: break-word;\n}\n.ant-modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-radius: 2px;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n pointer-events: auto;\n}\n.ant-modal-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 10;\n padding: 0;\n color: rgba(0, 0, 0, 0.45);\n font-weight: 700;\n line-height: 1;\n text-decoration: none;\n background: transparent;\n border: 0;\n outline: 0;\n cursor: pointer;\n transition: color 0.3s;\n}\n.ant-modal-close-x {\n display: block;\n width: 54px;\n height: 54px;\n font-size: 16px;\n font-style: normal;\n line-height: 54px;\n text-align: center;\n text-transform: none;\n text-rendering: auto;\n}\n.ant-modal-close:focus,\n.ant-modal-close:hover {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n}\n.ant-modal-header {\n padding: 16px 24px;\n color: rgba(0, 0, 0, 0.85);\n background: #fff;\n border-bottom: 1px solid #f0f0f0;\n border-radius: 2px 2px 0 0;\n}\n.ant-modal-body {\n padding: 24px;\n font-size: 14px;\n line-height: 1.5715;\n word-wrap: break-word;\n}\n.ant-modal-footer {\n padding: 10px 16px;\n text-align: right;\n background: transparent;\n border-top: 1px solid #f0f0f0;\n border-radius: 0 0 2px 2px;\n}\n.ant-modal-footer .ant-btn + .ant-btn:not(.ant-dropdown-trigger) {\n margin-bottom: 0;\n margin-left: 8px;\n}\n.ant-modal-open {\n overflow: hidden;\n}\n.ant-modal-centered {\n text-align: center;\n}\n.ant-modal-centered::before {\n display: inline-block;\n width: 0;\n height: 100%;\n vertical-align: middle;\n content: '';\n}\n.ant-modal-centered .ant-modal {\n top: 0;\n display: inline-block;\n padding-bottom: 0;\n text-align: left;\n vertical-align: middle;\n}\n@media (max-width: 767px) {\n .ant-modal {\n max-width: calc(100vw - 16px);\n margin: 8px auto;\n }\n .ant-modal-centered .ant-modal {\n flex: 1;\n }\n}\n.ant-modal-confirm .ant-modal-header {\n display: none;\n}\n.ant-modal-confirm .ant-modal-body {\n padding: 32px 32px 24px;\n}\n.ant-modal-confirm-body-wrapper::before {\n display: table;\n content: '';\n}\n.ant-modal-confirm-body-wrapper::after {\n display: table;\n clear: both;\n content: '';\n}\n.ant-modal-confirm-body .ant-modal-confirm-title {\n display: block;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 500;\n font-size: 16px;\n line-height: 1.4;\n}\n.ant-modal-confirm-body .ant-modal-confirm-content {\n margin-top: 8px;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.ant-modal-confirm-body > .anticon {\n float: left;\n margin-right: 16px;\n font-size: 22px;\n}\n.ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n margin-left: 38px;\n}\n.ant-modal-confirm .ant-modal-confirm-btns {\n margin-top: 24px;\n text-align: right;\n}\n.ant-modal-confirm .ant-modal-confirm-btns .ant-btn + .ant-btn {\n margin-bottom: 0;\n margin-left: 8px;\n}\n.ant-modal-confirm-error .ant-modal-confirm-body > .anticon {\n color: #ff4d4f;\n}\n.ant-modal-confirm-warning .ant-modal-confirm-body > .anticon,\n.ant-modal-confirm-confirm .ant-modal-confirm-body > .anticon {\n color: #faad14;\n}\n.ant-modal-confirm-info .ant-modal-confirm-body > .anticon {\n color: #1890ff;\n}\n.ant-modal-confirm-success .ant-modal-confirm-body > .anticon {\n color: #52c41a;\n}\n.ant-modal-wrap-rtl {\n direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-close {\n right: initial;\n left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-footer {\n text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-footer .ant-btn + .ant-btn {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body {\n direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n margin-right: 38px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns {\n text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn + .ant-btn {\n margin-right: 8px;\n margin-left: 0;\n}\n.ant-modal-wrap-rtl.ant-modal-centered .ant-modal {\n text-align: right;\n}\n","@import '../../style/mixins/index';\n\n@confirm-prefix-cls: ~'@{ant-prefix}-modal-confirm';\n\n.@{confirm-prefix-cls} {\n .@{ant-prefix}-modal-header {\n display: none;\n }\n\n .@{ant-prefix}-modal-body {\n padding: @modal-confirm-body-padding;\n }\n\n &-body-wrapper {\n .clearfix();\n }\n\n &-body {\n .@{confirm-prefix-cls}-title {\n display: block;\n // create BFC to avoid\n // https://user-images.githubusercontent.com/507615/37702510-ba844e06-2d2d-11e8-9b67-8e19be57f445.png\n overflow: hidden;\n color: @heading-color;\n font-weight: 500;\n font-size: @modal-confirm-title-font-size;\n line-height: 1.4;\n }\n\n .@{confirm-prefix-cls}-content {\n margin-top: 8px;\n color: @text-color;\n font-size: @font-size-base;\n }\n\n > .@{iconfont-css-prefix} {\n float: left;\n margin-right: 16px;\n font-size: 22px;\n\n // `content` after `icon` should set marginLeft\n + .@{confirm-prefix-cls}-title + .@{confirm-prefix-cls}-content {\n margin-left: 38px;\n }\n }\n }\n\n .@{confirm-prefix-cls}-btns {\n margin-top: 24px;\n text-align: right;\n\n .@{ant-prefix}-btn + .@{ant-prefix}-btn {\n margin-bottom: 0;\n margin-left: 8px;\n }\n }\n\n &-error &-body > .@{iconfont-css-prefix} {\n color: @error-color;\n }\n\n &-warning &-body > .@{iconfont-css-prefix},\n &-confirm &-body > .@{iconfont-css-prefix} {\n color: @warning-color;\n }\n\n &-info &-body > .@{iconfont-css-prefix} {\n color: @info-color;\n }\n\n &-success &-body > .@{iconfont-css-prefix} {\n color: @success-color;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@dialog-prefix-cls: ~'@{ant-prefix}-modal';\n@confirm-prefix-cls: ~'@{ant-prefix}-modal-confirm';\n@dialog-wrap-rtl-cls: ~'@{dialog-prefix-cls}-wrap-rtl';\n\n.@{dialog-prefix-cls} {\n &-wrap {\n &-rtl {\n direction: rtl;\n }\n }\n\n &-close {\n .@{dialog-wrap-rtl-cls} & {\n right: initial;\n left: 0;\n }\n }\n\n &-footer {\n .@{dialog-wrap-rtl-cls} & {\n text-align: left;\n }\n .@{ant-prefix}-btn + .@{ant-prefix}-btn {\n .@{dialog-wrap-rtl-cls} & {\n margin-right: 8px;\n margin-left: 0;\n }\n }\n }\n\n &-confirm {\n &-body {\n .@{dialog-wrap-rtl-cls} & {\n direction: rtl;\n }\n > .@{iconfont-css-prefix} {\n .@{dialog-wrap-rtl-cls} & {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n }\n + .@{confirm-prefix-cls}-title + .@{confirm-prefix-cls}-content {\n .@{dialog-wrap-rtl-cls} & {\n margin-right: 38px;\n margin-left: 0;\n }\n }\n }\n }\n\n &-btns {\n .@{dialog-wrap-rtl-cls} & {\n text-align: left;\n }\n .@{ant-prefix}-btn + .@{ant-prefix}-btn {\n .@{dialog-wrap-rtl-cls} & {\n margin-right: 8px;\n margin-left: 0;\n }\n }\n }\n }\n}\n\n.@{dialog-prefix-cls}-centered {\n .@{dialog-prefix-cls} {\n .@{dialog-wrap-rtl-cls}& {\n text-align: right;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n.popover-customize-bg(@notification-prefix-cls, @popover-background);\n\n@notification-prefix-cls: ~'@{ant-prefix}-notification';\n@notification-width: 384px;\n@notification-padding: @notification-padding-vertical @notification-padding-horizontal;\n@notification-margin-bottom: 16px;\n@notification-margin-edge: 24px;\n\n.@{notification-prefix-cls} {\n .reset-component();\n\n position: fixed;\n z-index: @zindex-notification;\n margin-right: @notification-margin-edge;\n\n &-close-icon {\n font-size: @font-size-base;\n cursor: pointer;\n }\n\n &-hook-holder {\n position: relative;\n }\n\n &-notice {\n position: relative;\n width: @notification-width;\n max-width: ~'calc(100vw - @{notification-margin-edge} * 2)';\n margin-bottom: @notification-margin-bottom;\n margin-left: auto;\n padding: @notification-padding;\n overflow: hidden;\n line-height: @line-height-base;\n word-wrap: break-word;\n background: @notification-bg;\n border-radius: @border-radius-base;\n box-shadow: @shadow-2;\n\n .@{notification-prefix-cls}-top &,\n .@{notification-prefix-cls}-bottom & {\n margin-right: auto;\n margin-left: auto;\n }\n\n .@{notification-prefix-cls}-topLeft &,\n .@{notification-prefix-cls}-bottomLeft & {\n margin-right: auto;\n margin-left: 0;\n }\n\n &-message {\n margin-bottom: 8px;\n color: @heading-color;\n font-size: @font-size-lg;\n line-height: 24px;\n\n // https://github.com/ant-design/ant-design/issues/5846#issuecomment-296244140\n &-single-line-auto-margin {\n display: block;\n width: ~'calc(@{notification-width} - @{notification-padding-horizontal} * 2 - 24px - 48px - 100%)';\n max-width: 4px;\n background-color: transparent;\n pointer-events: none;\n\n &::before {\n display: block;\n content: '';\n }\n }\n }\n\n &-description {\n font-size: @font-size-base;\n }\n\n &-closable &-message {\n padding-right: 24px;\n }\n\n &-with-icon &-message {\n margin-bottom: 4px;\n margin-left: 48px;\n font-size: @font-size-lg;\n }\n\n &-with-icon &-description {\n margin-left: 48px;\n font-size: @font-size-base;\n }\n\n // Icon & color style in different selector level\n // https://github.com/ant-design/ant-design/issues/16503\n // https://github.com/ant-design/ant-design/issues/15512\n &-icon {\n position: absolute;\n margin-left: 4px;\n font-size: 24px;\n line-height: 24px;\n }\n\n .@{iconfont-css-prefix}&-icon {\n &-success {\n color: @success-color;\n }\n\n &-info {\n color: @info-color;\n }\n\n &-warning {\n color: @warning-color;\n }\n\n &-error {\n color: @error-color;\n }\n }\n\n &-close {\n position: absolute;\n top: 16px;\n right: 22px;\n color: @text-color-secondary;\n outline: none;\n\n &:hover {\n & when (@theme = dark) {\n color: fade(@white, 85%);\n }\n & when not (@theme = dark) {\n color: shade(@text-color-secondary, 40%);\n }\n }\n }\n\n &-btn {\n float: right;\n margin-top: 16px;\n }\n }\n\n .notification-fade-effect {\n animation-duration: 0.24s;\n animation-timing-function: @ease-in-out;\n animation-fill-mode: both;\n }\n\n &-fade-enter,\n &-fade-appear {\n .notification-fade-effect();\n\n opacity: 0;\n animation-play-state: paused;\n }\n\n &-fade-leave {\n .notification-fade-effect();\n\n animation-duration: 0.2s;\n animation-play-state: paused;\n }\n\n &-fade-enter&-fade-enter-active,\n &-fade-appear&-fade-appear-active {\n animation-name: NotificationFadeIn;\n animation-play-state: running;\n }\n\n &-fade-leave&-fade-leave-active {\n animation-name: NotificationFadeOut;\n animation-play-state: running;\n }\n}\n\n@keyframes NotificationFadeIn {\n 0% {\n left: @notification-width;\n opacity: 0;\n }\n\n 100% {\n left: 0;\n opacity: 1;\n }\n}\n\n@keyframes NotificationFadeOut {\n 0% {\n max-height: 150px;\n margin-bottom: @notification-margin-bottom;\n opacity: 1;\n }\n\n 100% {\n max-height: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n}\n\n@import './rtl';\n@import './placement';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@notification-prefix-cls: ~'@{ant-prefix}-notification';\n\n.@{notification-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-notice {\n &-closable &-message {\n .@{notification-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 24px;\n }\n }\n\n &-with-icon &-message {\n .@{notification-prefix-cls}-rtl & {\n margin-right: 48px;\n margin-left: 0;\n }\n }\n\n &-with-icon &-description {\n .@{notification-prefix-cls}-rtl & {\n margin-right: 48px;\n margin-left: 0;\n }\n }\n\n &-icon {\n .@{notification-prefix-cls}-rtl & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n\n &-close {\n .@{notification-prefix-cls}-rtl & {\n right: auto;\n left: 22px;\n }\n }\n\n &-btn {\n .@{notification-prefix-cls}-rtl & {\n float: left;\n }\n }\n }\n}\n",".@{notification-prefix-cls} {\n &-top,\n &-bottom {\n margin-right: 0;\n margin-left: 0;\n }\n\n &-top {\n .@{notification-prefix-cls}-fade-enter.@{notification-prefix-cls}-fade-enter-active,\n .@{notification-prefix-cls}-fade-appear.@{notification-prefix-cls}-fade-appear-active {\n animation-name: NotificationTopFadeIn;\n }\n }\n\n &-bottom {\n .@{notification-prefix-cls}-fade-enter.@{notification-prefix-cls}-fade-enter-active,\n .@{notification-prefix-cls}-fade-appear.@{notification-prefix-cls}-fade-appear-active {\n animation-name: NotificationBottomFadeIn;\n }\n }\n\n &-topLeft,\n &-bottomLeft {\n margin-right: 0;\n margin-left: @notification-margin-edge;\n\n .@{notification-prefix-cls}-fade-enter.@{notification-prefix-cls}-fade-enter-active,\n .@{notification-prefix-cls}-fade-appear.@{notification-prefix-cls}-fade-appear-active {\n animation-name: NotificationLeftFadeIn;\n }\n }\n}\n\n@keyframes NotificationTopFadeIn {\n 0% {\n margin-top: -100%;\n opacity: 0;\n }\n\n 100% {\n margin-top: 0;\n opacity: 1;\n }\n}\n\n@keyframes NotificationBottomFadeIn {\n 0% {\n margin-bottom: -100%;\n opacity: 0;\n }\n\n 100% {\n margin-bottom: 0;\n opacity: 1;\n }\n}\n\n@keyframes NotificationLeftFadeIn {\n 0% {\n right: @notification-width;\n opacity: 0;\n }\n\n 100% {\n right: 0;\n opacity: 1;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@pageheader-prefix-cls: ~'@{ant-prefix}-page-header';\n\n.@{pageheader-prefix-cls} {\n .reset-component();\n position: relative;\n padding: @page-header-padding-vertical @page-header-padding;\n background-color: @component-background;\n\n &-ghost {\n background-color: @page-header-ghost-bg;\n }\n\n &.has-breadcrumb {\n padding-top: @page-header-padding-breadcrumb;\n }\n\n &.has-footer {\n padding-bottom: 0;\n }\n\n &-back {\n margin-right: @margin-md;\n font-size: 16px;\n line-height: 1;\n\n &-button {\n .operation-unit();\n color: @page-header-back-color;\n cursor: pointer;\n }\n }\n\n .@{ant-prefix}-divider-vertical {\n height: 14px;\n margin: 0 @margin-sm;\n vertical-align: middle;\n }\n\n .@{ant-prefix}-breadcrumb + &-heading {\n margin-top: @margin-xs;\n }\n\n .text-overflow-ellipsis() {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-heading {\n display: flex;\n justify-content: space-between;\n\n &-left {\n display: flex;\n align-items: center;\n margin: (@margin-xs / 2) 0;\n overflow: hidden;\n }\n\n &-title {\n margin-right: @margin-sm;\n margin-bottom: 0;\n color: @heading-color;\n font-weight: 600;\n font-size: @page-header-heading-title;\n line-height: @height-base;\n .text-overflow-ellipsis();\n }\n\n .@{ant-prefix}-avatar {\n margin-right: @margin-sm;\n }\n\n &-sub-title {\n margin-right: @margin-sm;\n color: @text-color-secondary;\n font-size: @page-header-heading-sub-title;\n line-height: @line-height-base;\n .text-overflow-ellipsis();\n }\n\n &-extra {\n margin: (@margin-xs / 2) 0;\n white-space: nowrap;\n\n > * {\n white-space: unset;\n }\n }\n }\n\n &-content {\n padding-top: @page-header-content-padding-vertical;\n }\n\n &-footer {\n margin-top: @margin-md;\n .@{ant-prefix}-tabs {\n > .@{ant-prefix}-tabs-nav {\n margin: 0;\n\n &::before {\n border: none;\n }\n }\n\n .@{ant-prefix}-tabs-tab {\n padding-top: @padding-xs;\n padding-bottom: @padding-xs;\n font-size: @page-header-tabs-tab-font-size;\n }\n }\n }\n\n &-compact &-heading {\n flex-wrap: wrap;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".operation-unit() {\n color: @link-color;\n text-decoration: none;\n outline: none;\n cursor: pointer;\n transition: color 0.3s;\n\n &:focus,\n &:hover {\n color: @link-hover-color;\n }\n\n &:active {\n color: @link-active-color;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@pageheader-prefix-cls: ~'@{ant-prefix}-page-header';\n\n.@{pageheader-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-back {\n .@{pageheader-prefix-cls}-rtl & {\n float: right;\n margin-right: 0;\n margin-left: 16px;\n }\n }\n\n &-heading {\n &-title {\n .@{pageheader-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: @margin-sm;\n }\n }\n\n .@{ant-prefix}-avatar {\n .@{pageheader-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: @margin-sm;\n }\n }\n\n &-sub-title {\n .@{pageheader-prefix-cls}-rtl & {\n float: right;\n margin-right: 0;\n margin-left: 12px;\n }\n }\n\n &-tags {\n .@{pageheader-prefix-cls}-rtl & {\n float: right;\n }\n }\n\n &-extra {\n .@{pageheader-prefix-cls}-rtl & {\n float: left;\n }\n\n > * {\n .@{pageheader-prefix-cls}-rtl & {\n margin-right: @margin-sm;\n margin-left: 0;\n }\n }\n\n > *:first-child {\n .@{pageheader-prefix-cls}-rtl & {\n margin-right: 0;\n }\n }\n }\n }\n\n &-footer {\n .@{ant-prefix}-tabs-bar {\n .@{ant-prefix}-tabs-nav {\n .@{pageheader-prefix-cls}-rtl & {\n float: right;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@space-prefix-cls: ~'@{ant-prefix}-space';\n@space-item-prefix-cls: ~'@{ant-prefix}-space-item';\n\n.@{space-prefix-cls} {\n display: inline-flex;\n\n &-vertical {\n flex-direction: column;\n }\n\n &-align {\n &-center {\n align-items: center;\n }\n\n &-start {\n align-items: flex-start;\n }\n\n &-end {\n align-items: flex-end;\n }\n\n &-baseline {\n align-items: baseline;\n }\n }\n}\n\n.@{space-item-prefix-cls} {\n &:empty {\n display: none;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@space-prefix-cls: ~'@{ant-prefix}-space';\n\n.@{space-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@popconfirm-prefix-cls: ~'@{ant-prefix}-popconfirm';\n\n.@{popconfirm-prefix-cls} {\n z-index: @zindex-popoconfirm;\n}\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@progress-prefix-cls: ~'@{ant-prefix}-progress';\n\n.@{progress-prefix-cls} {\n .reset-component();\n\n display: inline-block;\n\n &-line {\n position: relative;\n width: 100%;\n font-size: @font-size-base;\n }\n\n &-steps {\n display: inline-block;\n\n &-outer {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n &-item {\n flex-shrink: 0;\n min-width: 2px;\n margin-right: 2px;\n background: @progress-steps-item-bg;\n transition: all 0.3s;\n\n &-active {\n background: @progress-default-color;\n }\n }\n }\n\n &-small&-line,\n &-small&-line &-text .@{iconfont-css-prefix} {\n font-size: @font-size-sm;\n }\n\n &-outer {\n display: inline-block;\n width: 100%;\n margin-right: 0;\n padding-right: 0;\n .@{progress-prefix-cls}-show-info & {\n margin-right: ~'calc(-2em - 8px)';\n padding-right: ~'calc(2em + 8px)';\n }\n }\n\n &-inner {\n position: relative;\n display: inline-block;\n width: 100%;\n overflow: hidden;\n vertical-align: middle;\n background-color: @progress-remaining-color;\n border-radius: @progress-radius;\n }\n\n &-circle-trail {\n stroke: @progress-remaining-color;\n }\n\n &-circle-path {\n animation: ~'@{ant-prefix}-progress-appear' 0.3s;\n }\n\n &-inner:not(.@{ant-prefix}-progress-circle-gradient) {\n .@{ant-prefix}-progress-circle-path {\n stroke: @progress-default-color;\n }\n }\n\n &-success-bg,\n &-bg {\n position: relative;\n background-color: @progress-default-color;\n border-radius: @progress-radius;\n transition: all 0.4s @ease-out-circ 0s;\n }\n\n &-success-bg {\n position: absolute;\n top: 0;\n left: 0;\n background-color: @success-color;\n }\n\n &-text {\n display: inline-block;\n width: 2em;\n margin-left: 8px;\n color: @progress-info-text-color;\n font-size: @progress-text-font-size;\n line-height: 1;\n white-space: nowrap;\n text-align: left;\n vertical-align: middle;\n word-break: normal;\n .@{iconfont-css-prefix} {\n font-size: @font-size-base;\n }\n }\n\n &-status-active {\n .@{progress-prefix-cls}-bg::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: @component-background;\n border-radius: 10px;\n opacity: 0;\n animation: ~'@{ant-prefix}-progress-active' 2.4s @ease-out-quint infinite;\n content: '';\n }\n }\n\n &-status-exception {\n .@{progress-prefix-cls}-bg {\n background-color: @error-color;\n }\n .@{progress-prefix-cls}-text {\n color: @error-color;\n }\n }\n\n &-status-exception &-inner:not(.@{progress-prefix-cls}-circle-gradient) {\n .@{progress-prefix-cls}-circle-path {\n stroke: @error-color;\n }\n }\n\n &-status-success {\n .@{progress-prefix-cls}-bg {\n background-color: @success-color;\n }\n .@{progress-prefix-cls}-text {\n color: @success-color;\n }\n }\n\n &-status-success &-inner:not(.@{progress-prefix-cls}-circle-gradient) {\n .@{progress-prefix-cls}-circle-path {\n stroke: @success-color;\n }\n }\n\n &-circle &-inner {\n position: relative;\n line-height: 1;\n background-color: transparent;\n }\n\n &-circle &-text {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 100%;\n margin: 0;\n padding: 0;\n color: @progress-text-color;\n font-size: @progress-circle-text-font-size;\n line-height: 1;\n white-space: normal;\n text-align: center;\n transform: translate(-50%, -50%);\n\n .@{iconfont-css-prefix} {\n font-size: (14 / 12em);\n }\n }\n\n &-circle&-status-exception {\n .@{progress-prefix-cls}-text {\n color: @error-color;\n }\n }\n\n &-circle&-status-success {\n .@{progress-prefix-cls}-text {\n color: @success-color;\n }\n }\n}\n\n@keyframes ~\"@{ant-prefix}-progress-active\" {\n 0% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.1;\n }\n\n 20% {\n transform: translateX(-100%) scaleX(0);\n opacity: 0.5;\n }\n\n 100% {\n transform: translateX(0) scaleX(1);\n opacity: 0;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@progress-prefix-cls: ~'@{ant-prefix}-progress';\n\n.@{progress-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-outer {\n .@{progress-prefix-cls}-show-info & {\n .@{progress-prefix-cls}-rtl& {\n margin-right: 0;\n margin-left: ~'calc(-2em - 8px)';\n padding-right: 0;\n padding-left: ~'calc(2em + 8px)';\n }\n }\n }\n\n &-success-bg {\n .@{progress-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n\n &-line &-text,\n &-steps &-text {\n .@{progress-prefix-cls}-rtl& {\n margin-right: 8px;\n margin-left: 0;\n text-align: right;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@rate-prefix-cls: ~'@{ant-prefix}-rate';\n\n.@{rate-prefix-cls} {\n .reset-component();\n\n display: inline-block;\n margin: 0;\n padding: 0;\n color: @rate-star-color;\n font-size: @rate-star-size;\n line-height: unset;\n list-style: none;\n outline: none;\n\n &-disabled &-star {\n cursor: default;\n\n > div:hover {\n transform: scale(1);\n }\n }\n\n &-star {\n position: relative;\n display: inline-block;\n color: inherit;\n cursor: pointer;\n\n &:not(:last-child) {\n margin-right: 8px;\n }\n\n > div {\n transition: all 0.3s, outline 0s;\n\n &:hover {\n transform: @rate-star-hover-scale;\n }\n\n &:focus {\n outline: 0;\n }\n\n &:focus-visible {\n outline: 1px dashed @rate-star-color;\n transform: @rate-star-hover-scale;\n }\n }\n\n &-first,\n &-second {\n color: @rate-star-bg;\n transition: all 0.3s;\n user-select: none;\n .@{iconfont-css-prefix} {\n vertical-align: middle;\n }\n }\n\n &-first {\n position: absolute;\n top: 0;\n left: 0;\n width: 50%;\n height: 100%;\n overflow: hidden;\n opacity: 0;\n }\n\n &-half &-first,\n &-half &-second {\n opacity: 1;\n }\n\n &-half &-first,\n &-full &-second {\n color: inherit;\n }\n }\n\n &-text {\n display: inline-block;\n margin: 0 8px;\n font-size: @font-size-base;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{rate-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-star {\n &:not(:last-child) {\n .@{rate-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 8px;\n }\n }\n\n &-first {\n .@{rate-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@result-prefix-cls: ~'@{ant-prefix}-result';\n\n.@{result-prefix-cls} {\n padding: 48px 32px;\n // status color\n &-success &-icon > .@{iconfont-css-prefix} {\n color: @success-color;\n }\n\n &-error &-icon > .@{iconfont-css-prefix} {\n color: @error-color;\n }\n\n &-info &-icon > .@{iconfont-css-prefix} {\n color: @info-color;\n }\n\n &-warning &-icon > .@{iconfont-css-prefix} {\n color: @warning-color;\n }\n\n // Exception Status image\n &-image {\n width: 250px;\n height: 295px;\n margin: auto;\n }\n\n &-icon {\n margin-bottom: 24px;\n text-align: center;\n\n > .@{iconfont-css-prefix} {\n font-size: @result-icon-font-size;\n }\n }\n\n &-title {\n color: @heading-color;\n font-size: @result-title-font-size;\n line-height: 1.8;\n text-align: center;\n }\n\n &-subtitle {\n color: @text-color-secondary;\n font-size: @result-subtitle-font-size;\n line-height: 1.6;\n text-align: center;\n }\n\n &-extra {\n margin: @result-extra-margin;\n text-align: center;\n\n > * {\n margin-right: 8px;\n\n &:last-child {\n margin-right: 0;\n }\n }\n }\n\n &-content {\n margin-top: 24px;\n padding: 24px 40px;\n background-color: @background-color-light;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@result-prefix-cls: ~'@{ant-prefix}-result';\n\n.@{result-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-extra {\n > * {\n .@{result-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 8px;\n }\n\n &:last-child {\n .@{result-prefix-cls}-rtl & {\n margin-left: 0;\n }\n }\n }\n }\n}\n","// mixins\n.segmented-disabled-item {\n &,\n &:hover,\n &:focus {\n color: @disabled-color;\n cursor: not-allowed;\n }\n}\n\n.segmented-item-selected {\n background-color: @segmented-selected-bg;\n border-radius: @border-radius-base;\n box-shadow: 0 2px 8px -2px fade(@black, 5%), 0 1px 4px -1px fade(@black, 7%),\n 0 0 1px 0 fade(@black, 8%);\n}\n\n.segmented-text-ellipsis {\n overflow: hidden;\n // handle text ellipsis\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: keep-all;\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './mixins.less';\n\n@segmented-prefix-cls: ~'@{ant-prefix}-segmented';\n\n@segmented-container-padding: 2px;\n\n.@{segmented-prefix-cls} {\n .reset-component();\n display: inline-block;\n padding: @segmented-container-padding;\n color: @segmented-label-color;\n background-color: @segmented-bg;\n border-radius: @border-radius-base;\n transition: all 0.3s @ease-in-out;\n\n &-group {\n position: relative;\n display: flex;\n align-items: stretch;\n justify-items: flex-start;\n width: 100%;\n }\n\n // block styles\n &&-block {\n display: flex;\n }\n\n &&-block &-item {\n flex: 1;\n min-width: 0;\n }\n\n // hover/focus styles\n &:not(&-disabled) {\n &:hover,\n &:focus {\n background-color: @segmented-hover-bg;\n }\n }\n\n // item styles\n &-item {\n position: relative;\n text-align: center;\n cursor: pointer;\n transition: color 0.3s @ease-in-out;\n\n &-selected {\n .segmented-item-selected();\n color: @segmented-label-hover-color;\n }\n\n &:hover,\n &:focus {\n color: @segmented-label-hover-color;\n }\n\n &-label {\n min-height: @input-height-base - @segmented-container-padding * 2;\n padding: 0 @input-padding-horizontal-base;\n line-height: @input-height-base - @segmented-container-padding * 2;\n .segmented-text-ellipsis();\n }\n\n // syntactic sugar to add `icon` for Segmented Item\n &-icon + * {\n margin-left: (@margin-sm / 2);\n }\n\n &-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n }\n }\n\n // size styles\n &&-lg &-item-label {\n min-height: @input-height-lg - @segmented-container-padding * 2;\n padding: 0 @input-padding-horizontal-lg;\n font-size: @font-size-lg;\n line-height: @input-height-lg - @segmented-container-padding * 2;\n }\n\n &&-sm &-item-label {\n min-height: @input-height-sm - @segmented-container-padding * 2;\n padding: 0 @input-padding-horizontal-sm;\n line-height: @input-height-sm - @segmented-container-padding * 2;\n }\n\n // disabled styles\n &-item-disabled {\n .segmented-disabled-item();\n }\n\n // thumb styles\n &-thumb {\n .segmented-item-selected();\n\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n padding: 4px 0;\n }\n\n // transition effect when `appear-active`\n &-thumb-motion-appear-active {\n transition: transform 0.3s @ease-in-out, width 0.3s @ease-in-out;\n will-change: transform, width;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@segmented-prefix-cls: ~'@{ant-prefix}-segmented';\n\n.@{segmented-prefix-cls} {\n &&-rtl {\n direction: rtl;\n }\n\n &&-rtl &-item-icon {\n margin-right: 0;\n margin-left: 6px;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@slider-prefix-cls: ~'@{ant-prefix}-slider';\n\n.@{slider-prefix-cls} {\n .reset-component();\n\n position: relative;\n height: 12px;\n margin: @slider-margin;\n padding: 4px 0;\n cursor: pointer;\n touch-action: none;\n\n .vertical();\n\n &-with-marks {\n margin-bottom: 28px;\n }\n\n &-rail {\n position: absolute;\n width: 100%;\n height: 4px;\n background-color: @slider-rail-background-color;\n border-radius: @border-radius-base;\n transition: background-color 0.3s;\n }\n\n &-track {\n position: absolute;\n height: 4px;\n background-color: @slider-track-background-color;\n border-radius: @border-radius-base;\n transition: background-color 0.3s;\n }\n\n &-handle {\n position: absolute;\n width: @slider-handle-size;\n height: @slider-handle-size;\n margin-top: @slider-handle-margin-top;\n background-color: @slider-handle-background-color;\n border: solid @slider-handle-border-width @slider-handle-color;\n border-radius: 50%;\n box-shadow: @slider-handle-shadow;\n cursor: pointer;\n transition: border-color 0.3s, box-shadow 0.6s,\n transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n\n // &-dragging&-dragging&-dragging {\n // border-color: @slider-handle-color-focus;\n // box-shadow: 0 0 0 5px @slider-handle-color-focus-shadow;\n // }\n &-dragging {\n z-index: 1;\n }\n\n &:focus {\n border-color: @slider-handle-color-focus;\n outline: none;\n box-shadow: 0 0 0 5px @slider-handle-color-focus-shadow;\n }\n\n &.@{ant-prefix}-tooltip-open {\n border-color: @slider-handle-color-tooltip-open;\n }\n\n &::after {\n position: absolute;\n top: -6px;\n right: -6px;\n bottom: -6px;\n left: -6px;\n content: '';\n }\n }\n\n &:hover {\n .@{slider-prefix-cls}-rail {\n background-color: @slider-rail-background-color-hover;\n }\n .@{slider-prefix-cls}-track {\n background-color: @slider-track-background-color-hover;\n }\n .@{slider-prefix-cls}-handle:not(.@{ant-prefix}-tooltip-open) {\n border-color: @slider-handle-color-hover;\n }\n }\n\n &-mark {\n position: absolute;\n top: 14px;\n left: 0;\n width: 100%;\n font-size: @font-size-base;\n }\n\n &-mark-text {\n position: absolute;\n display: inline-block;\n color: @text-color-secondary;\n text-align: center;\n word-break: keep-all;\n cursor: pointer;\n user-select: none;\n\n &-active {\n color: @text-color;\n }\n }\n\n &-step {\n position: absolute;\n width: 100%;\n height: 4px;\n background: transparent;\n pointer-events: none;\n }\n\n &-dot {\n position: absolute;\n top: -2px;\n width: 8px;\n height: 8px;\n background-color: @component-background;\n border: 2px solid @slider-dot-border-color;\n border-radius: 50%;\n cursor: pointer;\n\n &-active {\n border-color: @slider-dot-border-color-active;\n }\n }\n\n &-disabled {\n cursor: not-allowed;\n\n .@{slider-prefix-cls}-rail {\n background-color: @slider-rail-background-color !important;\n }\n\n .@{slider-prefix-cls}-track {\n background-color: @slider-disabled-color !important;\n }\n\n .@{slider-prefix-cls}-handle,\n .@{slider-prefix-cls}-dot {\n background-color: @component-background;\n border-color: @slider-disabled-color !important;\n box-shadow: none;\n cursor: not-allowed;\n }\n\n .@{slider-prefix-cls}-mark-text,\n .@{slider-prefix-cls}-dot {\n cursor: not-allowed !important;\n }\n }\n}\n\n.vertical() {\n &-vertical {\n width: 12px;\n height: 100%;\n margin: 6px 10px;\n padding: 0 4px;\n\n .@{slider-prefix-cls}-rail {\n width: 4px;\n height: 100%;\n }\n\n .@{slider-prefix-cls}-track {\n width: 4px;\n }\n\n .@{slider-prefix-cls}-handle {\n margin-top: -6px; // we chould consider border width as well: (10 + 2 ) / 2\n margin-left: -5px;\n }\n\n .@{slider-prefix-cls}-mark {\n top: 0;\n left: 12px;\n width: 18px;\n height: 100%;\n }\n\n .@{slider-prefix-cls}-mark-text {\n left: 4px;\n white-space: nowrap;\n }\n\n .@{slider-prefix-cls}-step {\n width: 4px;\n height: 100%;\n }\n\n .@{slider-prefix-cls}-dot {\n top: auto;\n margin-left: -2px;\n }\n }\n\n &-tooltip {\n // https://github.com/ant-design/ant-design/issues/20014\n .@{ant-prefix}-tooltip-inner {\n min-width: unset;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@slider-prefix-cls: ~'@{ant-prefix}-slider';\n\n.@{slider-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-mark {\n .@{slider-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n}\n\n.vertical() {\n &-vertical {\n .@{slider-prefix-cls}-handle {\n .@{slider-prefix-cls}-rtl& {\n margin-right: -5px;\n margin-left: 0;\n }\n }\n\n .@{slider-prefix-cls}-mark {\n .@{slider-prefix-cls}-rtl& {\n right: 12px;\n left: auto;\n }\n }\n\n .@{slider-prefix-cls}-mark-text {\n .@{slider-prefix-cls}-rtl& {\n right: 4px;\n left: auto;\n }\n }\n\n .@{slider-prefix-cls}-dot {\n .@{slider-prefix-cls}-rtl& {\n right: 2px;\n left: auto;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@statistic-prefix-cls: ~'@{ant-prefix}-statistic';\n\n.@{statistic-prefix-cls} {\n .reset-component();\n\n &-title {\n margin-bottom: @margin-xss;\n color: @text-color-secondary;\n font-size: @statistic-title-font-size;\n }\n\n &-skeleton {\n padding-top: @padding-md;\n }\n\n &-content {\n color: @heading-color;\n font-size: @statistic-content-font-size;\n font-family: @statistic-font-family;\n\n &-value {\n display: inline-block;\n direction: ltr;\n }\n\n &-prefix,\n &-suffix {\n display: inline-block;\n }\n\n &-prefix {\n margin-right: 4px;\n }\n\n &-suffix {\n margin-left: 4px;\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;",".@{statistic-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-content {\n &-prefix {\n .@{statistic-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n\n &-suffix {\n .@{statistic-prefix-cls}-rtl & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@steps-prefix-cls: ~'@{ant-prefix}-steps';\n@process-icon-color: @primary-color;\n@process-title-color: @heading-color;\n@process-description-color: @text-color;\n@process-icon-text-color: @text-color-inverse;\n@wait-icon-color: @disabled-color;\n@wait-title-color: @text-color-secondary;\n@wait-description-color: @wait-title-color;\n@wait-tail-color: @process-tail-color;\n@finish-icon-color: @process-icon-color;\n@finish-title-color: @text-color;\n@finish-description-color: @text-color-secondary;\n@finish-tail-color: @primary-color;\n@error-icon-color: @error-color;\n@error-title-color: @error-color;\n@error-description-color: @error-color;\n@error-tail-color: @wait-tail-color;\n@steps-nav-active-color: @primary-color;\n\n.@{steps-prefix-cls} {\n .reset-component();\n\n display: flex;\n width: 100%;\n font-size: 0;\n text-align: initial;\n}\n\n.@{steps-prefix-cls}-item {\n position: relative;\n display: inline-block;\n flex: 1;\n overflow: hidden;\n vertical-align: top;\n\n &-container {\n outline: none;\n }\n\n &:last-child {\n flex: none;\n }\n\n &:last-child > &-container > &-tail,\n &:last-child > &-container > &-content > &-title::after {\n display: none;\n }\n\n &-icon,\n &-content {\n display: inline-block;\n vertical-align: top;\n }\n\n &-icon {\n width: @steps-icon-size;\n height: @steps-icon-size;\n margin: @steps-icon-margin;\n font-size: @steps-icon-font-size;\n font-family: @font-family;\n line-height: @steps-icon-size;\n text-align: center;\n border: @border-width-base @border-style-base @wait-icon-color;\n border-radius: @steps-icon-size;\n transition: background-color 0.3s, border-color 0.3s;\n\n .@{steps-prefix-cls}-icon {\n position: relative;\n top: @steps-icon-top;\n color: @primary-color;\n line-height: 1;\n }\n }\n\n &-tail {\n position: absolute;\n top: 12px;\n left: 0;\n width: 100%;\n padding: 0 10px;\n\n &::after {\n display: inline-block;\n width: 100%;\n height: 1px;\n background: @border-color-split;\n border-radius: 1px;\n transition: background 0.3s;\n content: '';\n }\n }\n\n &-title {\n position: relative;\n display: inline-block;\n padding-right: 16px;\n color: @text-color;\n font-size: @font-size-lg;\n line-height: @steps-title-line-height;\n\n &::after {\n position: absolute;\n top: (@steps-title-line-height / 2);\n left: 100%;\n display: block;\n width: 9999px;\n height: 1px;\n background: @wait-tail-color;\n content: '';\n }\n }\n\n &-subtitle {\n display: inline;\n margin-left: 8px;\n color: @text-color-secondary;\n font-weight: normal;\n font-size: @font-size-base;\n }\n\n &-description {\n color: @text-color-secondary;\n font-size: @font-size-base;\n }\n .step-item-status(wait);\n .step-item-status(process);\n\n &-process > &-container > &-icon {\n background: @process-icon-color;\n .@{steps-prefix-cls}-icon {\n color: @process-icon-text-color;\n }\n }\n\n &-process > &-container > &-title {\n font-weight: 500;\n }\n .step-item-status(finish);\n .step-item-status(error);\n\n &.@{steps-prefix-cls}-next-error .@{steps-prefix-cls}-item-title::after {\n background: @error-icon-color;\n }\n\n &-disabled {\n cursor: not-allowed;\n }\n}\n\n// ===================== Clickable =====================\n.@{steps-prefix-cls} .@{steps-prefix-cls}-item {\n &:not(.@{steps-prefix-cls}-item-active) {\n & > .@{steps-prefix-cls}-item-container[role='button'] {\n cursor: pointer;\n\n .@{steps-prefix-cls}-item {\n &-title,\n &-subtitle,\n &-description,\n &-icon .@{steps-prefix-cls}-icon {\n transition: color 0.3s;\n }\n }\n\n &:hover {\n .@{steps-prefix-cls}-item {\n &-title,\n &-subtitle,\n &-description {\n color: @primary-color;\n }\n }\n }\n }\n\n &:not(.@{steps-prefix-cls}-item-process) {\n & > .@{steps-prefix-cls}-item-container[role='button']:hover {\n .@{steps-prefix-cls}-item {\n &-icon {\n border-color: @primary-color;\n\n .@{steps-prefix-cls}-icon {\n color: @primary-color;\n }\n }\n }\n }\n }\n }\n}\n\n.@{steps-prefix-cls}-horizontal:not(.@{steps-prefix-cls}-label-vertical) {\n .@{steps-prefix-cls}-item {\n padding-left: 16px;\n white-space: nowrap;\n\n &:first-child {\n padding-left: 0;\n }\n &:last-child .@{steps-prefix-cls}-item-title {\n padding-right: 0;\n }\n\n &-tail {\n display: none;\n }\n\n &-description {\n max-width: @steps-description-max-width;\n white-space: normal;\n }\n }\n}\n\n.step-item-status(@status) {\n @icon-color: '@{status}-icon-color';\n @title-color: '@{status}-title-color';\n @description-color: '@{status}-description-color';\n @tail-color: '@{status}-tail-color';\n &-@{status} &-icon {\n background-color: @steps-background;\n border-color: @@icon-color;\n > .@{steps-prefix-cls}-icon {\n color: @@icon-color;\n .@{steps-prefix-cls}-icon-dot {\n background: @@icon-color;\n }\n }\n }\n &-@{status} > &-container > &-content > &-title {\n color: @@title-color;\n\n &::after {\n background-color: @@tail-color;\n }\n }\n &-@{status} > &-container > &-content > &-description {\n color: @@description-color;\n }\n &-@{status} > &-container > &-tail::after {\n background-color: @@tail-color;\n }\n}\n\n@import './custom-icon';\n@import './small';\n@import './vertical';\n@import './label-placement';\n@import './progress-dot';\n@import './nav';\n@import './rtl';\n@import './progress.less';\n\n@root-entry-name: default;",".@{steps-prefix-cls}-item-custom {\n > .@{steps-prefix-cls}-item-container > .@{steps-prefix-cls}-item-icon {\n height: auto;\n background: none;\n border: 0;\n > .@{steps-prefix-cls}-icon {\n top: @steps-icon-custom-top;\n left: 0.5px;\n width: @steps-icon-custom-size;\n height: @steps-icon-custom-size;\n font-size: @steps-icon-custom-font-size;\n line-height: @steps-icon-custom-size;\n }\n }\n &.@{steps-prefix-cls}-item-process {\n .@{steps-prefix-cls}-item-icon > .@{steps-prefix-cls}-icon {\n color: @process-icon-color;\n }\n }\n}\n\n// Only adjust horizontal customize icon width\n.@{steps-prefix-cls} {\n &:not(.@{steps-prefix-cls}-vertical) {\n .@{steps-prefix-cls}-item-custom {\n .@{steps-prefix-cls}-item-icon {\n width: auto;\n background: none;\n }\n }\n }\n}\n",".@{steps-prefix-cls}-small {\n &.@{steps-prefix-cls}-horizontal:not(.@{steps-prefix-cls}-label-vertical)\n .@{steps-prefix-cls}-item {\n padding-left: 12px;\n\n &:first-child {\n padding-left: 0;\n }\n }\n .@{steps-prefix-cls}-item-icon {\n width: @steps-small-icon-size;\n height: @steps-small-icon-size;\n margin: @steps-small-icon-margin;\n font-size: @font-size-sm;\n line-height: @steps-small-icon-size;\n text-align: center;\n border-radius: @steps-small-icon-size;\n }\n .@{steps-prefix-cls}-item-title {\n padding-right: 12px;\n font-size: @font-size-base;\n line-height: @steps-small-icon-size;\n\n &::after {\n top: (@steps-small-icon-size / 2);\n }\n }\n .@{steps-prefix-cls}-item-description {\n color: @text-color-secondary;\n font-size: @font-size-base;\n }\n .@{steps-prefix-cls}-item-tail {\n top: 8px;\n }\n .@{steps-prefix-cls}-item-custom .@{steps-prefix-cls}-item-icon {\n width: inherit;\n height: inherit;\n line-height: inherit;\n background: none;\n border: 0;\n border-radius: 0;\n > .@{steps-prefix-cls}-icon {\n font-size: @steps-small-icon-size;\n line-height: @steps-small-icon-size;\n transform: none;\n }\n }\n}\n",".@{steps-prefix-cls}-vertical {\n display: flex;\n flex-direction: column;\n\n > .@{steps-prefix-cls}-item {\n display: block;\n flex: 1 0 auto;\n padding-left: 0;\n overflow: visible;\n\n .@{steps-prefix-cls}-item-icon {\n float: left;\n margin-right: @steps-vertical-icon-width;\n }\n\n .@{steps-prefix-cls}-item-content {\n display: block;\n min-height: 48px;\n overflow: hidden;\n }\n\n .@{steps-prefix-cls}-item-title {\n line-height: @steps-icon-size;\n }\n\n .@{steps-prefix-cls}-item-description {\n padding-bottom: 12px;\n }\n }\n\n > .@{steps-prefix-cls}-item\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-tail {\n position: absolute;\n top: 0;\n left: @steps-vertical-tail-width;\n width: 1px;\n height: 100%;\n padding: @steps-icon-size + 6px 0 6px;\n\n &::after {\n width: 1px;\n height: 100%;\n }\n }\n\n > .@{steps-prefix-cls}-item:not(:last-child)\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-tail {\n display: block;\n }\n\n > .@{steps-prefix-cls}-item\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-content\n > .@{steps-prefix-cls}-item-title {\n &::after {\n display: none;\n }\n }\n\n &.@{steps-prefix-cls}-small .@{steps-prefix-cls}-item-container {\n .@{steps-prefix-cls}-item-tail {\n position: absolute;\n top: 0;\n left: @steps-vertical-tail-width-sm;\n padding: @steps-small-icon-size + 6px 0 6px;\n }\n .@{steps-prefix-cls}-item-title {\n line-height: @steps-small-icon-size;\n }\n }\n}\n",".@{steps-prefix-cls}-label-vertical {\n .@{steps-prefix-cls}-item {\n overflow: visible;\n\n &-tail {\n margin-left: 58px;\n padding: 3.5px 24px;\n }\n\n &-content {\n display: block;\n width: ((@steps-icon-size / 2) + 42px) * 2;\n margin-top: 8px;\n text-align: center;\n }\n\n &-icon {\n display: inline-block;\n margin-left: 42px;\n }\n\n &-title {\n padding-right: 0;\n padding-left: 0;\n\n &::after {\n display: none;\n }\n }\n\n &-subtitle {\n display: block;\n margin-bottom: 4px;\n margin-left: 0;\n line-height: @line-height-base;\n }\n }\n &.@{steps-prefix-cls}-small:not(.@{steps-prefix-cls}-dot) {\n .@{steps-prefix-cls}-item {\n &-icon {\n margin-left: 46px;\n }\n }\n }\n}\n",".@{steps-prefix-cls}-dot,\n.@{steps-prefix-cls}-dot.@{steps-prefix-cls}-small {\n .@{steps-prefix-cls}-item {\n &-title {\n line-height: @line-height-base;\n }\n\n &-tail {\n top: @steps-dot-top;\n width: 100%;\n margin: 0 0 0 (@steps-description-max-width / 2);\n padding: 0;\n\n &::after {\n width: ~'calc(100% - 20px)';\n height: 3px;\n margin-left: 12px;\n }\n }\n &:first-child .@{steps-prefix-cls}-icon-dot {\n left: 2px;\n }\n\n &-icon {\n width: @steps-dot-size;\n height: @steps-dot-size;\n margin-left: 67px;\n padding-right: 0;\n line-height: @steps-dot-size;\n background: transparent;\n border: 0;\n\n .@{steps-prefix-cls}-icon-dot {\n position: relative;\n float: left;\n width: 100%;\n height: 100%;\n border-radius: 100px;\n transition: all 0.3s;\n\n /* expand hover area */\n &::after {\n position: absolute;\n top: -12px;\n left: -26px;\n width: 60px;\n height: 32px;\n background: fade(@black, 0.1%);\n content: '';\n }\n }\n }\n\n &-content {\n width: @steps-description-max-width;\n }\n &-process .@{steps-prefix-cls}-item-icon {\n position: relative;\n top: -1px;\n width: @steps-current-dot-size;\n height: @steps-current-dot-size;\n line-height: @steps-current-dot-size;\n background: none;\n }\n &-process .@{steps-prefix-cls}-icon {\n &:first-child .@{steps-prefix-cls}-icon-dot {\n left: 0;\n }\n }\n }\n}\n\n.@{steps-prefix-cls}-vertical.@{steps-prefix-cls}-dot {\n .@{steps-prefix-cls}-item-icon {\n margin-top: 13px;\n margin-left: 0;\n background: none;\n }\n\n // https://github.com/ant-design/ant-design/issues/18354\n .@{steps-prefix-cls}-item > .@{steps-prefix-cls}-item-container > .@{steps-prefix-cls}-item-tail {\n top: 6.5px;\n left: -9px;\n margin: 0;\n padding: 22px 0 4px;\n }\n\n &.@{steps-prefix-cls}-small {\n .@{steps-prefix-cls}-item-icon {\n margin-top: 10px;\n }\n\n .@{steps-prefix-cls}-item\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-tail {\n top: 3.5px;\n }\n }\n\n .@{steps-prefix-cls}-item:first-child .@{steps-prefix-cls}-icon-dot {\n left: 0;\n }\n .@{steps-prefix-cls}-item-content {\n width: inherit;\n }\n .@{steps-prefix-cls}-item-process\n .@{steps-prefix-cls}-item-container\n .@{steps-prefix-cls}-item-icon\n .@{steps-prefix-cls}-icon-dot {\n top: -1px;\n left: -1px;\n }\n}\n",".@{steps-prefix-cls}-navigation {\n padding-top: 12px;\n\n &.@{steps-prefix-cls}-small {\n .@{steps-prefix-cls}-item {\n &-container {\n margin-left: -12px;\n }\n }\n }\n\n .@{steps-prefix-cls}-item {\n overflow: visible;\n text-align: center;\n\n &-container {\n display: inline-block;\n height: 100%;\n margin-left: -16px;\n padding-bottom: 12px;\n text-align: left;\n transition: opacity 0.3s;\n\n .@{steps-prefix-cls}-item-content {\n max-width: @steps-nav-content-max-width;\n }\n\n .@{steps-prefix-cls}-item-title {\n max-width: 100%;\n padding-right: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n &::after {\n display: none;\n }\n }\n }\n\n &:not(.@{steps-prefix-cls}-item-active) {\n .@{steps-prefix-cls}-item-container[role='button'] {\n cursor: pointer;\n\n &:hover {\n opacity: 0.85;\n }\n }\n }\n\n &:last-child {\n flex: 1;\n\n &::after {\n display: none;\n }\n }\n\n &::after {\n position: absolute;\n top: 50%;\n left: 100%;\n display: inline-block;\n width: 12px;\n height: 12px;\n margin-top: -14px;\n margin-left: -2px;\n border: 1px solid @steps-nav-arrow-color;\n border-bottom: none;\n border-left: none;\n transform: rotate(45deg);\n content: '';\n }\n\n &::before {\n position: absolute;\n bottom: 0;\n left: 50%;\n display: inline-block;\n width: 0;\n height: 2px;\n background-color: @steps-nav-active-color;\n transition: width 0.3s, left 0.3s;\n transition-timing-function: ease-out;\n content: '';\n }\n }\n\n .@{steps-prefix-cls}-item.@{steps-prefix-cls}-item-active::before {\n left: 0;\n width: 100%;\n }\n}\n\n.@{steps-prefix-cls}-navigation.@{steps-prefix-cls}-vertical {\n > .@{steps-prefix-cls}-item {\n margin-right: 0 !important;\n\n &::before {\n display: none;\n }\n &.@{steps-prefix-cls}-item-active::before {\n top: 0;\n right: 0;\n left: unset;\n display: block;\n width: 3px;\n height: calc(100% - 24px);\n }\n\n &::after {\n position: relative;\n top: -2px;\n left: 50%;\n display: block;\n width: 8px;\n height: 8px;\n margin-bottom: 8px;\n text-align: center;\n transform: rotate(135deg);\n }\n > .@{steps-prefix-cls}-item-container > .@{steps-prefix-cls}-item-tail {\n visibility: hidden;\n }\n }\n}\n\n.@{steps-prefix-cls}-navigation.@{steps-prefix-cls}-horizontal {\n > .@{steps-prefix-cls}-item\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-tail {\n visibility: hidden;\n }\n}\n",".@{steps-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n}\n\n.@{steps-prefix-cls}-item {\n &-icon {\n .@{steps-prefix-cls}.@{steps-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 8px;\n }\n }\n\n &-tail {\n .@{steps-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n\n &-title {\n .@{steps-prefix-cls}-rtl & {\n padding-right: 0;\n padding-left: 16px;\n }\n\n .@{steps-prefix-cls}-item-subtitle {\n .@{steps-prefix-cls}-rtl & {\n float: left;\n margin-right: 8px;\n margin-left: 0;\n }\n }\n\n &::after {\n .@{steps-prefix-cls}-rtl & {\n right: 100%;\n left: auto;\n }\n }\n }\n}\n\n.@{steps-prefix-cls}-horizontal:not(.@{steps-prefix-cls}-label-vertical) {\n .@{steps-prefix-cls}-item {\n .@{steps-prefix-cls}-rtl& {\n padding-right: 16px;\n padding-left: 0;\n }\n\n &:first-child {\n .@{steps-prefix-cls}-rtl& {\n padding-right: 0;\n }\n }\n\n &:last-child .@{steps-prefix-cls}-item-title {\n .@{steps-prefix-cls}-rtl& {\n padding-left: 0;\n }\n }\n }\n}\n\n// custom-icon\n.@{steps-prefix-cls}-item-custom {\n .@{steps-prefix-cls}-item-icon {\n > .@{steps-prefix-cls}-icon {\n .@{steps-prefix-cls}-rtl & {\n right: 0.5px;\n left: auto;\n }\n }\n }\n}\n\n// nav\n.@{steps-prefix-cls}-navigation {\n &.@{steps-prefix-cls}-small {\n .@{steps-prefix-cls}-item {\n &-container {\n .@{steps-prefix-cls}-rtl& {\n margin-right: -12px;\n margin-left: 0;\n }\n }\n }\n }\n\n .@{steps-prefix-cls}-item {\n &-container {\n .@{steps-prefix-cls}-rtl& {\n margin-right: -16px;\n margin-left: 0;\n text-align: right;\n }\n\n .@{steps-prefix-cls}-item-title {\n .@{steps-prefix-cls}-rtl& {\n padding-left: 0;\n }\n }\n }\n\n &::after {\n .@{steps-prefix-cls}-rtl& {\n right: 100%;\n left: auto;\n margin-right: -2px;\n margin-left: 0;\n transform: rotate(225deg);\n }\n }\n }\n}\n\n// small\n.@{steps-prefix-cls}-small {\n &.@{steps-prefix-cls}-horizontal:not(.@{steps-prefix-cls}-label-vertical)\n .@{steps-prefix-cls}-item {\n .@{steps-prefix-cls}-rtl& {\n padding-right: 12px;\n padding-left: 0;\n }\n\n &:first-child {\n .@{steps-prefix-cls}-rtl& {\n padding-right: 0;\n }\n }\n }\n\n .@{steps-prefix-cls}-item-title {\n .@{steps-prefix-cls}-rtl& {\n padding-right: 0;\n padding-left: 12px;\n }\n }\n}\n\n// vertical\n.@{steps-prefix-cls}-vertical {\n > .@{steps-prefix-cls}-item {\n .@{steps-prefix-cls}-item-icon {\n .@{steps-prefix-cls}-rtl& {\n float: right;\n margin-right: 0;\n margin-left: @steps-vertical-icon-width;\n }\n }\n }\n\n > .@{steps-prefix-cls}-item\n > .@{steps-prefix-cls}-item-container\n > .@{steps-prefix-cls}-item-tail {\n .@{steps-prefix-cls}-rtl& {\n right: @steps-vertical-tail-width;\n left: auto;\n }\n }\n\n &.@{steps-prefix-cls}-small .@{steps-prefix-cls}-item-container {\n .@{steps-prefix-cls}-item-tail {\n .@{steps-prefix-cls}-rtl& {\n right: @steps-vertical-tail-width-sm;\n left: auto;\n }\n }\n }\n}\n\n// label\n.@{steps-prefix-cls}-label-vertical {\n .@{steps-prefix-cls}-item {\n &-title {\n .@{steps-prefix-cls}-rtl& {\n padding-left: 0;\n }\n }\n }\n}\n\n// progress-dot\n.@{steps-prefix-cls}-dot,\n.@{steps-prefix-cls}-dot.@{steps-prefix-cls}-small {\n .@{steps-prefix-cls}-item {\n &-tail {\n .@{steps-prefix-cls}-rtl& {\n margin: 0 (@steps-description-max-width / 2) 0 0;\n }\n\n &::after {\n .@{steps-prefix-cls}-rtl& {\n margin-right: 12px;\n margin-left: 0;\n }\n }\n }\n\n &:first-child .@{steps-prefix-cls}-icon-dot {\n .@{steps-prefix-cls}-rtl& {\n right: 2px;\n left: auto;\n }\n }\n\n &-icon {\n .@{steps-prefix-cls}-rtl& {\n margin-right: 67px;\n margin-left: 0;\n }\n\n .@{steps-prefix-cls}-icon-dot {\n .@{steps-prefix-cls}-rtl& {\n float: right;\n }\n\n /* expand hover area */\n &::after {\n .@{steps-prefix-cls}-rtl& {\n right: -26px;\n left: auto;\n }\n }\n }\n }\n }\n}\n\n.@{steps-prefix-cls}-vertical.@{steps-prefix-cls}-dot {\n .@{steps-prefix-cls}-item-icon {\n .@{steps-prefix-cls}-rtl& {\n margin-right: 0;\n margin-left: 16px;\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/18354\n .@{steps-prefix-cls}-item > .@{steps-prefix-cls}-item-container > .@{steps-prefix-cls}-item-tail {\n .@{steps-prefix-cls}-rtl& {\n right: -9px;\n left: auto;\n }\n }\n\n .@{steps-prefix-cls}-item:first-child .@{steps-prefix-cls}-icon-dot {\n .@{steps-prefix-cls}-rtl& {\n right: 0;\n left: auto;\n }\n }\n\n .@{steps-prefix-cls}-item-process .@{steps-prefix-cls}-icon-dot {\n .@{steps-prefix-cls}-rtl& {\n right: -2px;\n left: auto;\n }\n }\n}\n\n// RTL Steps with progress\n.@{steps-prefix-cls}-rtl.@{steps-prefix-cls}-with-progress.@{steps-prefix-cls}-horizontal.@{steps-prefix-cls}-label-horizontal {\n .@{steps-prefix-cls}-item:first-child {\n padding-right: 4px;\n padding-left: 0;\n &.@{steps-prefix-cls}-item-active {\n padding-right: 4px;\n }\n }\n}\n","@progress-prefix-cls: ~'@{ant-prefix}-progress';\n\n.@{steps-prefix-cls}-with-progress {\n .@{steps-prefix-cls}-item {\n padding-top: 4px;\n\n .@{steps-prefix-cls}-item-tail {\n top: 4px !important;\n }\n }\n\n &.@{steps-prefix-cls}-horizontal .@{steps-prefix-cls}-item:first-child {\n padding-bottom: 4px;\n padding-left: 4px;\n }\n\n .@{steps-prefix-cls}-item-icon {\n position: relative;\n\n .@{progress-prefix-cls} {\n position: absolute;\n top: -5px;\n right: -5px;\n bottom: -5px;\n left: -5px;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@switch-prefix-cls: ~'@{ant-prefix}-switch';\n@switch-duration: 0.2s;\n\n@switch-pin-size: @switch-height - 4px;\n@switch-sm-pin-size: @switch-sm-height - 4px;\n\n.@{switch-prefix-cls} {\n .reset-component();\n\n position: relative;\n display: inline-block;\n box-sizing: border-box;\n min-width: @switch-min-width;\n height: @switch-height;\n line-height: @switch-height;\n vertical-align: middle;\n background-image: linear-gradient(to right, @disabled-color, @disabled-color),\n linear-gradient(to right, @component-background, @component-background);\n border: 0;\n border-radius: 100px;\n cursor: pointer;\n transition: all @switch-duration;\n user-select: none;\n\n &:focus {\n outline: 0;\n box-shadow: 0 0 0 2px fade(@disabled-color, 10%);\n }\n\n &-checked:focus {\n box-shadow: 0 0 0 2px @primary-1;\n }\n\n &:focus:hover {\n box-shadow: none;\n }\n\n &-checked {\n background: @switch-color;\n }\n\n &-loading,\n &-disabled {\n cursor: not-allowed;\n opacity: @switch-disabled-opacity;\n\n * {\n box-shadow: none;\n cursor: not-allowed;\n }\n }\n\n // ========================= Inner ==========================\n &-inner {\n display: block;\n margin: 0 @switch-inner-margin-min 0 @switch-inner-margin-max;\n color: @text-color-inverse;\n font-size: @font-size-sm;\n transition: margin @switch-duration;\n }\n\n &-checked &-inner {\n margin: 0 @switch-inner-margin-max 0 @switch-inner-margin-min;\n }\n\n // ========================= Handle =========================\n &-handle {\n position: absolute;\n top: @switch-padding;\n left: @switch-padding;\n width: @switch-pin-size;\n height: @switch-pin-size;\n transition: all @switch-duration ease-in-out;\n\n &::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: @switch-bg;\n border-radius: (@switch-pin-size / 2);\n box-shadow: 0 2px 4px 0 @switch-shadow-color;\n transition: all @switch-duration ease-in-out;\n content: '';\n }\n }\n\n &-checked &-handle {\n left: calc(100% - @switch-pin-size - @switch-padding);\n }\n\n &:not(&-disabled):active {\n .@{switch-prefix-cls}-handle::before {\n right: -30%;\n left: 0;\n }\n\n &.@{switch-prefix-cls}-checked {\n .@{switch-prefix-cls}-handle::before {\n right: 0;\n left: -30%;\n }\n }\n }\n\n // ======================== Loading =========================\n &-loading-icon.@{iconfont-css-prefix} {\n position: relative;\n top: ((@switch-pin-size - @font-size-base) / 2);\n color: rgba(0, 0, 0, 0.65);\n vertical-align: top;\n }\n\n &-checked &-loading-icon {\n color: @switch-color;\n }\n\n // ========================== Size ==========================\n &-small {\n min-width: @switch-sm-min-width;\n height: @switch-sm-height;\n line-height: @switch-sm-height;\n\n .@{switch-prefix-cls}-inner {\n margin: 0 @switch-sm-inner-margin-min 0 @switch-sm-inner-margin-max;\n font-size: @font-size-sm;\n }\n\n .@{switch-prefix-cls}-handle {\n width: @switch-sm-pin-size;\n height: @switch-sm-pin-size;\n }\n\n .@{switch-prefix-cls}-loading-icon {\n top: ((@switch-sm-pin-size - 9px) / 2);\n font-size: 9px;\n }\n\n &.@{switch-prefix-cls}-checked {\n .@{switch-prefix-cls}-inner {\n margin: 0 @switch-sm-inner-margin-max 0 @switch-sm-inner-margin-min;\n }\n\n .@{switch-prefix-cls}-handle {\n left: calc(100% - @switch-sm-pin-size - @switch-padding);\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@switch-prefix-cls: ~'@{ant-prefix}-switch';\n\n@switch-pin-size: @switch-height - 4px;\n@switch-sm-pin-size: @switch-sm-height - 4px;\n\n.@{switch-prefix-cls}-rtl {\n direction: rtl;\n\n .@{switch-prefix-cls}-inner {\n margin: 0 @switch-inner-margin-max 0 @switch-inner-margin-min;\n }\n\n .@{switch-prefix-cls}-handle {\n right: @switch-padding;\n left: auto;\n }\n\n &:not(&-disabled):active {\n .@{switch-prefix-cls}-handle::before {\n right: 0;\n left: -30%;\n }\n\n &.@{switch-prefix-cls}-checked {\n .@{switch-prefix-cls}-handle::before {\n right: -30%;\n left: 0;\n }\n }\n }\n\n &.@{switch-prefix-cls}-checked {\n .@{switch-prefix-cls}-inner {\n margin: 0 @switch-inner-margin-min 0 @switch-inner-margin-max;\n }\n\n .@{switch-prefix-cls}-handle {\n right: calc(100% - @switch-pin-size - @switch-padding);\n }\n }\n\n &.@{switch-prefix-cls}-small {\n &.@{switch-prefix-cls}-checked {\n .@{switch-prefix-cls}-handle {\n right: calc(100% - @switch-sm-pin-size - @switch-padding);\n }\n }\n }\n}\n","@import (reference) '../../style/themes/index';\n\n@table-prefix-cls: ~'@{ant-prefix}-table';\n\n.table-size(@size, @padding-vertical, @padding-horizontal, @font-size) {\n .@{table-prefix-cls}.@{table-prefix-cls}-@{size} {\n font-size: @font-size;\n\n .@{table-prefix-cls}-title,\n .@{table-prefix-cls}-footer,\n .@{table-prefix-cls}-thead > tr > th,\n .@{table-prefix-cls}-tbody > tr > td,\n tfoot > tr > th,\n tfoot > tr > td {\n padding: @padding-vertical @padding-horizontal;\n }\n\n .@{table-prefix-cls}-filter-trigger {\n margin-right: -(@padding-horizontal / 2);\n }\n\n .@{table-prefix-cls}-expanded-row-fixed {\n margin: -@padding-vertical -@padding-horizontal;\n }\n\n .@{table-prefix-cls}-tbody {\n // ========================= Nest Table ===========================\n .@{table-prefix-cls}-wrapper:only-child {\n .@{table-prefix-cls} {\n margin: -@padding-vertical -@padding-horizontal -@padding-vertical (@table-expand-column-width -\n @padding-horizontal);\n }\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/35167\n .@{table-prefix-cls}-selection-column {\n padding-inline-start: (@padding-horizontal / 4);\n }\n }\n}\n\n// ================================================================\n// = Middle =\n// ================================================================\n.table-size(~'middle', @table-padding-vertical-md, @table-padding-horizontal-md, @table-font-size-md);\n\n// ================================================================\n// = Small =\n// ================================================================\n.table-size(~'small', @table-padding-vertical-sm, @table-padding-horizontal-sm, @table-font-size-sm);\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import './size';\n@import './bordered';\n\n@table-prefix-cls: ~'@{ant-prefix}-table';\n@tree-prefix-cls: ~'@{ant-prefix}-tree';\n@dropdown-prefix-cls: ~'@{ant-prefix}-dropdown';\n@descriptions-prefix-cls: ~'@{ant-prefix}-descriptions';\n@table-header-icon-color: #bfbfbf;\n@table-header-icon-color-hover: darken(@table-header-icon-color, 10%);\n@table-sticky-zindex: calc(@zindex-table-fixed + 1);\n@table-sticky-scroll-bar-active-bg: fade(@table-sticky-scroll-bar-bg, 80%);\n@table-filter-dropdown-max-height: 264px;\n@table-expand-column-width: 48px;\n\n.@{table-prefix-cls}-wrapper {\n clear: both;\n max-width: 100%;\n .clearfix();\n}\n\n.@{table-prefix-cls} {\n .reset-component();\n position: relative;\n font-size: @table-font-size;\n background: @table-bg;\n border-radius: @table-border-radius-base;\n\n // https://github.com/ant-design/ant-design/issues/17611\n table {\n width: 100%;\n text-align: left;\n border-radius: @table-border-radius-base @table-border-radius-base 0 0;\n border-collapse: separate;\n border-spacing: 0;\n }\n\n // ============================= Cell =============================\n &-thead > tr > th,\n &-tbody > tr > td,\n tfoot > tr > th,\n tfoot > tr > td {\n position: relative;\n padding: @table-padding-vertical @table-padding-horizontal;\n overflow-wrap: break-word;\n }\n\n &-cell-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: keep-all;\n\n // Fixed first or last should special process\n &.@{table-prefix-cls}-cell-fix-left-last,\n &.@{table-prefix-cls}-cell-fix-right-first {\n overflow: visible;\n\n .@{table-prefix-cls}-cell-content {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n .@{table-prefix-cls}-column-title {\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: keep-all;\n }\n }\n\n // ============================ Title =============================\n &-title {\n padding: @table-padding-vertical @table-padding-horizontal;\n }\n\n // ============================ Footer ============================\n &-footer {\n padding: @table-padding-vertical @table-padding-horizontal;\n color: @table-footer-color;\n background: @table-footer-bg;\n }\n\n // ============================ Header ============================\n &-thead {\n > tr {\n > th {\n position: relative;\n color: @table-header-color;\n font-weight: 500;\n text-align: left;\n background: @table-header-bg;\n border-bottom: @border-width-base @border-style-base @table-border-color;\n transition: background 0.3s ease;\n\n &[colspan]:not([colspan='1']) {\n text-align: center;\n }\n\n &:not(:last-child):not(.@{table-prefix-cls}-selection-column):not(.@{table-prefix-cls}-row-expand-icon-cell):not([colspan])::before {\n position: absolute;\n top: 50%;\n right: 0;\n width: 1px;\n height: 1.6em;\n background-color: @table-header-cell-split-color;\n transform: translateY(-50%);\n transition: background-color 0.3s;\n content: '';\n }\n }\n }\n\n > tr:not(:last-child) > th {\n &[colspan] {\n border-bottom: 0;\n }\n }\n }\n\n // ============================= Body =============================\n &-tbody {\n > tr {\n > td {\n border-bottom: @border-width-base @border-style-base @table-border-color;\n transition: background 0.3s;\n\n // ========================= Nest Table ===========================\n > .@{table-prefix-cls}-wrapper:only-child,\n > .@{table-prefix-cls}-expanded-row-fixed > .@{table-prefix-cls}-wrapper:only-child {\n .@{table-prefix-cls} {\n margin: -@table-padding-vertical -@table-padding-horizontal -@table-padding-vertical (@table-expand-column-width -\n @table-padding-horizontal);\n\n &-tbody > tr:last-child > td {\n border-bottom: 0;\n\n &:first-child,\n &:last-child {\n border-radius: 0;\n }\n }\n }\n }\n }\n\n &.@{table-prefix-cls}-row:hover > td,\n > td.@{table-prefix-cls}-cell-row-hover {\n background: @table-row-hover-bg;\n }\n\n &.@{table-prefix-cls}-row-selected {\n > td {\n background: @table-selected-row-bg;\n border-color: rgba(0, 0, 0, 0.03);\n }\n\n &:hover {\n > td {\n background: @table-selected-row-hover-bg;\n }\n }\n }\n }\n }\n\n // =========================== Summary ============================\n &-summary {\n position: relative;\n z-index: @zindex-table-fixed;\n background: @table-bg;\n\n div& {\n box-shadow: 0 -@border-width-base 0 @table-border-color;\n }\n\n > tr {\n > th,\n > td {\n border-bottom: @border-width-base @border-style-base @table-border-color;\n }\n }\n }\n\n // ========================== Pagination ==========================\n &-pagination.@{ant-prefix}-pagination {\n margin: 16px 0;\n }\n\n &-pagination {\n display: flex;\n flex-wrap: wrap;\n row-gap: @padding-xs;\n\n > * {\n flex: none;\n }\n\n &-left {\n justify-content: flex-start;\n }\n\n &-center {\n justify-content: center;\n }\n\n &-right {\n justify-content: flex-end;\n }\n }\n\n // ================================================================\n // = Function =\n // ================================================================\n\n // ============================ Sorter ============================\n &-thead th.@{table-prefix-cls}-column-has-sorters {\n outline: none;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n background: @table-header-sort-active-bg;\n\n &::before {\n background-color: transparent !important;\n }\n }\n\n &:focus-visible {\n color: @primary-color;\n }\n\n // https://github.com/ant-design/ant-design/issues/30969\n &.@{table-prefix-cls}-cell-fix-left:hover,\n &.@{table-prefix-cls}-cell-fix-right:hover {\n background: @table-fixed-header-sort-active-bg;\n }\n }\n\n &-thead th.@{table-prefix-cls}-column-sort {\n background: @table-header-sort-bg;\n\n &::before {\n background-color: transparent !important;\n }\n }\n\n td&-column-sort {\n background: @table-body-sort-bg;\n }\n\n &-column-title {\n position: relative;\n z-index: 1;\n flex: 1;\n }\n\n &-column-sorters {\n display: flex;\n flex: auto;\n align-items: center;\n justify-content: space-between;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n content: '';\n }\n }\n\n &-column-sorter {\n margin-left: 4px;\n color: @table-header-icon-color;\n font-size: 0;\n transition: color 0.3s;\n\n &-inner {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n }\n\n &-up,\n &-down {\n font-size: 11px;\n\n &.active {\n color: @primary-color;\n }\n }\n\n &-up + &-down {\n margin-top: -0.3em;\n }\n }\n\n &-column-sorters:hover &-column-sorter {\n color: darken(@table-header-icon-color, 10%);\n }\n\n // ============================ Filter ============================\n &-filter-column {\n display: flex;\n justify-content: space-between;\n }\n\n &-filter-trigger {\n position: relative;\n display: flex;\n align-items: center;\n margin: -4px (-@table-padding-horizontal / 2) -4px 4px;\n padding: 0 4px;\n color: @table-header-icon-color;\n font-size: @font-size-sm;\n border-radius: @border-radius-base;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n color: @text-color-secondary;\n background: @table-header-filter-active-bg;\n }\n\n &.active {\n color: @primary-color;\n }\n }\n\n // Dropdown\n &-filter-dropdown {\n .reset-component();\n\n min-width: 120px;\n background-color: @table-filter-dropdown-bg;\n border-radius: @border-radius-base;\n box-shadow: @box-shadow-base;\n\n // Reset menu\n .@{dropdown-prefix-cls}-menu {\n // https://github.com/ant-design/ant-design/issues/4916\n // https://github.com/ant-design/ant-design/issues/19542\n max-height: @table-filter-dropdown-max-height;\n overflow-x: hidden;\n border: 0;\n box-shadow: none;\n\n &:empty::after {\n display: block;\n padding: 8px 0;\n color: @disabled-color;\n font-size: @font-size-sm;\n text-align: center;\n content: 'Not Found';\n }\n }\n\n &-tree {\n padding: 8px 8px 0;\n\n .@{tree-prefix-cls}-treenode .@{tree-prefix-cls}-node-content-wrapper:hover {\n background-color: @tree-node-hover-bg;\n }\n\n .@{tree-prefix-cls}-treenode-checkbox-checked .@{tree-prefix-cls}-node-content-wrapper {\n &,\n &:hover {\n background-color: @tree-node-selected-bg;\n }\n }\n }\n\n &-search {\n padding: 8px;\n border-bottom: @border-width-base @border-color-split @border-style-base;\n\n &-input {\n input {\n min-width: 140px;\n }\n .@{iconfont-css-prefix} {\n color: @disabled-color;\n }\n }\n }\n\n &-checkall {\n width: 100%;\n margin-bottom: 4px;\n margin-left: 4px;\n }\n\n &-submenu > ul {\n max-height: calc(100vh - 130px);\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n // Checkbox\n &,\n &-submenu {\n .@{ant-prefix}-checkbox-wrapper + span {\n padding-left: 8px;\n }\n }\n\n // Operation\n &-btns {\n display: flex;\n justify-content: space-between;\n padding: 7px 8px;\n overflow: hidden;\n background-color: @table-filter-btns-bg;\n border-top: @border-width-base @border-style-base @table-border-color;\n }\n }\n\n // ========================== Selections ==========================\n &-selection-col {\n width: @table-selection-column-width;\n }\n\n &-bordered &-selection-col {\n width: @table-selection-column-width + 18px;\n }\n\n table tr th&-selection-column,\n table tr td&-selection-column {\n padding-right: @padding-xs;\n padding-left: @padding-xs;\n text-align: center;\n\n .@{ant-prefix}-radio-wrapper {\n margin-right: 0;\n }\n }\n\n table tr th&-selection-column&-cell-fix-left {\n z-index: 3;\n }\n\n table tr th&-selection-column::after {\n background-color: transparent !important;\n }\n\n &-selection {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n\n &-extra {\n position: absolute;\n top: 0;\n z-index: 1;\n cursor: pointer;\n transition: all 0.3s;\n margin-inline-start: 100%;\n padding-inline-start: (@table-padding-horizontal / 4);\n\n .@{iconfont-css-prefix} {\n color: @table-header-icon-color;\n font-size: 10px;\n\n &:hover {\n color: @table-header-icon-color-hover;\n }\n }\n }\n }\n\n // ========================== Expandable ==========================\n &-expand-icon-col {\n width: @table-expand-column-width;\n }\n\n &-row-expand-icon-cell {\n text-align: center;\n\n .@{table-prefix-cls}-row-expand-icon {\n display: inline-flex;\n float: none;\n vertical-align: sub;\n }\n }\n\n &-row-indent {\n float: left;\n height: 1px;\n }\n\n &-row-expand-icon {\n .operation-unit();\n position: relative;\n float: left;\n box-sizing: border-box;\n width: @expand-icon-size;\n height: @expand-icon-size;\n padding: 0;\n color: inherit;\n line-height: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2)) * 2 + @border-width-base *\n 3;\n background: @table-expand-icon-bg;\n border: @border-width-base @border-style-base @table-border-color;\n border-radius: @border-radius-base;\n outline: none;\n transform: scale((unit(@checkbox-size) / unit(@expand-icon-size)));\n transition: all 0.3s;\n user-select: none;\n @expand-icon-size: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2)) * 2 +\n @border-width-base * 3;\n\n &:focus,\n &:hover,\n &:active {\n border-color: currentcolor;\n }\n\n &::before,\n &::after {\n position: absolute;\n background: currentcolor;\n transition: transform 0.3s ease-out;\n content: '';\n }\n\n &::before {\n top: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));\n right: 3px;\n left: 3px;\n height: @border-width-base;\n }\n\n &::after {\n top: 3px;\n bottom: 3px;\n left: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));\n width: @border-width-base;\n transform: rotate(90deg);\n }\n\n // Motion effect\n &-collapsed::before {\n transform: rotate(-180deg);\n }\n\n &-collapsed::after {\n transform: rotate(0deg);\n }\n\n &-spaced {\n &::before,\n &::after {\n display: none;\n content: none;\n }\n background: transparent;\n border: 0;\n visibility: hidden;\n }\n\n .@{table-prefix-cls}-row-indent + & {\n margin-top: ((@font-size-base * @line-height-base - @border-width-base * 3) / 2) -\n ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));\n margin-right: @padding-xs;\n }\n }\n\n tr&-expanded-row {\n &,\n &:hover {\n > td {\n background: @table-expanded-row-bg;\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/25573\n .@{descriptions-prefix-cls}-view {\n display: flex;\n\n table {\n flex: auto;\n width: auto;\n }\n }\n }\n\n // With fixed\n .@{table-prefix-cls}-expanded-row-fixed {\n position: relative;\n margin: -@table-padding-vertical -@table-padding-horizontal;\n padding: @table-padding-vertical @table-padding-horizontal;\n }\n\n // ========================= Placeholder ==========================\n &-tbody > tr&-placeholder {\n text-align: center;\n .@{table-prefix-cls}-empty & {\n color: @disabled-color;\n }\n\n &:hover {\n > td {\n background: @component-background;\n }\n }\n }\n\n // ============================ Fixed =============================\n &-cell-fix-left,\n &-cell-fix-right {\n position: sticky !important;\n z-index: @zindex-table-fixed;\n background: @table-bg;\n }\n\n &-cell-fix-left-first::after,\n &-cell-fix-left-last::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n width: 30px;\n transform: translateX(100%);\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n }\n\n &-cell-fix-left-all::after {\n display: none;\n }\n\n &-cell-fix-right-first::after,\n &-cell-fix-right-last::after {\n position: absolute;\n top: 0;\n bottom: -1px;\n left: 0;\n width: 30px;\n transform: translateX(-100%);\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n }\n\n .@{table-prefix-cls}-container {\n &::before,\n &::after {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: @zindex-table-fixed;\n width: 30px;\n transition: box-shadow 0.3s;\n content: '';\n pointer-events: none;\n }\n\n &::before {\n left: 0;\n }\n\n &::after {\n right: 0;\n }\n }\n\n &-ping-left {\n &:not(.@{table-prefix-cls}-has-fix-left) > .@{table-prefix-cls}-container {\n position: relative;\n\n &::before {\n box-shadow: inset 10px 0 8px -8px darken(@shadow-color, 5%);\n }\n }\n\n .@{table-prefix-cls}-cell-fix-left-first::after,\n .@{table-prefix-cls}-cell-fix-left-last::after {\n box-shadow: inset 10px 0 8px -8px darken(@shadow-color, 5%);\n }\n\n .@{table-prefix-cls}-cell-fix-left-last::before {\n background-color: transparent !important;\n }\n }\n\n &-ping-right {\n &:not(.@{table-prefix-cls}-has-fix-right) > .@{table-prefix-cls}-container {\n position: relative;\n\n &::after {\n box-shadow: inset -10px 0 8px -8px darken(@shadow-color, 5%);\n }\n }\n\n .@{table-prefix-cls}-cell-fix-right-first::after,\n .@{table-prefix-cls}-cell-fix-right-last::after {\n box-shadow: inset -10px 0 8px -8px darken(@shadow-color, 5%);\n }\n }\n\n &-sticky {\n &-holder {\n position: sticky;\n z-index: @table-sticky-zindex;\n background: @component-background;\n }\n\n &-scroll {\n position: sticky;\n bottom: 0;\n z-index: @table-sticky-zindex;\n display: flex;\n align-items: center;\n background: lighten(@table-border-color, 80%);\n border-top: 1px solid @table-border-color;\n opacity: 0.6;\n\n &:hover {\n transform-origin: center bottom;\n }\n\n &-bar {\n height: 8px;\n background-color: @table-sticky-scroll-bar-bg;\n border-radius: @table-sticky-scroll-bar-radius;\n\n &:hover {\n background-color: @table-sticky-scroll-bar-active-bg;\n }\n\n &-active {\n background-color: @table-sticky-scroll-bar-active-bg;\n }\n }\n }\n }\n}\n\n@media all and (-ms-high-contrast: none) {\n .@{table-prefix-cls} {\n &-ping-left {\n .@{table-prefix-cls}-cell-fix-left-last::after {\n box-shadow: none !important;\n }\n }\n\n &-ping-right {\n .@{table-prefix-cls}-cell-fix-right-first::after {\n box-shadow: none !important;\n }\n }\n }\n}\n\n@import './radius';\n@import './rtl';\n\n@root-entry-name: default;","@import './size';\n@import (reference) '../../style/themes/index';\n@table-prefix-cls: ~'@{ant-prefix}-table';\n\n@table-border: @border-width-base @border-style-base @table-border-color;\n\n.@{table-prefix-cls}.@{table-prefix-cls}-bordered {\n // ============================ Title =============================\n > .@{table-prefix-cls}-title {\n border: @table-border;\n border-bottom: 0;\n }\n\n > .@{table-prefix-cls}-container {\n // ============================ Content ============================\n border-left: @table-border;\n\n > .@{table-prefix-cls}-content,\n > .@{table-prefix-cls}-header,\n > .@{table-prefix-cls}-body,\n > .@{table-prefix-cls}-summary {\n > table {\n // ============================= Cell =============================\n > thead > tr > th,\n > tbody > tr > td,\n > tfoot > tr > th,\n > tfoot > tr > td {\n border-right: @table-border;\n }\n // ============================ Header ============================\n > thead {\n > tr:not(:last-child) > th {\n border-bottom: @border-width-base @border-style-base @table-border-color;\n }\n\n > tr > th {\n &::before {\n background-color: transparent !important;\n }\n }\n }\n\n // Fixed right should provides additional border\n > thead > tr,\n > tbody > tr,\n > tfoot > tr {\n > .@{table-prefix-cls}-cell-fix-right-first::after {\n border-right: @table-border;\n }\n }\n }\n\n // ========================== Expandable ==========================\n > table > tbody > tr > td {\n > .@{table-prefix-cls}-expanded-row-fixed {\n margin: -@table-padding-vertical (-@table-padding-horizontal - @border-width-base);\n\n &::after {\n position: absolute;\n top: 0;\n right: @border-width-base;\n bottom: 0;\n border-right: @table-border;\n content: '';\n }\n }\n }\n }\n\n > .@{table-prefix-cls}-content,\n > .@{table-prefix-cls}-header {\n > table {\n border-top: @table-border;\n }\n }\n }\n\n &.@{table-prefix-cls}-scroll-horizontal {\n > .@{table-prefix-cls}-container > .@{table-prefix-cls}-body {\n > table > tbody {\n > tr.@{table-prefix-cls}-expanded-row,\n > tr.@{table-prefix-cls}-placeholder {\n > td {\n border-right: 0;\n }\n }\n }\n }\n }\n\n // Size related\n &.@{table-prefix-cls}-middle {\n > .@{table-prefix-cls}-container {\n > .@{table-prefix-cls}-content,\n > .@{table-prefix-cls}-body {\n > table > tbody > tr > td {\n > .@{table-prefix-cls}-expanded-row-fixed {\n margin: -@table-padding-vertical-md (-@table-padding-horizontal-md - @border-width-base);\n }\n }\n }\n }\n }\n\n &.@{table-prefix-cls}-small {\n > .@{table-prefix-cls}-container {\n > .@{table-prefix-cls}-content,\n > .@{table-prefix-cls}-body {\n > table > tbody > tr > td {\n > .@{table-prefix-cls}-expanded-row-fixed {\n margin: -@table-padding-vertical-sm (-@table-padding-horizontal-sm - @border-width-base);\n }\n }\n }\n }\n }\n\n // ============================ Footer ============================\n > .@{table-prefix-cls}-footer {\n border: @table-border;\n border-top: 0;\n }\n}\n\n.@{table-prefix-cls}-cell {\n // ============================ Nested ============================\n .@{table-prefix-cls}-container:first-child {\n // :first-child to avoid the case when bordered and title is set\n border-top: 0;\n }\n\n // https://github.com/ant-design/ant-design/issues/35577\n &-scrollbar:not([rowspan]) {\n box-shadow: 0 @border-width-base 0 @border-width-base @table-header-bg;\n }\n}\n","// ================================================================\n// = Border Radius =\n// ================================================================\n.@{table-prefix-cls} {\n /* title + table */\n &-title {\n border-radius: @table-border-radius-base @table-border-radius-base 0 0;\n }\n\n &-title + &-container {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n table {\n border-radius: 0;\n\n > thead > tr:first-child {\n th:first-child {\n border-radius: 0;\n }\n\n th:last-child {\n border-radius: 0;\n }\n }\n }\n }\n\n /* table */\n &-container {\n border-top-left-radius: @table-border-radius-base;\n border-top-right-radius: @table-border-radius-base;\n\n table > thead > tr:first-child {\n th:first-child {\n border-top-left-radius: @table-border-radius-base;\n }\n\n th:last-child {\n border-top-right-radius: @table-border-radius-base;\n }\n }\n }\n\n /* table + footer */\n &-footer {\n border-radius: 0 0 @table-border-radius-base @table-border-radius-base;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@table-prefix-cls: ~'@{ant-prefix}-table';\n@table-wrapepr-cls: ~'@{table-prefix-cls}-wrapper';\n@table-wrapepr-rtl-cls: ~'@{table-prefix-cls}-wrapper-rtl';\n\n.@{table-prefix-cls}-wrapper {\n &-rtl {\n direction: rtl;\n }\n}\n\n.@{table-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n table {\n .@{table-wrapepr-rtl-cls} & {\n text-align: right;\n }\n }\n\n // ============================ Header ============================\n &-thead {\n > tr {\n > th {\n &[colspan]:not([colspan='1']) {\n .@{table-wrapepr-rtl-cls} & {\n text-align: center;\n }\n }\n\n &:not(:last-child):not(.@{table-prefix-cls}-selection-column):not(.@{table-prefix-cls}-row-expand-icon-cell):not([colspan])::before {\n .@{table-wrapepr-rtl-cls} & {\n right: auto;\n left: 0;\n }\n }\n\n .@{table-wrapepr-rtl-cls} & {\n text-align: right;\n }\n }\n }\n }\n\n // ============================= Body =============================\n &-tbody {\n > tr {\n // ========================= Nest Table ===========================\n .@{table-prefix-cls}-wrapper:only-child {\n .@{table-prefix-cls}.@{table-prefix-cls}-rtl {\n margin: -@table-padding-vertical (@table-padding-horizontal + ceil(@font-size-sm * 1.4)) -@table-padding-vertical -@table-padding-horizontal;\n }\n }\n }\n }\n\n // ========================== Pagination ==========================\n &-pagination {\n &-left {\n .@{table-wrapepr-cls}.@{table-wrapepr-rtl-cls} & {\n justify-content: flex-end;\n }\n }\n\n &-right {\n .@{table-wrapepr-cls}.@{table-wrapepr-rtl-cls} & {\n justify-content: flex-start;\n }\n }\n }\n\n // ================================================================\n // = Function =\n // ================================================================\n\n // ============================ Sorter ============================\n &-column-sorter {\n .@{table-wrapepr-rtl-cls} & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n\n // ============================ Filter ============================\n &-filter-column-title {\n .@{table-wrapepr-rtl-cls} & {\n padding: @table-padding-vertical @table-padding-horizontal @table-padding-vertical 2.3em;\n }\n }\n\n &-thead tr th.@{table-prefix-cls}-column-has-sorters {\n .@{table-prefix-cls}-filter-column-title {\n .@{table-prefix-cls}-rtl & {\n padding: 0 0 0 2.3em;\n }\n }\n }\n\n &-filter-trigger {\n .@{table-wrapepr-rtl-cls} & {\n margin: -4px 4px -4px (-@table-padding-horizontal / 2);\n }\n }\n\n // Dropdown\n &-filter-dropdown {\n // Checkbox\n &,\n &-submenu {\n .@{ant-prefix}-checkbox-wrapper + span {\n .@{ant-prefix}-dropdown-rtl &,\n .@{ant-prefix}-dropdown-menu-submenu-rtl& {\n padding-right: 8px;\n padding-left: 0;\n }\n }\n }\n }\n\n // ========================== Selections ==========================\n &-selection {\n .@{table-wrapepr-rtl-cls} & {\n text-align: center;\n }\n }\n\n // ========================== Expandable ==========================\n &-row-indent {\n .@{table-wrapepr-rtl-cls} & {\n float: right;\n }\n }\n\n &-row-expand-icon {\n .@{table-wrapepr-rtl-cls} & {\n float: right;\n }\n\n .@{table-prefix-cls}-row-indent + & {\n .@{table-wrapepr-rtl-cls} & {\n margin-right: 0;\n margin-left: @padding-xs;\n }\n }\n\n &::after {\n .@{table-wrapepr-rtl-cls} & {\n transform: rotate(-90deg);\n }\n }\n\n &-collapsed::before {\n .@{table-wrapepr-rtl-cls} & {\n transform: rotate(180deg);\n }\n }\n\n &-collapsed::after {\n .@{table-wrapepr-rtl-cls} & {\n transform: rotate(0deg);\n }\n }\n }\n}\n","@import '../../style/themes/index';\n\n@tree-prefix-cls: ~'@{ant-prefix}-tree';\n\n.@{tree-prefix-cls}.@{tree-prefix-cls}-directory {\n // ================== TreeNode ==================\n .@{tree-prefix-cls}-treenode {\n position: relative;\n\n // Hover color\n &::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n transition: background-color 0.3s;\n content: '';\n pointer-events: none;\n }\n\n &:hover {\n &::before {\n background: @item-hover-bg;\n }\n }\n\n // Elements\n > * {\n z-index: 1;\n }\n\n // >>> Switcher\n .@{tree-prefix-cls}-switcher {\n transition: color 0.3s;\n }\n\n // >>> Title\n .@{tree-prefix-cls}-node-content-wrapper {\n border-radius: 0;\n user-select: none;\n\n &:hover {\n background: transparent;\n }\n\n &.@{tree-prefix-cls}-node-selected {\n color: @tree-directory-selected-color;\n background: transparent;\n }\n }\n\n // ============= Selected =============\n &-selected {\n &:hover::before,\n &::before {\n background: @tree-directory-selected-bg;\n }\n\n // >>> Switcher\n .@{tree-prefix-cls}-switcher {\n color: @tree-directory-selected-color;\n }\n\n // >>> Title\n .@{tree-prefix-cls}-node-content-wrapper {\n color: @tree-directory-selected-color;\n background: transparent;\n }\n }\n }\n}\n","/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n@keyframes antCheckboxEffect {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n 100% {\n transform: scale(1.6);\n opacity: 0;\n }\n}\n@keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode {\n position: relative;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode::before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n transition: background-color 0.3s;\n content: '';\n pointer-events: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode:hover::before {\n background: #f5f5f5;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode > * {\n z-index: 1;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher {\n transition: color 0.3s;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper {\n border-radius: 0;\n user-select: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover {\n background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected {\n color: #fff;\n background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before,\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected::before {\n background: #1890ff;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher {\n color: #fff;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper {\n color: #fff;\n background: transparent;\n}\n.ant-tree-checkbox {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n position: relative;\n top: 0.2em;\n line-height: 1;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner {\n border-color: #1890ff;\n}\n.ant-tree-checkbox-checked::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 1px solid #1890ff;\n border-radius: 2px;\n visibility: hidden;\n animation: antCheckboxEffect 0.36s ease-in-out;\n animation-fill-mode: backwards;\n content: '';\n}\n.ant-tree-checkbox:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox::after {\n visibility: visible;\n}\n.ant-tree-checkbox-inner {\n position: relative;\n top: 0;\n left: 0;\n display: block;\n width: 16px;\n height: 16px;\n direction: ltr;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n border-collapse: separate;\n transition: all 0.3s;\n}\n.ant-tree-checkbox-inner::after {\n position: absolute;\n top: 50%;\n left: 21.5%;\n display: table;\n width: 5.71428571px;\n height: 9.14285714px;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(0) translate(-50%, -50%);\n opacity: 0;\n transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n content: ' ';\n}\n.ant-tree-checkbox-input {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n position: absolute;\n display: table;\n border: 2px solid #fff;\n border-top: 0;\n border-left: 0;\n transform: rotate(45deg) scale(1) translate(-50%, -50%);\n opacity: 1;\n transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n content: ' ';\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner {\n background-color: #1890ff;\n border-color: #1890ff;\n}\n.ant-tree-checkbox-disabled {\n cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n border-color: rgba(0, 0, 0, 0.25);\n animation-name: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-input {\n cursor: not-allowed;\n pointer-events: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner {\n background-color: #f5f5f5;\n border-color: #d9d9d9 !important;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n border-color: #f5f5f5;\n border-collapse: separate;\n animation-name: none;\n}\n.ant-tree-checkbox-disabled + span {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled::after {\n visibility: hidden;\n}\n.ant-tree-checkbox-wrapper {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-flex;\n align-items: baseline;\n line-height: unset;\n cursor: pointer;\n}\n.ant-tree-checkbox-wrapper::after {\n display: inline-block;\n width: 0;\n overflow: hidden;\n content: '\\a0';\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled {\n cursor: not-allowed;\n}\n.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper {\n margin-left: 8px;\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type='checkbox'] {\n width: 14px;\n height: 14px;\n}\n.ant-tree-checkbox + span {\n padding-right: 8px;\n padding-left: 8px;\n}\n.ant-tree-checkbox-group {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n display: inline-block;\n}\n.ant-tree-checkbox-group-item {\n margin-right: 8px;\n}\n.ant-tree-checkbox-group-item:last-child {\n margin-right: 0;\n}\n.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item {\n margin-left: 0;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner {\n background-color: #fff;\n border-color: #d9d9d9;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after {\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n background-color: #1890ff;\n border: 0;\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n content: ' ';\n}\n.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n background-color: rgba(0, 0, 0, 0.25);\n border-color: rgba(0, 0, 0, 0.25);\n}\n.ant-tree {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5715;\n list-style: none;\n font-feature-settings: 'tnum';\n background: #fff;\n border-radius: 2px;\n transition: background-color 0.3s;\n}\n.ant-tree-focused:not(:hover):not(.ant-tree-active-focused) {\n background: #e6f7ff;\n}\n.ant-tree-list-holder-inner {\n align-items: flex-start;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner {\n align-items: stretch;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper {\n flex: auto;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging {\n position: relative;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 4px;\n left: 0;\n border: 1px solid #1890ff;\n opacity: 0;\n animation: ant-tree-node-fx-do-not-use 0.3s;\n animation-play-state: running;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n}\n.ant-tree .ant-tree-treenode {\n display: flex;\n align-items: flex-start;\n padding: 0 0 4px 0;\n outline: none;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper {\n color: rgba(0, 0, 0, 0.25);\n cursor: not-allowed;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover {\n background: transparent;\n}\n.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper {\n background: #f5f5f5;\n}\n.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title {\n color: inherit;\n font-weight: 500;\n}\n.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n width: 24px;\n line-height: 24px;\n text-align: center;\n visibility: visible;\n opacity: 0.2;\n transition: opacity 0.3s;\n}\n.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n opacity: 0.45;\n}\n.ant-tree-indent {\n align-self: stretch;\n white-space: nowrap;\n user-select: none;\n}\n.ant-tree-indent-unit {\n display: inline-block;\n width: 24px;\n}\n.ant-tree-draggable-icon {\n visibility: hidden;\n}\n.ant-tree-switcher {\n position: relative;\n flex: none;\n align-self: stretch;\n width: 24px;\n margin: 0;\n line-height: 24px;\n text-align: center;\n cursor: pointer;\n user-select: none;\n}\n.ant-tree-switcher .ant-tree-switcher-icon,\n.ant-tree-switcher .ant-select-tree-switcher-icon {\n display: inline-block;\n font-size: 10px;\n vertical-align: baseline;\n}\n.ant-tree-switcher .ant-tree-switcher-icon svg,\n.ant-tree-switcher .ant-select-tree-switcher-icon svg {\n transition: transform 0.3s;\n}\n.ant-tree-switcher-noop {\n cursor: default;\n}\n.ant-tree-switcher_close .ant-tree-switcher-icon svg {\n transform: rotate(-90deg);\n}\n.ant-tree-switcher-loading-icon {\n color: #1890ff;\n}\n.ant-tree-switcher-leaf-line {\n position: relative;\n z-index: 1;\n display: inline-block;\n width: 100%;\n height: 100%;\n}\n.ant-tree-switcher-leaf-line::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n margin-left: -1px;\n border-right: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-tree-switcher-leaf-line::after {\n position: absolute;\n width: 10px;\n height: 14px;\n border-bottom: 1px solid #d9d9d9;\n content: ' ';\n}\n.ant-tree-checkbox {\n top: initial;\n margin: 4px 8px 0 0;\n}\n.ant-tree .ant-tree-node-content-wrapper {\n position: relative;\n z-index: auto;\n min-height: 24px;\n margin: 0;\n padding: 0 4px;\n color: inherit;\n line-height: 24px;\n background: transparent;\n border-radius: 2px;\n cursor: pointer;\n transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n}\n.ant-tree .ant-tree-node-content-wrapper:hover {\n background-color: #f5f5f5;\n}\n.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected {\n background-color: #bae7ff;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle {\n display: inline-block;\n width: 24px;\n height: 24px;\n line-height: 24px;\n text-align: center;\n vertical-align: top;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty {\n display: none;\n}\n.ant-tree-unselectable .ant-tree-node-content-wrapper:hover {\n background-color: transparent;\n}\n.ant-tree-node-content-wrapper {\n line-height: 24px;\n user-select: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator {\n position: absolute;\n z-index: 1;\n height: 2px;\n background-color: #1890ff;\n border-radius: 1px;\n pointer-events: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator::after {\n position: absolute;\n top: -3px;\n left: -6px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n border: 2px solid #1890ff;\n border-radius: 50%;\n content: '';\n}\n.ant-tree .ant-tree-treenode.drop-container > [draggable] {\n box-shadow: 0 0 0 2px #1890ff;\n}\n.ant-tree-show-line .ant-tree-indent-unit {\n position: relative;\n height: 100%;\n}\n.ant-tree-show-line .ant-tree-indent-unit::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -4px;\n border-right: 1px solid #d9d9d9;\n content: '';\n}\n.ant-tree-show-line .ant-tree-indent-unit-end::before {\n display: none;\n}\n.ant-tree-show-line .ant-tree-switcher {\n background: #fff;\n}\n.ant-tree-show-line .ant-tree-switcher-line-icon {\n vertical-align: -0.15em;\n}\n.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line::before {\n top: auto !important;\n bottom: auto !important;\n height: 14px !important;\n}\n.ant-tree-rtl {\n direction: rtl;\n}\n.ant-tree-rtl .ant-tree-node-content-wrapper[draggable='true'] .ant-tree-drop-indicator::after {\n right: -6px;\n left: unset;\n}\n.ant-tree .ant-tree-treenode-rtl {\n direction: rtl;\n}\n.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg {\n transform: rotate(90deg);\n}\n.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit::before {\n right: auto;\n left: -13px;\n border-right: none;\n border-left: 1px solid #d9d9d9;\n}\n.ant-tree-rtl .ant-tree-checkbox {\n margin: 4px 0 0 8px;\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox {\n margin: 4px 0 0 8px;\n}\n","@import '../../style/mixins/index';\n\n@tree-prefix-cls: ~'@{ant-prefix}-tree';\n@select-tree-prefix-cls: ~'@{ant-prefix}-select-tree';\n@tree-motion: ~'@{ant-prefix}-motion-collapse';\n@tree-node-padding: (@padding-xs / 2);\n@tree-node-hightlight-color: inherit;\n\n.antTreeSwitcherIcon(@type: 'tree-default-open-icon') {\n .@{tree-prefix-cls}-switcher-icon,\n .@{select-tree-prefix-cls}-switcher-icon {\n display: inline-block;\n font-size: 10px;\n vertical-align: baseline;\n\n svg {\n transition: transform 0.3s;\n }\n }\n}\n\n.drop-indicator() {\n .@{tree-prefix-cls}-drop-indicator {\n position: absolute;\n // it should displayed over the following node\n z-index: 1;\n height: 2px;\n background-color: @primary-color;\n border-radius: 1px;\n pointer-events: none;\n\n &::after {\n position: absolute;\n top: -3px;\n left: -6px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n border: 2px solid @primary-color;\n border-radius: 50%;\n content: '';\n }\n }\n}\n\n.antTreeFn(@custom-tree-prefix-cls) {\n @custom-tree-node-prefix-cls: ~'@{custom-tree-prefix-cls}-treenode';\n .reset-component();\n background: @tree-bg;\n border-radius: @border-radius-base;\n transition: background-color 0.3s;\n\n &-focused:not(:hover):not(&-active-focused) {\n background: @primary-1;\n }\n\n // =================== Virtual List ===================\n &-list-holder-inner {\n align-items: flex-start;\n }\n\n &.@{custom-tree-prefix-cls}-block-node {\n .@{custom-tree-prefix-cls}-list-holder-inner {\n align-items: stretch;\n\n // >>> Title\n .@{custom-tree-prefix-cls}-node-content-wrapper {\n flex: auto;\n }\n\n // >>> Drag\n .@{custom-tree-node-prefix-cls}.dragging {\n position: relative;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: @tree-node-padding;\n left: 0;\n border: 1px solid @primary-color;\n opacity: 0;\n animation: ant-tree-node-fx-do-not-use 0.3s;\n animation-play-state: running;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n }\n }\n }\n }\n\n // ===================== TreeNode =====================\n .@{custom-tree-node-prefix-cls} {\n display: flex;\n align-items: flex-start;\n padding: 0 0 @tree-node-padding 0;\n outline: none;\n // Disabled\n &-disabled {\n // >>> Title\n .@{custom-tree-prefix-cls}-node-content-wrapper {\n color: @disabled-color;\n cursor: not-allowed;\n\n &:hover {\n background: transparent;\n }\n }\n }\n\n &-active .@{custom-tree-prefix-cls}-node-content-wrapper {\n background: @tree-node-hover-bg;\n }\n\n &:not(&-disabled).filter-node .@{custom-tree-prefix-cls}-title {\n color: @tree-node-hightlight-color;\n font-weight: 500;\n }\n\n &-draggable {\n .@{custom-tree-prefix-cls}-draggable-icon {\n width: @tree-title-height;\n line-height: @tree-title-height;\n text-align: center;\n visibility: visible;\n opacity: 0.2;\n transition: opacity @animation-duration-slow;\n\n .@{custom-tree-node-prefix-cls}:hover & {\n opacity: 0.45;\n }\n }\n }\n }\n\n // >>> Indent\n &-indent {\n align-self: stretch;\n white-space: nowrap;\n user-select: none;\n\n &-unit {\n display: inline-block;\n width: @tree-title-height;\n }\n }\n\n // >>> Drag Handler\n &-draggable-icon {\n visibility: hidden;\n }\n\n // >>> Switcher\n &-switcher {\n .antTreeSwitcherIcon();\n position: relative;\n flex: none;\n align-self: stretch;\n width: @tree-title-height;\n margin: 0;\n line-height: @tree-title-height;\n text-align: center;\n cursor: pointer;\n user-select: none;\n\n &-noop {\n cursor: default;\n }\n\n &_close {\n .@{custom-tree-prefix-cls}-switcher-icon {\n svg {\n transform: rotate(-90deg);\n }\n }\n }\n\n &-loading-icon {\n color: @primary-color;\n }\n\n &-leaf-line {\n position: relative;\n z-index: 1;\n display: inline-block;\n width: 100%;\n height: 100%;\n // https://github.com/ant-design/ant-design/issues/31884\n &::before {\n position: absolute;\n top: 0;\n right: 12px;\n bottom: -@tree-node-padding;\n margin-left: -1px;\n border-right: 1px solid @normal-color;\n content: ' ';\n }\n\n &::after {\n position: absolute;\n width: @tree-title-height - 14px;\n height: @tree-title-height - 10px;\n border-bottom: 1px solid @normal-color;\n content: ' ';\n }\n }\n }\n\n // >>> Checkbox\n &-checkbox {\n top: initial;\n margin: ((@tree-title-height - @checkbox-size) / 2) 8px 0 0;\n }\n\n // >>> Title\n & &-node-content-wrapper {\n position: relative;\n z-index: auto;\n min-height: @tree-title-height;\n margin: 0;\n padding: 0 4px;\n color: inherit;\n line-height: @tree-title-height;\n background: transparent;\n border-radius: @border-radius-base;\n cursor: pointer;\n transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n\n &:hover {\n background-color: @tree-node-hover-bg;\n }\n\n &.@{custom-tree-prefix-cls}-node-selected {\n background-color: @tree-node-selected-bg;\n }\n\n // Icon\n .@{custom-tree-prefix-cls}-iconEle {\n display: inline-block;\n width: @tree-title-height;\n height: @tree-title-height;\n line-height: @tree-title-height;\n text-align: center;\n vertical-align: top;\n\n &:empty {\n display: none;\n }\n }\n }\n\n // https://github.com/ant-design/ant-design/issues/28217\n &-unselectable &-node-content-wrapper:hover {\n background-color: transparent;\n }\n\n // ==================== Draggable =====================\n &-node-content-wrapper {\n line-height: @tree-title-height;\n user-select: none;\n\n .drop-indicator();\n }\n\n .@{custom-tree-node-prefix-cls}.drop-container {\n > [draggable] {\n box-shadow: 0 0 0 2px @primary-color;\n }\n }\n\n // ==================== Show Line =====================\n &-show-line {\n // ================ Indent lines ================\n .@{custom-tree-prefix-cls}-indent {\n &-unit {\n position: relative;\n height: 100%;\n\n &::before {\n position: absolute;\n top: 0;\n right: (@tree-title-height / 2);\n bottom: -@tree-node-padding;\n border-right: 1px solid @border-color-base;\n content: '';\n }\n\n &-end {\n &::before {\n display: none;\n }\n }\n }\n }\n\n // ============== Cover Background ==============\n .@{custom-tree-prefix-cls}-switcher {\n background: @component-background;\n\n &-line-icon {\n // https://github.com/ant-design/ant-design/issues/32813\n vertical-align: -0.15em;\n }\n }\n }\n\n .@{custom-tree-node-prefix-cls}-leaf-last {\n .@{custom-tree-prefix-cls}-switcher {\n &-leaf-line {\n &::before {\n top: auto !important;\n bottom: auto !important;\n height: @tree-title-height - 10px !important;\n }\n }\n }\n }\n}\n\n@keyframes ant-tree-node-fx-do-not-use {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../checkbox/style/mixin';\n\n@tree-prefix-cls: ~'@{ant-prefix}-tree';\n@select-tree-prefix-cls: ~'@{ant-prefix}-select-tree';\n@tree-node-prefix-cls: ~'@{tree-prefix-cls}-treenode';\n\n.@{tree-prefix-cls} {\n &-rtl {\n direction: rtl;\n .@{tree-prefix-cls}-node-content-wrapper[draggable='true'] {\n .@{tree-prefix-cls}-drop-indicator {\n &::after {\n right: -6px;\n left: unset;\n }\n }\n }\n }\n\n // ===================== TreeNode =====================\n .@{tree-node-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n }\n\n // >>> Switcher\n &-switcher {\n &_close {\n .@{tree-prefix-cls}-switcher-icon {\n svg {\n .@{tree-prefix-cls}-rtl & {\n transform: rotate(90deg);\n }\n }\n }\n }\n }\n // ==================== Show Line =====================\n &-show-line {\n // ================ Indent lines ================\n .@{tree-prefix-cls}-indent {\n &-unit {\n &::before {\n .@{tree-prefix-cls}-rtl& {\n right: auto;\n left: -(@tree-title-height / 2) - 1px;\n border-right: none;\n border-left: 1px solid @border-color-base;\n }\n }\n }\n }\n }\n // >>> Checkbox\n &-checkbox {\n .@{tree-prefix-cls}-rtl & {\n margin: ((@tree-title-height - @checkbox-size) / 2) 0 0 8px;\n }\n }\n}\n\n.@{select-tree-prefix-cls} {\n // >>> Checkbox\n &-checkbox {\n .@{tree-prefix-cls}-select-dropdown-rtl & {\n margin: ((@tree-title-height - @checkbox-size) / 2) 0 0 8px;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@timeline-prefix-cls: ~'@{ant-prefix}-timeline';\n\n.@{timeline-prefix-cls} {\n .reset-component();\n\n margin: 0;\n padding: 0;\n list-style: none;\n\n &-item {\n position: relative;\n margin: 0;\n padding-bottom: @timeline-item-padding-bottom;\n font-size: @font-size-base;\n list-style: none;\n\n &-tail {\n position: absolute;\n top: 10px;\n left: 4px;\n height: calc(100% - 10px);\n border-left: @timeline-width solid @timeline-color;\n }\n\n &-pending &-head {\n font-size: @font-size-sm;\n background-color: transparent;\n }\n\n &-pending &-tail {\n display: none;\n }\n\n &-head {\n position: absolute;\n width: 10px;\n height: 10px;\n background-color: @timeline-dot-bg;\n border: @timeline-dot-border-width solid transparent;\n border-radius: 100px;\n\n &-blue {\n color: @primary-color;\n border-color: @primary-color;\n }\n\n &-red {\n color: @error-color;\n border-color: @error-color;\n }\n\n &-green {\n color: @success-color;\n border-color: @success-color;\n }\n\n &-gray {\n color: @disabled-color;\n border-color: @disabled-color;\n }\n }\n\n &-head-custom {\n position: absolute;\n top: 5.5px;\n left: 5px;\n width: auto;\n height: auto;\n margin-top: 0;\n padding: 3px 1px;\n line-height: 1;\n text-align: center;\n border: 0;\n border-radius: 0;\n transform: translate(-50%, -50%);\n }\n\n &-content {\n position: relative;\n top: -(@font-size-base * @line-height-base - @font-size-base) + 1px;\n margin: 0 0 0 @margin-lg + 2px;\n word-break: break-word;\n }\n\n &-last {\n > .@{timeline-prefix-cls}-item-tail {\n display: none;\n }\n > .@{timeline-prefix-cls}-item-content {\n min-height: 48px;\n }\n }\n }\n\n &.@{timeline-prefix-cls}-alternate,\n &.@{timeline-prefix-cls}-right,\n &.@{timeline-prefix-cls}-label {\n .@{timeline-prefix-cls}-item {\n &-tail,\n &-head,\n &-head-custom {\n left: 50%;\n }\n\n &-head {\n margin-left: -4px;\n\n &-custom {\n margin-left: 1px;\n }\n }\n\n &-left {\n .@{timeline-prefix-cls}-item-content {\n left: calc(50% - 4px);\n width: calc(50% - 14px);\n text-align: left;\n }\n }\n\n &-right {\n .@{timeline-prefix-cls}-item-content {\n width: calc(50% - 12px);\n margin: 0;\n text-align: right;\n }\n }\n }\n }\n\n &.@{timeline-prefix-cls}-right {\n .@{timeline-prefix-cls}-item-right {\n .@{timeline-prefix-cls}-item-tail,\n .@{timeline-prefix-cls}-item-head,\n .@{timeline-prefix-cls}-item-head-custom {\n left: calc(100% - 4px - @timeline-width);\n }\n .@{timeline-prefix-cls}-item-content {\n width: calc(100% - 18px);\n }\n }\n }\n\n &&-pending &-item-last &-item-tail {\n display: block;\n height: calc(100% - 14px);\n border-left: 2px dotted @timeline-color;\n }\n\n &&-reverse &-item-last &-item-tail {\n display: none;\n }\n\n &&-reverse &-item-pending {\n .@{timeline-prefix-cls}-item-tail {\n top: 15px;\n display: block;\n height: calc(100% - 15px);\n border-left: 2px dotted @timeline-color;\n }\n .@{timeline-prefix-cls}-item-content {\n min-height: 48px;\n }\n }\n &.@{timeline-prefix-cls}-label {\n .@{timeline-prefix-cls}-item-label {\n position: absolute;\n top: -(@font-size-base * @line-height-base - @font-size-base) + 1px;\n width: calc(50% - 12px);\n text-align: right;\n }\n .@{timeline-prefix-cls}-item-right {\n .@{timeline-prefix-cls}-item-label {\n left: calc(50% + 14px);\n width: calc(50% - 14px);\n text-align: left;\n }\n }\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@timeline-prefix-cls: ~'@{ant-prefix}-timeline';\n\n.@{timeline-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-item {\n &-tail {\n .@{timeline-prefix-cls}-rtl & {\n right: 4px;\n left: auto;\n border-right: @timeline-width solid @timeline-color;\n border-left: none;\n }\n }\n\n &-head-custom {\n .@{timeline-prefix-cls}-rtl & {\n right: 5px;\n left: auto;\n transform: translate(50%, -50%);\n }\n }\n\n &-content {\n .@{timeline-prefix-cls}-rtl & {\n margin: 0 18px 0 0;\n }\n }\n }\n\n &.@{timeline-prefix-cls}-alternate,\n &.@{timeline-prefix-cls}-right,\n &.@{timeline-prefix-cls}-label {\n .@{timeline-prefix-cls}-item {\n &-tail,\n &-head,\n &-head-custom {\n .@{timeline-prefix-cls}-rtl& {\n right: 50%;\n left: auto;\n }\n }\n\n &-head {\n .@{timeline-prefix-cls}-rtl& {\n margin-right: -4px;\n margin-left: 0;\n }\n\n &-custom {\n .@{timeline-prefix-cls}-rtl& {\n margin-right: 1px;\n margin-left: 0;\n }\n }\n }\n\n &-left {\n .@{timeline-prefix-cls}-item-content {\n .@{timeline-prefix-cls}-rtl& {\n right: calc(50% - 4px);\n left: auto;\n text-align: right;\n }\n }\n }\n\n &-right {\n .@{timeline-prefix-cls}-item-content {\n .@{timeline-prefix-cls}-rtl& {\n text-align: left;\n }\n }\n }\n }\n }\n\n &.@{timeline-prefix-cls}-right {\n .@{timeline-prefix-cls}-item-right {\n .@{timeline-prefix-cls}-item-tail,\n .@{timeline-prefix-cls}-item-head,\n .@{timeline-prefix-cls}-item-head-custom {\n .@{timeline-prefix-cls}-rtl& {\n right: 0;\n left: auto;\n }\n }\n\n .@{timeline-prefix-cls}-item-content {\n .@{timeline-prefix-cls}-rtl& {\n width: 100%;\n margin-right: 18px;\n text-align: right;\n }\n }\n }\n }\n\n &&-pending &-item-last &-item-tail {\n .@{timeline-prefix-cls}-rtl& {\n border-right: 2px dotted @timeline-color;\n border-left: none;\n }\n }\n\n &&-reverse &-item-pending {\n .@{timeline-prefix-cls}-item-tail {\n .@{timeline-prefix-cls}-rtl& {\n border-right: 2px dotted @timeline-color;\n border-left: none;\n }\n }\n }\n\n &.@{timeline-prefix-cls}-label {\n .@{timeline-prefix-cls}-item-label {\n .@{timeline-prefix-cls}-rtl& {\n text-align: left;\n }\n }\n .@{timeline-prefix-cls}-item-right {\n .@{timeline-prefix-cls}-item-label {\n .@{timeline-prefix-cls}-rtl& {\n right: calc(50% + 14px);\n text-align: right;\n }\n }\n }\n }\n}\n","@import '../../style/themes/index';\n\n@transfer-prefix-cls: ~'@{ant-prefix}-transfer';\n\n@table-prefix-cls: ~'@{ant-prefix}-table';\n@input-prefix-cls: ~'@{ant-prefix}-input';\n\n.@{transfer-prefix-cls}-customize-list {\n .@{transfer-prefix-cls}-list {\n flex: 1 1 50%;\n width: auto;\n height: auto;\n min-height: @transfer-list-height;\n }\n\n // =================== Hook Components ===================\n .@{table-prefix-cls}-wrapper {\n .@{table-prefix-cls}-small {\n border: 0;\n border-radius: 0;\n\n .@{table-prefix-cls}-selection-column {\n width: 40px;\n min-width: 40px;\n }\n\n > .@{table-prefix-cls}-content {\n // Header background color\n > .@{table-prefix-cls}-body > table > .@{table-prefix-cls}-thead > tr > th {\n background: @table-header-bg;\n }\n\n .@{table-prefix-cls}-row:last-child td {\n border-bottom: @border-width-base @border-style-base @border-color-split;\n }\n }\n\n .@{table-prefix-cls}-body {\n margin: 0;\n }\n }\n\n .@{table-prefix-cls}-pagination.@{ant-prefix}-pagination {\n margin: 16px 0 4px;\n }\n }\n .@{input-prefix-cls} {\n &[disabled] {\n background-color: transparent;\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../checkbox/style/mixin';\n@import './customize';\n@import './status';\n\n@transfer-prefix-cls: ~'@{ant-prefix}-transfer';\n\n@transfer-header-vertical-padding: ceil(\n ((@transfer-header-height - 1px - @font-size-base * @line-height-base) / 2)\n);\n\n.@{transfer-prefix-cls} {\n .reset-component();\n\n position: relative;\n display: flex;\n align-items: stretch;\n\n &-disabled {\n .@{transfer-prefix-cls}-list {\n background: @transfer-disabled-bg;\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n width: 180px;\n height: @transfer-list-height;\n border: @border-width-base @border-style-base @border-color-base;\n border-radius: @border-radius-base;\n\n &-with-pagination {\n width: 250px;\n height: auto;\n }\n\n &-search {\n .anticon-search {\n color: @disabled-color;\n }\n }\n\n &-header {\n display: flex;\n flex: none;\n align-items: center;\n height: @transfer-header-height;\n // border-top is on the transfer dom. We should minus 1px for this\n padding: (@transfer-header-vertical-padding - 1px) @control-padding-horizontal\n @transfer-header-vertical-padding;\n color: @text-color;\n background: @component-background;\n border-bottom: @border-width-base @border-style-base @border-color-split;\n border-radius: @border-radius-base @border-radius-base 0 0;\n\n > *:not(:last-child) {\n margin-right: 4px;\n }\n\n > * {\n flex: none;\n }\n\n &-title {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-align: right;\n text-overflow: ellipsis;\n }\n\n &-dropdown {\n font-size: 10px;\n transform: translateY(10%);\n cursor: pointer;\n\n &[disabled] {\n cursor: not-allowed;\n }\n }\n }\n\n &-body {\n display: flex;\n flex: auto;\n flex-direction: column;\n overflow: hidden;\n font-size: @font-size-base;\n\n &-search-wrapper {\n position: relative;\n flex: none;\n padding: @padding-sm;\n }\n }\n\n &-content {\n flex: auto;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n\n &-item {\n display: flex;\n align-items: center;\n min-height: @transfer-item-height;\n padding: @transfer-item-padding-vertical @control-padding-horizontal;\n line-height: @transfer-item-height - 2 * @transfer-item-padding-vertical;\n transition: all 0.3s;\n\n > *:not(:last-child) {\n margin-right: 8px;\n }\n\n > * {\n flex: none;\n }\n\n &-text {\n flex: auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-remove {\n .operation-unit();\n position: relative;\n color: @border-color-base;\n\n &::after {\n position: absolute;\n top: -@transfer-item-padding-vertical;\n right: -50%;\n bottom: -@transfer-item-padding-vertical;\n left: -50%;\n content: '';\n }\n\n &:hover {\n color: @link-hover-color;\n }\n }\n }\n\n &-item:not(&-item-disabled) {\n &:hover {\n background-color: @transfer-item-hover-bg;\n cursor: pointer;\n }\n\n &.@{transfer-prefix-cls}-list-content-item-checked:hover {\n background-color: @transfer-item-selected-hover-bg;\n }\n }\n\n // Do not change hover style when `oneWay` mode\n &-show-remove &-item:not(&-item-disabled):hover {\n background: transparent;\n cursor: default;\n }\n\n &-item-checked {\n background-color: @item-active-bg;\n }\n\n &-item-disabled {\n color: @btn-disable-color;\n cursor: not-allowed;\n }\n }\n\n &-pagination {\n padding: @padding-xs 0;\n text-align: right;\n border-top: @border-width-base @border-style-base @border-color-split;\n }\n\n &-body-not-found {\n flex: none;\n width: 100%;\n margin: auto 0;\n color: @disabled-color;\n text-align: center;\n }\n\n &-footer {\n border-top: @border-width-base @border-style-base @border-color-split;\n }\n }\n\n &-operation {\n display: flex;\n flex: none;\n flex-direction: column;\n align-self: center;\n margin: 0 8px;\n vertical-align: middle;\n\n .@{ant-prefix}-btn {\n display: block;\n\n &:first-child {\n margin-bottom: 4px;\n }\n\n .@{iconfont-css-prefix} {\n font-size: 12px;\n }\n }\n }\n\n .@{ant-prefix}-empty-image {\n max-height: (@transfer-header-height / 2) - 22;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../input/style/mixin';\n\n@transfer-prefix-cls: ~'@{ant-prefix}-transfer';\n\n.transfer-status-color(@color) {\n .@{transfer-prefix-cls}-list {\n border-color: @color;\n\n &-search:not([disabled]) {\n border-color: @input-border-color;\n\n &:hover {\n .hover();\n }\n\n &:focus {\n .active();\n }\n }\n }\n}\n\n.@{transfer-prefix-cls} {\n &-status-error {\n .transfer-status-color(@error-color);\n }\n\n &-status-warning {\n .transfer-status-color(@warning-color);\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../checkbox/style/mixin';\n\n@transfer-prefix-cls: ~'@{ant-prefix}-transfer';\n\n.@{transfer-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &-list {\n &-search {\n .@{transfer-prefix-cls}-rtl & {\n padding-right: @control-padding-horizontal-sm;\n padding-left: 24px;\n }\n\n &-action {\n .@{transfer-prefix-cls}-rtl & {\n right: auto;\n left: 12px;\n }\n }\n }\n\n &-header {\n > *:not(:last-child) {\n .@{transfer-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n\n .@{transfer-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n\n &-title {\n .@{transfer-prefix-cls}-rtl & {\n text-align: left;\n }\n }\n }\n\n &-content {\n &-item {\n > *:not(:last-child) {\n .@{transfer-prefix-cls}-rtl & {\n margin-right: 0;\n margin-left: 8px;\n }\n }\n }\n }\n\n &-pagination {\n .@{transfer-prefix-cls}-rtl & {\n text-align: left;\n }\n }\n\n &-footer {\n .@{transfer-prefix-cls}-rtl & {\n right: 0;\n left: auto;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n@import '../../tree/style/mixin';\n@import '../../checkbox/style/mixin';\n\n@tree-select-prefix-cls: ~'@{ant-prefix}-tree-select';\n@select-tree-prefix-cls: ~'@{ant-prefix}-select-tree';\n\n.antCheckboxFn(@checkbox-prefix-cls: ~'@{select-tree-prefix-cls}-checkbox');\n\n.@{tree-select-prefix-cls} {\n // ======================= Dropdown =======================\n &-dropdown {\n padding: @padding-xs (@padding-xs / 2);\n\n &-rtl {\n direction: rtl;\n }\n // ======================== Tree ========================\n .@{select-tree-prefix-cls} {\n border-radius: 0;\n\n &-list-holder-inner {\n align-items: stretch;\n\n .@{select-tree-prefix-cls}-treenode {\n .@{select-tree-prefix-cls}-node-content-wrapper {\n flex: auto;\n }\n }\n }\n }\n }\n}\n\n.@{select-tree-prefix-cls} {\n .antTreeFn(@select-tree-prefix-cls);\n\n // change switcher icon rotation in rtl direction\n & &-switcher {\n &_close {\n .@{select-tree-prefix-cls}-switcher-icon {\n svg {\n .@{tree-select-prefix-cls}-dropdown-rtl & {\n transform: rotate(90deg);\n }\n }\n }\n }\n\n &-loading-icon {\n .@{tree-select-prefix-cls}-dropdown-rtl & {\n transform: scaleY(-1);\n }\n }\n }\n}\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@typography-prefix-cls: ~'@{ant-prefix}-typography';\n\n// =============== Basic ===============\n.@{typography-prefix-cls} {\n color: @text-color;\n overflow-wrap: break-word;\n\n &&-secondary {\n color: @text-color-secondary;\n }\n\n &&-success {\n color: @success-color;\n }\n\n &&-warning {\n color: @warning-color;\n }\n\n &&-danger {\n color: @error-color;\n\n a&:active,\n a&:focus {\n color: @error-color-active;\n }\n\n a&:hover {\n color: @error-color-hover;\n }\n }\n\n &&-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n user-select: none;\n }\n\n // Tag\n div&,\n p {\n .typography-paragraph();\n }\n\n h1&,\n div&-h1,\n div&-h1 > textarea,\n h1 {\n .typography-title-1();\n }\n\n h2&,\n div&-h2,\n div&-h2 > textarea,\n h2 {\n .typography-title-2();\n }\n\n h3&,\n div&-h3,\n div&-h3 > textarea,\n h3 {\n .typography-title-3();\n }\n\n h4&,\n div&-h4,\n div&-h4 > textarea,\n h4 {\n .typography-title-4();\n }\n\n h5&,\n div&-h5,\n div&-h5 > textarea,\n h5 {\n .typography-title-5();\n }\n\n h1&,\n h2&,\n h3&,\n h4&,\n h5& {\n .@{typography-prefix-cls} + & {\n margin-top: @typography-title-margin-top;\n }\n }\n\n div,\n ul,\n li,\n p,\n h1,\n h2,\n h3,\n h4,\n h5 {\n + h1,\n + h2,\n + h3,\n + h4,\n + h5 {\n margin-top: @typography-title-margin-top;\n }\n }\n\n a&-ellipsis,\n span&-ellipsis {\n display: inline-block;\n max-width: 100%;\n }\n\n a&,\n a {\n .operation-unit();\n text-decoration: @link-decoration;\n\n &:active,\n &:hover {\n text-decoration: @link-hover-decoration;\n }\n\n &[disabled],\n &.@{typography-prefix-cls}-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n\n &:active,\n &:hover {\n color: @disabled-color;\n }\n\n &:active {\n pointer-events: none;\n }\n }\n }\n\n code {\n margin: 0 0.2em;\n padding: 0.2em 0.4em 0.1em;\n font-size: 85%;\n background: rgba(150, 150, 150, 0.1);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-radius: 3px;\n }\n\n kbd {\n margin: 0 0.2em;\n padding: 0.15em 0.4em 0.1em;\n font-size: 90%;\n background: rgba(150, 150, 150, 0.06);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-bottom-width: 2px;\n border-radius: 3px;\n }\n\n mark {\n padding: 0;\n background-color: @gold-3;\n }\n\n u,\n ins {\n text-decoration: underline;\n text-decoration-skip-ink: auto;\n }\n\n s,\n del {\n text-decoration: line-through;\n }\n\n strong {\n font-weight: 600;\n }\n\n // Operation\n &-expand,\n &-edit,\n &-copy {\n .operation-unit();\n\n margin-left: 4px;\n }\n\n &-copy-success {\n &,\n &:hover,\n &:focus {\n color: @success-color;\n }\n }\n\n // Text input area\n &-edit-content {\n position: relative;\n\n div& {\n left: -@input-padding-horizontal - 1px;\n margin-top: -@input-padding-vertical-base - 1px;\n margin-bottom: calc(1em - @input-padding-vertical-base - 1px);\n }\n\n &-confirm {\n position: absolute;\n right: 10px;\n bottom: 8px;\n color: @text-color-secondary;\n // default style\n font-weight: normal;\n font-size: @font-size-base;\n font-style: normal;\n pointer-events: none;\n }\n\n // Fix Editable Textarea flash in Firefox\n textarea {\n // https://stackoverflow.com/a/7695964/3040605\n height: 1em;\n margin: 0 !important;\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -moz-transition: none;\n }\n }\n\n // list\n ul,\n ol {\n margin: 0 0 1em;\n padding: 0;\n\n li {\n margin: 0 0 0 20px;\n padding: 0 0 0 4px;\n }\n }\n\n ul {\n list-style-type: circle;\n\n ul {\n list-style-type: disc;\n }\n }\n\n ol {\n list-style-type: decimal;\n }\n\n // pre & block\n pre,\n blockquote {\n margin: 1em 0;\n }\n\n pre {\n padding: 0.4em 0.6em;\n white-space: pre-wrap;\n word-wrap: break-word;\n background: rgba(150, 150, 150, 0.1);\n border: 1px solid rgba(100, 100, 100, 0.2);\n border-radius: 3px;\n\n // Compatible for marked\n code {\n display: inline;\n margin: 0;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border: 0;\n }\n }\n\n blockquote {\n padding: 0 0 0 0.6em;\n border-left: 4px solid rgba(100, 100, 100, 0.2);\n opacity: 0.85;\n }\n\n // ============ Ellipsis ============\n &-single-line {\n white-space: nowrap;\n }\n\n &-ellipsis-single-line {\n overflow: hidden;\n text-overflow: ellipsis;\n\n // https://blog.csdn.net/iefreer/article/details/50421025\n a&,\n span& {\n vertical-align: bottom;\n }\n }\n\n &-ellipsis-multiple-line {\n /* stylelint-disable-next-line value-no-vendor-prefix */\n display: -webkit-box;\n overflow: hidden;\n -webkit-line-clamp: 3;\n\n /*! autoprefixer: ignore next */\n -webkit-box-orient: vertical;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","// =============== Common ===============\n.typography-paragraph() {\n margin-bottom: 1em;\n}\n\n.typography-title(@fontSize; @fontWeight; @lineHeight; @headingColor; @headingMarginBottom;) {\n margin-bottom: @headingMarginBottom;\n color: @headingColor;\n font-weight: @fontWeight;\n font-size: @fontSize;\n line-height: @lineHeight;\n}\n\n.typography-title-1() {\n .typography-title(\n @heading-1-size,\n @typography-title-font-weight,\n 1.23,\n @heading-color,\n @typography-title-margin-bottom\n );\n}\n.typography-title-2() {\n .typography-title(\n @heading-2-size,\n @typography-title-font-weight,\n 1.35,\n @heading-color,\n @typography-title-margin-bottom\n );\n}\n.typography-title-3() {\n .typography-title(\n @heading-3-size,\n @typography-title-font-weight,\n 1.35,\n @heading-color,\n @typography-title-margin-bottom\n );\n}\n.typography-title-4() {\n .typography-title(\n @heading-4-size,\n @typography-title-font-weight,\n 1.4,\n @heading-color,\n @typography-title-margin-bottom\n );\n}\n.typography-title-5() {\n .typography-title(\n @heading-5-size,\n @typography-title-font-weight,\n 1.5,\n @heading-color,\n @typography-title-margin-bottom\n );\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@typography-prefix-cls: ~'@{ant-prefix}-typography';\n\n.@{typography-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n // Operation\n &-expand,\n &-edit,\n &-copy {\n .@{typography-prefix-cls}-rtl & {\n margin-right: 4px;\n margin-left: 0;\n }\n }\n\n &-expand {\n .@{typography-prefix-cls}-rtl & {\n float: left;\n }\n }\n\n // Text input area\n &-edit-content {\n div& {\n &.@{typography-prefix-cls}-rtl {\n right: -@input-padding-horizontal - 1px;\n left: auto;\n }\n }\n\n &-confirm {\n .@{typography-prefix-cls}-rtl & {\n right: auto;\n left: 10px;\n }\n }\n }\n\n // list\n ul,\n ol {\n li {\n .@{typography-prefix-cls}-rtl& {\n margin: 0 20px 0 0;\n padding: 0 4px 0 0;\n }\n }\n }\n}\n","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@upload-prefix-cls: ~'@{ant-prefix}-upload';\n@upload-item: ~'@{ant-prefix}-upload-list-item';\n@upload-picture-card-size: 104px;\n@upload-picture-card-border-style: @border-style-base;\n\n.@{upload-prefix-cls} {\n .reset-component();\n\n outline: 0;\n\n p {\n margin: 0;\n }\n\n &-btn {\n display: block;\n width: 100%;\n outline: none;\n }\n\n input[type='file'] {\n cursor: pointer;\n }\n\n &&-select {\n display: inline-block;\n }\n\n &&-disabled {\n color: @disabled-color;\n cursor: not-allowed;\n }\n\n &&-select-picture-card {\n width: @upload-picture-card-size;\n height: @upload-picture-card-size;\n margin-right: 8px;\n margin-bottom: 8px;\n text-align: center;\n vertical-align: top;\n background-color: @background-color-light;\n border: @border-width-base dashed @border-color-base;\n border-radius: @border-radius-base;\n cursor: pointer;\n transition: border-color 0.3s;\n\n > .@{upload-prefix-cls} {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n }\n\n &:hover {\n border-color: @primary-color;\n .@{upload-prefix-cls}-disabled& {\n border-color: @border-color-base;\n }\n }\n }\n\n &&-drag {\n position: relative;\n width: 100%;\n height: 100%;\n text-align: center;\n background: @background-color-light;\n border: @border-width-base dashed @border-color-base;\n border-radius: @border-radius-base;\n cursor: pointer;\n transition: border-color 0.3s;\n\n .@{upload-prefix-cls} {\n padding: @padding-md 0;\n }\n\n &.@{upload-prefix-cls}-drag-hover:not(.@{upload-prefix-cls}-disabled) {\n border-color: @primary-7;\n }\n\n &.@{upload-prefix-cls}-disabled {\n cursor: not-allowed;\n }\n\n .@{upload-prefix-cls}-btn {\n display: table;\n height: 100%;\n }\n\n .@{upload-prefix-cls}-drag-container {\n display: table-cell;\n vertical-align: middle;\n }\n\n &:not(.@{upload-prefix-cls}-disabled):hover {\n border-color: @primary-5;\n }\n\n p.@{upload-prefix-cls}-drag-icon {\n .@{iconfont-css-prefix} {\n color: @primary-5;\n font-size: 48px;\n }\n\n margin-bottom: 20px;\n }\n p.@{upload-prefix-cls}-text {\n margin: 0 0 4px;\n color: @heading-color;\n font-size: @font-size-lg;\n }\n p.@{upload-prefix-cls}-hint {\n color: @text-color-secondary;\n font-size: @font-size-base;\n }\n\n .@{iconfont-css-prefix}-plus {\n color: @disabled-color;\n font-size: 30px;\n transition: all 0.3s;\n\n &:hover {\n color: @text-color-secondary;\n }\n }\n &:hover .@{iconfont-css-prefix}-plus {\n color: @text-color-secondary;\n }\n }\n\n &-picture-card-wrapper {\n .clearfix();\n\n display: inline-block;\n width: 100%;\n }\n}\n\n.@{upload-prefix-cls}-list {\n .reset-component();\n .clearfix();\n line-height: @line-height-base;\n\n // ============================ Item ============================\n &-item {\n position: relative;\n height: @line-height-base * @font-size-base;\n margin-top: @margin-xs;\n font-size: @font-size-base;\n\n &-name {\n display: inline-block;\n width: 100%;\n padding-left: @font-size-base + 8px;\n overflow: hidden;\n line-height: @line-height-base;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-card-actions {\n position: absolute;\n right: 0;\n\n &-btn {\n opacity: 0;\n }\n\n &-btn.@{ant-prefix}-btn-sm {\n height: @line-height-base * @font-size-base;\n line-height: 1;\n vertical-align: top;\n }\n\n &.picture {\n top: 22px;\n line-height: 0;\n }\n\n &-btn:focus,\n &.picture &-btn {\n opacity: 1;\n }\n\n .@{iconfont-css-prefix} {\n color: @upload-actions-color;\n transition: all 0.3s;\n }\n\n &:hover .@{iconfont-css-prefix} {\n color: @text-color;\n }\n }\n\n &-info {\n height: 100%;\n transition: background-color 0.3s;\n\n > span {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .@{iconfont-css-prefix}-loading,\n .@{upload-prefix-cls}-text-icon {\n .@{iconfont-css-prefix} {\n position: absolute;\n top: (@font-size-base / 2) - 2px;\n color: @text-color-secondary;\n font-size: @font-size-base;\n }\n }\n }\n\n &:hover &-info {\n background-color: @item-hover-bg;\n }\n\n &:hover &-card-actions-btn {\n opacity: 1;\n }\n\n &-error,\n &-error .@{upload-prefix-cls}-text-icon > .@{iconfont-css-prefix},\n &-error &-name {\n color: @error-color;\n }\n\n &-error &-card-actions {\n .@{iconfont-css-prefix} {\n color: @error-color;\n }\n\n &-btn {\n opacity: 1;\n }\n }\n\n &-progress {\n position: absolute;\n bottom: -12px;\n width: 100%;\n padding-left: @font-size-base + 12px;\n font-size: @font-size-base;\n line-height: 0;\n }\n }\n\n // =================== Picture & Picture Card ===================\n &-picture,\n &-picture-card {\n .@{upload-item} {\n position: relative;\n height: 66px;\n padding: @padding-xs;\n border: @border-width-base @upload-picture-card-border-style @border-color-base;\n border-radius: @border-radius-base;\n\n &:hover {\n background: transparent;\n }\n\n &-error {\n border-color: @error-color;\n }\n }\n\n .@{upload-item}-info {\n padding: 0;\n }\n\n .@{upload-item}:hover .@{upload-item}-info {\n background: transparent;\n }\n\n .@{upload-item}-uploading {\n border-style: dashed;\n }\n\n .@{upload-item}-thumbnail {\n width: 48px;\n height: 48px;\n line-height: 60px;\n text-align: center;\n opacity: 0.8;\n\n .@{iconfont-css-prefix} {\n font-size: 26px;\n }\n }\n\n // Adjust the color of the error icon : https://github.com/ant-design/ant-design/pull/24160\n .@{upload-item}-error .@{upload-item}-thumbnail {\n .@{iconfont-css-prefix} {\n svg path {\n &[fill='#e6f7ff'] {\n fill: @error-color-deprecated-bg;\n }\n\n &[fill='#1890ff'] {\n fill: @error-color;\n }\n }\n }\n }\n\n .@{upload-item}-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n font-size: 26px;\n transform: translate(-50%, -50%);\n\n .@{iconfont-css-prefix} {\n font-size: 26px;\n }\n }\n\n .@{upload-item}-image {\n max-width: 100%;\n }\n\n .@{upload-item}-thumbnail img {\n display: block;\n width: 48px;\n height: 48px;\n overflow: hidden;\n }\n\n .@{upload-item}-name {\n display: inline-block;\n box-sizing: border-box;\n max-width: 100%;\n margin: 0 0 0 8px;\n padding-right: 8px;\n padding-left: 48px;\n overflow: hidden;\n line-height: 44px;\n white-space: nowrap;\n text-overflow: ellipsis;\n transition: all 0.3s;\n }\n\n .@{upload-item}-uploading .@{upload-item}-name {\n margin-bottom: 12px;\n }\n\n .@{upload-item}-progress {\n bottom: 14px;\n width: ~'calc(100% - 24px)';\n margin-top: 0;\n padding-left: 56px;\n }\n }\n\n // ======================== Picture Card ========================\n &-picture-card {\n &-container {\n display: inline-block;\n width: @upload-picture-card-size;\n height: @upload-picture-card-size;\n margin: 0 @margin-xs @margin-xs 0;\n vertical-align: top;\n }\n\n .@{upload-item} {\n height: 100%;\n margin: 0;\n }\n\n .@{upload-item}-info {\n position: relative;\n height: 100%;\n overflow: hidden;\n\n &::before {\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n background-color: fade(@black, 50%);\n opacity: 0;\n transition: all 0.3s;\n content: ' ';\n }\n }\n\n .@{upload-item}:hover .@{upload-item}-info::before {\n opacity: 1;\n }\n\n .@{upload-item}-actions {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 10;\n white-space: nowrap;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: all 0.3s;\n\n .@{iconfont-css-prefix}-eye,\n .@{iconfont-css-prefix}-download,\n .@{iconfont-css-prefix}-delete {\n z-index: 10;\n width: 16px;\n margin: 0 4px;\n color: @text-color-dark;\n font-size: 16px;\n cursor: pointer;\n transition: all 0.3s;\n\n &:hover {\n color: @text-color-inverse;\n }\n }\n }\n\n .@{upload-item}-info:hover + .@{upload-item}-actions,\n .@{upload-item}-actions:hover {\n opacity: 1;\n }\n\n .@{upload-item}-thumbnail,\n .@{upload-item}-thumbnail img {\n position: static;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .@{upload-item}-name {\n display: none;\n margin: 8px 0 0;\n padding: 0;\n line-height: @line-height-base;\n text-align: center;\n }\n\n .@{upload-item}-file + .@{upload-item}-name {\n position: absolute;\n bottom: 10px;\n display: block;\n }\n\n .@{upload-item}-uploading {\n &.@{upload-item} {\n background-color: @background-color-light;\n }\n\n .@{upload-item}-info {\n height: auto;\n\n &::before,\n .@{iconfont-css-prefix}-eye,\n .@{iconfont-css-prefix}-delete {\n display: none;\n }\n }\n }\n\n .@{upload-item}-progress {\n bottom: 32px;\n width: calc(100% - 14px);\n padding-left: 0;\n }\n }\n\n // ======================= Picture & Text =======================\n &-text,\n &-picture {\n &-container {\n transition: opacity @animation-duration-slow, height @animation-duration-slow;\n\n &::before {\n display: table;\n width: 0;\n height: 0;\n content: '';\n }\n\n // Don't know why span here, just stretch it\n .@{upload-prefix-cls}-span {\n display: block;\n flex: auto;\n }\n }\n\n // text & picture no need this additional element.\n // But it used for picture-card, let's keep it.\n .@{upload-prefix-cls}-span {\n display: flex;\n align-items: center;\n\n > * {\n flex: none;\n }\n }\n\n .@{upload-item}-name {\n flex: auto;\n margin: 0;\n padding: 0 @padding-xs;\n }\n\n .@{upload-item}-card-actions {\n position: static;\n }\n }\n\n // ============================ Text ============================\n &-text {\n .@{upload-prefix-cls}-text-icon {\n .@{iconfont-css-prefix} {\n position: static;\n }\n }\n }\n\n // =========================== Motion ===========================\n .@{upload-prefix-cls}-animate-inline-appear,\n .@{upload-prefix-cls}-animate-inline-enter,\n .@{upload-prefix-cls}-animate-inline-leave {\n animation-duration: @animation-duration-slow;\n animation-timing-function: @ease-in-out-circ;\n }\n\n .@{upload-prefix-cls}-animate-inline-appear,\n .@{upload-prefix-cls}-animate-inline-enter {\n animation-name: uploadAnimateInlineIn;\n }\n\n .@{upload-prefix-cls}-animate-inline-leave {\n animation-name: uploadAnimateInlineOut;\n }\n}\n\n@keyframes uploadAnimateInlineIn {\n from {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n\n@keyframes uploadAnimateInlineOut {\n to {\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n opacity: 0;\n }\n}\n\n@import './rtl';\n\n@root-entry-name: default;","@import '../../style/themes/index';\n@import '../../style/mixins/index';\n\n@upload-prefix-cls: ~'@{ant-prefix}-upload';\n@upload-item: ~'@{ant-prefix}-upload-list-item';\n\n.@{upload-prefix-cls} {\n &-rtl {\n direction: rtl;\n }\n\n &&-select-picture-card {\n .@{upload-prefix-cls}-rtl& {\n margin-right: auto;\n margin-left: 8px;\n }\n }\n}\n\n.@{upload-prefix-cls}-list {\n &-rtl {\n direction: rtl;\n }\n\n &-item-list-type-text {\n &:hover {\n .@{upload-prefix-cls}-list-item-name-icon-count-1 {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: 22px;\n padding-left: 14px;\n }\n }\n .@{upload-prefix-cls}-list-item-name-icon-count-2 {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: 22px;\n padding-left: 28px;\n }\n }\n }\n }\n\n &-item {\n &-name {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: @font-size-base + 8px;\n padding-left: 0;\n }\n }\n\n &-name-icon-count-1 {\n .@{upload-prefix-cls}-list-rtl & {\n padding-left: 14px;\n }\n }\n\n &-card-actions {\n .@{upload-prefix-cls}-list-rtl & {\n right: auto;\n left: 0;\n }\n .@{iconfont-css-prefix} {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: 0;\n padding-left: 5px;\n }\n }\n }\n\n &-info {\n .@{upload-prefix-cls}-list-rtl & {\n padding: 0 4px 0 12px;\n }\n }\n\n &-error &-card-actions {\n .@{iconfont-css-prefix} {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: 0;\n padding-left: 5px;\n }\n }\n }\n\n &-progress {\n .@{upload-prefix-cls}-list-rtl & {\n padding-right: @font-size-base + 12px;\n padding-left: 0;\n }\n }\n }\n\n &-picture,\n &-picture-card {\n .@{upload-item}-info {\n padding: 0;\n }\n\n .@{upload-item}-thumbnail {\n .@{upload-prefix-cls}-list-rtl& {\n right: 8px;\n left: auto;\n }\n }\n\n .@{upload-item}-icon {\n .@{upload-prefix-cls}-list-rtl& {\n right: 50%;\n left: auto;\n transform: translate(50%, -50%);\n }\n }\n\n .@{upload-item}-name {\n .@{upload-prefix-cls}-list-rtl& {\n margin: 0 8px 0 0;\n padding-right: 48px;\n padding-left: 8px;\n }\n }\n\n .@{upload-item}-name-icon-count-1 {\n .@{upload-prefix-cls}-list-rtl& {\n padding-right: 48px;\n padding-left: 18px;\n }\n }\n\n .@{upload-item}-name-icon-count-2 {\n .@{upload-prefix-cls}-list-rtl& {\n padding-right: 48px;\n padding-left: 36px;\n }\n }\n\n .@{upload-item}-progress {\n .@{upload-prefix-cls}-list-rtl& {\n padding-right: 0;\n padding-left: 0;\n }\n }\n }\n\n &-picture-card {\n &-container {\n .@{upload-prefix-cls}-list-rtl & {\n margin: 0 0 @margin-xs @margin-xs;\n }\n }\n\n .@{upload-item}-actions {\n .@{upload-prefix-cls}-list-rtl& {\n right: 50%;\n left: auto;\n transform: translate(50%, -50%);\n }\n }\n\n .@{upload-item}-file + .@{upload-item}-name {\n .@{upload-prefix-cls}-list-rtl& {\n margin: 8px 0 0;\n padding: 0;\n }\n }\n }\n}\n",".cy-context-menus-cxt-menu {\n display:none;\n z-index: 1000;\n position:absolute;\n border:1px solid #A0A0A0;\n padding: 0;\n margin: 0;\n width:auto;\n}\n\n.cy-context-menus-cxt-menuitem {\n display:block;\n width: 100%;\n padding: 3px 20px;\n position:relative;\n margin:0;\n background-color:#f8f8f8;\n font-weight:normal;\n font-size: 12px;\n white-space:nowrap;\n border: 0;\n text-align: left;\n}\n\n.cy-context-menus-cxt-menuitem:enabled {\n color: #000000;\n}\n\n.cy-context-menus-ctx-operation:focus {\n outline: none;\n}\n\n.cy-context-menus-cxt-menuitem:hover {\n color: #ffffff;\n text-decoration: none;\n background-color: #0B9BCD;\n background-image: none;\n cursor: pointer;\n}\n\n.cy-context-menus-cxt-menuitem[content]:before {\n content:attr(content);\n}\n\n.cy-context-menus-divider {\n border-bottom:1px solid #A0A0A0;\n}\n\n.cy-context-menus-submenu-indicator {\n position: absolute;\n right: 2px;\n top: 50%;\n transform: translateY(-50%);\n}",".cy-container {\n width: 100%;\n height: 100%;\n position: relative;\n margin: auto;\n background: #fafafa radial-gradient(#dcdcdc 1px, transparent 0);\n background-size: 18px 18px;\n}\n\n.node-core {\n position: relative;\n}\n\n.icon {\n background-color: #FFC18E;\n background-repeat: no-repeat;\n background-position: center;\n border-radius: 50%;\n border: 3px solid #ffffff;\n background-size: 12px 12px;\n position: absolute;\n left: -6px;\n top: -4px;\n display: block;\n width: 24px;\n height: 24px;\n}\n\n.icon:hover {\n background-color: #FFC18E;\n}\n\n.icon-table {\n background-image: url('./db-icon.svg');\n}\n\n.icon-fn {\n background-image: url('./fn-icon.svg');\n}\n\n.name {\n padding-top: 6px;\n text-align: center;\n}\n.indexes {\n font-size: 10px;\n font-style: italic;\n text-align: center;\n color: #2C3333;\n}\n\n.store {\n position: absolute;\n left: 50%;\n transform: translate(-50%);\n bottom: -5px;\n background: #fbdcb9;\n border-radius: 5px;\n padding: 0 10px;\n font-size: 8px;\n}\n\n.transform-type {\n position: absolute;\n left: 50%;\n transform: translate(-50%);\n bottom: -5px;\n background: #beddcd;\n border-radius: 5px;\n padding: 0 10px;\n font-size: 8px;\n}\n\n.custom-menu-item {\n border: none !important;\n height: 32px !important;\n width: 170px !important;\n padding-left: 24px !important;\n color: rgb(0, 0, 0, 0.87) !important;\n background-color: #fafafa !important;\n font-weight: normal !important;\n font-size: 13px !important;\n text-align: left !important;\n box-shadow: none !important;\n}\n\n.custom-menu-item:hover {\n background-color: #c8c8c8 !important;\n}\n\n.custom-context-menu {\n border: none !important;\n padding-top: 8px !important;\n padding-bottom: 8px !important;\n background-color: #fafafa !important;\n box-shadow: 0 0 8px 0 rgb(0, 0, 0, 0.12),\n 0 8px 8px 0 rgb(0, 0, 0, 0.24) !important;\n}\n\n.dragger {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n border-left: 1px dashed #e1e1e1;\n cursor: col-resize;\n width: 5px;\n}\n\n.drag-badge {\n position: absolute;\n top: 50%;\n left: -6px;\n background: #e1e1e1;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 3px solid white;\n}\n\n.spin {\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n transform: scale(1.5);\n}\n\n.pipeline-btn {\n position: absolute;\n z-index: 100;\n left: 8px;\n top: 8px\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/libs/datapipe-app/datapipe_app/frontend/static/js/main.f5600965.js b/libs/datapipe-app/datapipe_app/frontend/static/js/main.f5600965.js deleted file mode 100644 index 86ab61b7b..000000000 --- a/libs/datapipe-app/datapipe_app/frontend/static/js/main.f5600965.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see main.f5600965.js.LICENSE.txt */ -(()=>{var e={1694:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t{self,e.exports=(()=>{var e={621:(e,t,n)=>{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nT});var l="cy-context-menus-divider",s={evtType:"cxttap",menuItems:[],menuItemClasses:["cy-context-menus-cxt-menuitem"],contextMenuClasses:["cy-context-menus-cxt-menu"],submenuIndicator:{src:"assets/submenu-indicator-default.svg",width:12,height:12}};function u(e){return(u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return f(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw a}}}}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:void 0;this.hasSubmenu()||this._createSubmenu(),this.submenu.appendMenuItem(e,t)}},{key:"isClickable",value:function(){return void 0!==this.onClickFunction}},{key:"display",value:function(){this.show=!0,this.style.display="block"}},{key:"isVisible",value:function(){return!0===this.show&&"none"!==this.style.display}},{key:"removeSubmenu",value:function(){this.hasSubmenu()&&(this.submenu.removeAllMenuItems(),this.detachSubmenu())}},{key:"detachSubmenu",value:function(){this.hasSubmenu()&&(this.removeChild(this.submenu),this.removeChild(this.indicator),this.removeEventListener("mouseenter",this.mouseEnterHandler),this.removeEventListener("mouseleave",this.mouseLeaveHandler),this.submenu=void 0,this.indicator=void 0)}},{key:"_onMouseEnter",value:function(e){var t=this.getBoundingClientRect(),r=function(e){e.style.opacity="0",e.style.display="block";var t=e.getBoundingClientRect();return e.style.opacity="1",e.style.display="none",t}(this.submenu),o=t.right+r.width>window.innerWidth,a=t.top+r.height>window.innerHeight;o||a?o&&!a?(this.submenu.style.right=this.clientWidth+"px",this.submenu.style.top="0px",this.submenu.style.left="auto",this.submenu.style.bottom="auto"):o&&a?(this.submenu.style.right=this.clientWidth+"px",this.submenu.style.bottom="0px",this.submenu.style.top="auto",this.submenu.style.left="auto"):(this.submenu.style.left=this.clientWidth+"px",this.submenu.style.bottom="0px",this.submenu.style.right="auto",this.submenu.style.top="auto"):(this.submenu.style.left=this.clientWidth+"px",this.submenu.style.top="0px",this.submenu.style.right="auto",this.submenu.style.bottom="auto"),this.submenu.display();var i=Array.from(this.submenu.children).filter((function(e){if(e instanceof n)return e.isVisible()})),s=i.length;i.forEach((function(e,t){e instanceof n&&(t=(a=n.getBoundingClientRect()).left&&r<=a.right&&o>=a.top&&o<=a.bottom||this.submenu.hide()}},{key:"_createSubmenu",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.indicator=this.scratchpad.submenuIndicatorGen(),this.submenu=new N(this.onMenuItemClick,this.scratchpad),this.appendChild(this.indicator),this.appendChild(this.submenu);var t,r=c(e);try{for(r.s();!(t=r.n()).done;){var o=new n(t.value,this.onMenuItemClick,this.scratchpad);this.submenu.appendMenuItem(o)}}catch(e){r.e(e)}finally{r.f()}this.mouseEnterHandler=this._onMouseEnter.bind(this),this.mouseLeaveHandler=this._onMouseLeave.bind(this),this.addEventListener("mouseenter",this.mouseEnterHandler),this.addEventListener("mouseleave",this.mouseLeaveHandler)}},{key:"_getMenuItemClassStr",value:function(e,t){return t?e+" "+l:e}}],[{key:"define",value:function(){i("ctx-menu-item",n,"button")}}]),n}(x(HTMLButtonElement)),N=function(e){v(n,e);var t=g(n);function n(e,r){var o,a;return d(this,n),b((o=y(a=t.call(this)),C(n.prototype)),"setAttribute",o).call(o,"class",r.cxtMenuClasses),a.style.position="absolute",a.onMenuItemClick=e,a.scratchpad=r,a}return h(n,[{key:"hide",value:function(){this.isVisible()&&(this.hideSubmenus(),this.style.display="none")}},{key:"display",value:function(){this.style.display="block"}},{key:"isVisible",value:function(){return"none"!==this.style.display}},{key:"hideMenuItems",value:function(){var e,t=c(this.children);try{for(t.s();!(e=t.n()).done;){var n=e.value;n instanceof HTMLElement?n.style.display="none":console.warn("".concat(n," is not a HTMLElement"))}}catch(e){t.e(e)}finally{t.f()}}},{key:"hideSubmenus",value:function(){var e,t=c(this.children);try{for(t.s();!(e=t.n()).done;){var n=e.value;n instanceof _&&n.submenu&&n.submenu.hide()}}catch(e){t.e(e)}finally{t.f()}}},{key:"appendMenuItem",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(void 0!==t){if(t.parentNode!==this)throw new Error("The item with id='".concat(t.id,"' is not a child of the context menu"));this.insertBefore(e,t)}else this.appendChild(e);e.isClickable()&&this._performBindings(e)}},{key:"moveBefore",value:function(e,t){if(e.parentNode!==this)throw new Error("The item with id='".concat(e.id,"' is not a child of context menu"));if(t.parentNode!==this)throw new Error("The item with id='".concat(t.id,"' is not a child of context menu"));this.removeChild(e),this.insertBefore(e,t)}},{key:"removeAllMenuItems",value:function(){for(;this.firstChild;){var e=this.lastChild;e instanceof _?this._removeImmediateMenuItem(e):(console.warn("Found non menu item in the context menu: ",e),this.removeChild(e))}}},{key:"_removeImmediateMenuItem",value:function(e){if(!this._detachImmediateMenuItem(e))throw new Error("menu item(id=".concat(e.id,") is not in the context menu"));e.detachSubmenu(),e.unbindOnClickFunctions()}},{key:"_detachImmediateMenuItem",value:function(e){if(e.parentNode===this){if(this.removeChild(e),this.children.length<=0){var t=this.parentNode;t instanceof _&&t.detachSubmenu()}return!0}return!1}},{key:"_performBindings",value:function(e){var t=this._bindOnClick(e.onClickFunction);e.bindOnClickFunction(t),e.bindOnClickFunction(this.onMenuItemClick)}},{key:"_bindOnClick",value:function(e){var t=this;return function(){var n=t.scratchpad.currentCyEvent;e(n)}}}],[{key:"define",value:function(){i("menu-item-list",n,"div")}}]),n}(x(HTMLDivElement)),P=function(e){v(n,e);var t=g(n);function n(e,r){var o;return d(this,n),(o=t.call(this,e,r)).onMenuItemClick=function(t){S(t),o.hide(),e()},o}return h(n,[{key:"removeMenuItem",value:function(e){var t=e.parentElement;t instanceof N&&this.contains(t)&&t._removeImmediateMenuItem(e)}},{key:"appendMenuItem",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;this.ensureDoesntContain(e.id),b(C(n.prototype),"appendMenuItem",this).call(this,e,t)}},{key:"insertMenuItem",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.before,r=t.parent;if(this.ensureDoesntContain(e.id),void 0!==n){if(!this.contains(n))throw new Error("before(id=".concat(n.id,") is not in the context menu"));var o=n.parentNode;if(!(o instanceof N))throw new Error("Parent of before(id=".concat(n.id,") is not a submenu"));o.appendMenuItem(e,n)}else if(void 0!==r){if(!this.contains(r))throw new Error("parent(id=".concat(r.id,") is not a descendant of the context menu"));r.appendSubmenuItem(e)}else this.appendMenuItem(e)}},{key:"moveBefore",value:function(e,t){var n=e.parentElement;if(!this.contains(n))throw new Error("parent(id=".concat(n.id,") is not in the contex menu"));if(!this.contains(t))throw new Error("before(id=".concat(t.id,") is not in the context menu"));n.removeChild(e),this.insertMenuItem(e,{before:t})}},{key:"moveToSubmenu",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=e.parentElement;if(!(r instanceof N))throw new Error("current parent(id=".concat(r.id,") is not a submenu"));if(!this.contains(r))throw new Error("parent of the menu item(id=".concat(r.id,") is not in the context menu"));if(null!==t){if(!this.contains(t))throw new Error("parent(id=".concat(t.id,") is not in the context menu"));r._detachImmediateMenuItem(e),t.appendSubmenuItem(e)}else null!==n&&(e.selector=n.selector,e.coreAsWell=n.coreAsWell),r._detachImmediateMenuItem(e),this.appendMenuItem(e)}},{key:"ensureDoesntContain",value:function(e){var t=document.getElementById(e);if(void 0!==t&&this.contains(t))throw new Error("There is already an element with id=".concat(e," in the context menu"))}}],[{key:"define",value:function(){i("ctx-menu",n,"div")}}]),n}(N);function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:void 0,n=h(e);if(void 0!==t){var r=g(t);f.insertMenuItem(n,{parent:r})}else f.insertMenuItem(n)},p=function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n=0;n0&&(l.top+=d,l.left+=d);var p=r.clientHeight,h=r.clientWidth,v=p/2,g=h/2;s.y>v&&s.x<=g?(f.style.left=s.x+"px",f.style.bottom=p-s.y+"px",f.style.right="auto",f.style.top="auto"):s.y>v&&s.x>g?(f.style.right=h-s.x+"px",f.style.bottom=p-s.y+"px",f.style.left="auto",f.style.top="auto"):s.y<=v&&s.x<=g?(f.style.left=s.x+"px",f.style.top=s.y+"px",f.style.right="auto",f.style.bottom="auto"):(f.style.right=h-s.x+"px",f.style.top=s.y+"px",f.style.left="auto",f.style.bottom="auto")}}(e);var n,r=e.target||e.cyTarget,o=function(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return O(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?O(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw a}}}}(f.children);try{for(o.s();!(n=o.n()).done;){var a=n.value;a instanceof _&&(r===t?a.coreAsWell:r.is(a.selector))&&a.show&&(f.display(),u("anyVisibleChild",!0),a.display())}}catch(e){o.e(e)}finally{o.f()}var s=Array.from(f.children).filter((function(e){if(e instanceof _)return e.isVisible()})),c=s.length;s.forEach((function(e,t){e instanceof _&&(t=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,l=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return l=e.done,e},e:function(e){s=!0,i=e},f:function(){try{l||null==n.return||n.return()}finally{if(s)throw i}}}}(document.getElementsByClassName("cy-context-menus-cxt-menu"));try{for(t.s();!(e=t.n()).done;)e.value.addEventListener("contextmenu",(function(e){return e.preventDefault()}))}catch(e){t.e(e)}finally{t.f()}}()}return function(e){return{isActive:function(){return i("active")},appendMenuItem:function(t){return d(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0),e},appendMenuItems:function(t){return p(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0),e},removeMenuItem:function(t){var n=g(t);return f.removeMenuItem(n),e},setTrailingDivider:function(t,n){var r=g(t);return r.setHasTrailingDivider(n),n?r.classList.add(l):r.classList.remove(l),e},insertBeforeMenuItem:function(t,n){var r=h(t),o=g(n);return f.insertMenuItem(r,{before:o}),e},moveToSubmenu:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=g(t);if(null===n)f.moveToSubmenu(r);else if("string"==typeof n){var o=g(n.toString());f.moveToSubmenu(r,o)}else void 0!==n.coreAsWell||void 0!==n.selector?f.moveToSubmenu(r,null,n):console.warn("options neither has coreAsWell nor selector property but it is an object. Are you sure that this is what you want to do?");return e},moveBeforeOtherMenuItem:function(t,n){var r=g(t),o=g(n);return f.moveBefore(r,o),e},disableMenuItem:function(t){return g(t).disable(),e},enableMenuItem:function(t){return g(t).enable(),e},hideMenuItem:function(t){return g(t).hide(),e},showMenuItem:function(t){return g(t).display(),e},destroy:function(){return v(),e}}}(this)}},579:(e,t,n)=>{var r=n(621).contextMenus,o=function(e){e&&e("core","contextMenus",r)};"undefined"!=typeof cytoscape&&o(cytoscape),e.exports=o}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}return n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n(579)})()},3915:function(e,t,n){var r;r=function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){var r=n(1),o=function(e){e&&e("layout","dagre",r)};"undefined"!==typeof cytoscape&&o(cytoscape),e.exports=o},function(e,t,n){function r(e){return r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}var o=n(2),a=n(3),i=n(4);function l(e){this.options=a({},o,e)}l.prototype.run=function(){var e=this.options,t=e.cy,n=e.eles,o=function(e,t){return"function"===typeof t?t.apply(e,[e]):t},a=e.boundingBox||{x1:0,y1:0,w:t.width(),h:t.height()};void 0===a.x2&&(a.x2=a.x1+a.w),void 0===a.w&&(a.w=a.x2-a.x1),void 0===a.y2&&(a.y2=a.y1+a.h),void 0===a.h&&(a.h=a.y2-a.y1);var l=new i.graphlib.Graph({multigraph:!0,compound:!0}),s={},u=function(e,t){null!=t&&(s[e]=t)};u("nodesep",e.nodeSep),u("edgesep",e.edgeSep),u("ranksep",e.rankSep),u("rankdir",e.rankDir),u("align",e.align),u("ranker",e.ranker),u("acyclicer",e.acyclicer),l.setGraph(s),l.setDefaultEdgeLabel((function(){return{}})),l.setDefaultNodeLabel((function(){return{}}));for(var c=n.nodes(),f=0;f1?t-1:0),r=1;r{var r;!function(){"use strict";var o=function(e,t){if("function"!==typeof t)throw new TypeError("predicate must be a function");for(var n,r=e.length>>>0,o=arguments[1],a=0;a{"use strict";var r=n(8573),o=n(5641),a=n(6181),i=n(4485),l=n(168);function s(e){return e&&"object"===typeof e&&"default"in e?e:{default:e}}var u=s(r),c=s(o),f=s(a),d=s(i),p=s(l);function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function v(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);nt?1:0},X=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n255)return;t.push(Math.floor(a))}var i=r[1]||r[2]||r[3],l=r[1]&&r[2]&&r[3];if(i&&!l)return;var s=n[4];if(void 0!==s){if((s=parseFloat(s))<0||s>1)return;t.push(s)}}return t}(e)||function(e){var t,n,r,o,a,i,l,s;function u(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^hsl[a]?\\(((?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?)))\\s*,\\s*((?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))[%])\\s*,\\s*((?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))[%])(?:\\s*,\\s*((?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))))?\\)$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(o=parseFloat(c[3]))<0||o>100)return;if(o/=100,void 0!==(a=c[4])&&((a=parseFloat(a))<0||a>1))return;if(0===r)i=l=s=Math.round(255*o);else{var f=o<.5?o*(1+r):o+r-o*r,d=2*o-f;i=Math.round(255*u(d,f,n+1/3)),l=Math.round(255*u(d,f,n)),s=Math.round(255*u(d,f,n-1/3))}t=[i,l,s,a]}return t}(e)},G={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q=function(e){for(var t=e.map,n=e.keys,r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:oe,r=n;!(t=e.next()).done;)r=r*ae+t.value|0;return r},se=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oe;return t*ae+e|0},ue=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ie;return(t<<5)+t+e|0},ce=function(e){return 2097152*e[0]+e[1]},fe=function(e,t){return[se(e[0],t[0]),ue(e[1],t[1])]},de=function(e,t){var n={value:0,done:!1},r=0,o=e.length;return le({next:function(){return r=0&&(e[r]!==t||(e.splice(r,1),!n));r--);},Ie=function(e){e.splice(0,e.length)},De=function(e,t,n){return n&&(t=W(n,t)),e[t]},Re=function(e,t,n,r){n&&(t=W(n,t)),e[t]=r},Ae="undefined"!==typeof Map?Map:function(){function e(){v(this,e),this._obj={}}return m(e,[{key:"set",value:function(e,t){return this._obj[e]=t,this}},{key:"delete",value:function(e){return this._obj[e]=void 0,this}},{key:"clear",value:function(){this._obj={}}},{key:"has",value:function(e){return void 0!==this._obj[e]}},{key:"get",value:function(e){return this._obj[e]}}]),e}(),je=function(){function e(t){if(v(this,e),this._obj=Object.create(null),this.size=0,null!=t){var n;n=null!=t.instanceString&&t.instanceString()===this.instanceString()?t.toArray():t;for(var r=0;r2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&L(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var o=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new Le,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==o.position.x&&(o.position.x=0),null==o.position.y&&(o.position.y=0),t.renderedPosition){var a=t.renderedPosition,i=e.pan(),l=e.zoom();o.position={x:(a.x-i.x)/l,y:(a.y-i.y)/l}}var s=[];T(t.classes)?s=t.classes:P(t.classes)&&(s=t.classes.split(/\s+/));for(var u=0,c=s.length;u0;){var E=y.pop(),k=g(E),C=E.id();if(d[C]=k,k!==1/0)for(var S=E.neighborhood().intersect(h),_=0;_0)for(n.unshift(t);f[o];){var a=f[o];n.unshift(a.edge),n.unshift(a.node),o=(r=a.node).id()}return i.spawn(n)}}}},He={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,o=n.length,a=new Array(o),i=n,l=function(e){for(var t=0;t0;){if(s=g.pop(),u=s.id(),m.delete(u),E++,u===d){for(var k=[],C=o,S=d,_=b[S];k.unshift(C),null!=_&&k.unshift(_),null!=(C=y[S]);)_=b[S=C.id()];return{found:!0,distance:p[u],path:this.spawn(k),steps:E}}v[u]=!0;for(var N=s._private.edges,P=0;P_&&(p[S]=_,m[S]=C,y[S]=x),!o){var N=C*u+k;!o&&p[N]>_&&(p[N]=_,m[N]=k,y[N]=x)}}}for(var O=0;O1&&void 0!==arguments[1]?arguments[1]:a,r=y(e),o=[],i=r;;){if(null==i)return t.spawn();var s=m(i),u=s.edge,c=s.pred;if(o.unshift(i[0]),i.same(n)&&o.length>0)break;null!=u&&o.unshift(u),i=c}return l.spawn(o)},hasNegativeWeightCycle:h,negativeWeightCycles:v}}},Ge=Math.sqrt(2),Qe=function(e,t,n){0===n.length&&ke("Karger-Stein must be run on a connected (sub)graph");for(var r=n[e],o=r[1],a=r[2],i=t[o],l=t[a],s=n,u=s.length-1;u>=0;u--){var c=s[u],f=c[1],d=c[2];(t[f]===i&&t[d]===l||t[f]===l&&t[d]===i)&&s.splice(u,1)}for(var p=0;pr;){var o=Math.floor(Math.random()*t.length);t=Qe(o,e,t),n--}return t},Je={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var o=n.length,a=r.length,i=Math.ceil(Math.pow(Math.log(o)/Math.LN2,2)),l=Math.floor(o/Ge);if(!(o<2)){for(var s=[],u=0;u0?1:e<0?-1:0},it=function(e,t){return Math.sqrt(lt(e,t))},lt=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},st=function(e){for(var t=e.length,n=0,r=0;r=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},pt=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},ht=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},vt=function(e){var t,n,r,o,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===a.length)t=n=r=o=a[0];else if(2===a.length)t=r=a[0],o=n=a[1];else if(4===a.length){var i=b(a,4);t=i[0],n=i[1],r=i[2],o=i[3]}return e.x1-=o,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},gt=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},mt=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},yt=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},bt=function(e,t){return yt(e,t.x1,t.y1)&&yt(e,t.x2,t.y2)},xt=function(e,t,n,r,o,a,i){var l,s=zt(o,a),u=o/2,c=a/2,f=r-c-i;if((l=It(e,t,n,r,n-u+s-i,f,n+u-s+i,f,!1)).length>0)return l;var d=n+u+i;if((l=It(e,t,n,r,d,r-c+s-i,d,r+c-s+i,!1)).length>0)return l;var p=r+c+i;if((l=It(e,t,n,r,n-u+s-i,p,n+u-s+i,p,!1)).length>0)return l;var h,v=n-u-i;if((l=It(e,t,n,r,v,r-c+s-i,v,r+c-s+i,!1)).length>0)return l;var g=n-u+s,m=r-c+s;if((h=Tt(e,t,n,r,g,m,s+i)).length>0&&h[0]<=g&&h[1]<=m)return[h[0],h[1]];var y=n+u-s,b=r-c+s;if((h=Tt(e,t,n,r,y,b,s+i)).length>0&&h[0]>=y&&h[1]<=b)return[h[0],h[1]];var x=n+u-s,w=r+c-s;if((h=Tt(e,t,n,r,x,w,s+i)).length>0&&h[0]>=x&&h[1]>=w)return[h[0],h[1]];var E=n-u+s,k=r+c-s;return(h=Tt(e,t,n,r,E,k,s+i)).length>0&&h[0]<=E&&h[1]>=k?[h[0],h[1]]:[]},wt=function(e,t,n,r,o,a,i){var l=i,s=Math.min(n,o),u=Math.max(n,o),c=Math.min(r,a),f=Math.max(r,a);return s-l<=e&&e<=u+l&&c-l<=t&&t<=f+l},Et=function(e,t,n,r,o,a,i,l,s){var u=Math.min(n,i,o)-s,c=Math.max(n,i,o)+s,f=Math.min(r,l,a)-s,d=Math.max(r,l,a)+s;return!(ec||td)},kt=function(e,t,n,r,o,a,i,l){var s=[];!function(e,t,n,r,o){var a,i,l,s,u,c,f,d;0===e&&(e=1e-5),l=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),a=(i=(3*n-t*t)/9)*i*i+(l/=54)*l,o[1]=0,f=t/3,a>0?(u=(u=l+Math.sqrt(a))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=l-Math.sqrt(a))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),o[0]=-f+u+c,f+=(u+c)/2,o[4]=o[2]=-f,f=Math.sqrt(3)*(-c+u)/2,o[3]=f,o[5]=-f):(o[5]=o[3]=0,0===a?(d=l<0?-Math.pow(-l,1/3):Math.pow(l,1/3),o[0]=2*d-f,o[4]=o[2]=-(d+f)):(s=(i=-i)*i*i,s=Math.acos(l/Math.sqrt(s)),d=2*Math.sqrt(i),o[0]=-f+d*Math.cos(s/3),o[2]=-f+d*Math.cos((s+2*Math.PI)/3),o[4]=-f+d*Math.cos((s+4*Math.PI)/3)))}(1*n*n-4*n*o+2*n*i+4*o*o-4*o*i+i*i+r*r-4*r*a+2*r*l+4*a*a-4*a*l+l*l,9*n*o-3*n*n-3*n*i-6*o*o+3*o*i+9*r*a-3*r*r-3*r*l-6*a*a+3*a*l,3*n*n-6*n*o+n*i-n*e+2*o*o+2*o*e-i*e+3*r*r-6*r*a+r*l-r*t+2*a*a+2*a*t-l*t,1*n*o-n*n+n*e-o*e+r*a-r*r+r*t-a*t,s);for(var u=[],c=0;c<6;c+=2)Math.abs(s[c+1])<1e-7&&s[c]>=0&&s[c]<=1&&u.push(s[c]);u.push(1),u.push(0);for(var f,d,p,h=-1,v=0;v=0?ps?(e-o)*(e-o)+(t-a)*(t-a):u-f},St=function(e,t,n){for(var r,o,a,i,l=0,s=0;s=e&&e>=a||r<=e&&e<=a))continue;(e-r)/(a-r)*(i-o)+o>t&&l++}return l%2!==0},_t=function(e,t,n,r,o,a,i,l,s){var u,c=new Array(n.length);null!=l[0]?(u=Math.atan(l[1]/l[0]),l[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=l;for(var f,d=Math.cos(-u),p=Math.sin(-u),h=0;h0){var v=Pt(c,-s);f=Nt(v)}else f=c;return St(e,t,f)},Nt=function(e){for(var t,n,r,o,a,i,l,s,u=new Array(e.length/2),c=0;c=0&&h<=1&&g.push(h),v>=0&&v<=1&&g.push(v),0===g.length)return[];var m=g[0]*l[0]+e,y=g[0]*l[1]+t;return g.length>1?g[0]==g[1]?[m,y]:[m,y,g[1]*l[0]+e,g[1]*l[1]+t]:[m,y]},Mt=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},It=function(e,t,n,r,o,a,i,l,s){var u=e-o,c=n-e,f=i-o,d=t-a,p=r-t,h=l-a,v=f*d-h*u,g=c*d-p*u,m=h*c-f*p;if(0!==m){var y=v/m,b=g/m,x=-.001;return x<=y&&y<=1.001&&x<=b&&b<=1.001||s?[e+y*c,t+y*p]:[]}return 0===v||0===g?Mt(e,n,i)===i?[i,l]:Mt(e,n,o)===o?[o,a]:Mt(o,i,n)===n?[n,r]:[]:[]},Dt=function(e,t,n,r,o,a,i,l){var s,u,c,f,d,p,h=[],v=new Array(n.length),g=!0;if(null==a&&(g=!1),g){for(var m=0;m0){var y=Pt(v,-l);u=Nt(y)}else u=v}else u=n;for(var b=0;bu&&(u=t)},d=function(e){return s[e]},p=0;p0?x.edgesTo(b)[0]:b.edgesTo(x)[0];var E=r(w);b=b.id(),p[b]>p[m]+E&&(p[b]=p[m]+E,h.nodes.indexOf(b)<0?h.push(b):h.updateItem(b),u[b]=0,s[b]=[]),p[b]==p[m]+E&&(u[b]=u[b]+u[m],s[b].push(m))}else for(var k=0;k0;){for(var N=n.pop(),P=0;P0&&i.push(n[l]);0!==i.length&&o.push(r.collection(i))}return o}(c,s,t,r);return b=function(e){for(var t=0;t5&&void 0!==arguments[5]?arguments[5]:an,i=r,l=0;l=2?dn(e,t,n,0,un,cn):dn(e,t,n,0,sn)},squaredEuclidean:function(e,t,n){return dn(e,t,n,0,un)},manhattan:function(e,t,n){return dn(e,t,n,0,sn)},max:function(e,t,n){return dn(e,t,n,-1/0,fn)}};function hn(e,t,n,r,o,a){var i;return i=O(e)?e:pn[e]||pn.euclidean,0===t&&O(e)?i(o,a):i(t,n,r,o,a)}pn["squared-euclidean"]=pn.squaredEuclidean,pn.squaredeuclidean=pn.squaredEuclidean;var vn=Te({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),gn=function(e){return vn(e)},mn=function(e,t,n,r,o){var a="kMedoids"!==o?function(e){return n[e]}:function(e){return r[e](n)},i=n,l=t;return hn(e,r.length,a,(function(e){return r[e](t)}),i,l)},yn=function(e,t,n){for(var r=n.length,o=new Array(r),a=new Array(r),i=new Array(t),l=null,s=0;sn)return!1}return!0},En=function(e,t,n){for(var r=0;ro&&(o=t[s][u],a=u);i[a].push(e[s])}for(var c=0;c=o.threshold||"dendrogram"===o.mode&&1===e.length)return!1;var p,h=t[i],v=t[r[i]];p="dendrogram"===o.mode?{left:h,right:v,key:h.key}:{value:h.value.concat(v.value),key:h.key},e[h.index]=p,e.splice(v.index,1),t[h.key]=p;for(var g=0;gn[v.key][m.key]&&(a=n[v.key][m.key])):"max"===o.linkage?(a=n[h.key][m.key],n[h.key][m.key]1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n0&&e.splice(0,t)):e=e.slice(t,n);for(var a=0,i=e.length-1;i>=0;i--){var l=e[i];o?isFinite(l)||(e[i]=-1/0,a++):e.splice(i,1)}r&&e.sort((function(e,t){return e-t}));var s=e.length,u=Math.floor(s/2);return s%2!==0?e[u+1+a]:(e[u-1+a]+e[u+a])/2}(e):"mean"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,o=0,a=t;a1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,o=t;o1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,o=t;oi&&(a=s,i=t[o*e+s])}a>0&&r.push(a)}for(var u=0;u=_?(N=_,_=O,P=T):O>N&&(N=O);for(var M=0;M0?1:0;k[E%u.minIterations*t+z]=F,L+=F}if(L>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var B=0,V=0;V0&&r.push(o);return r}(t,a,i),W=function(e,t,n){for(var r=Bn(e,t,n),o=0;os&&(l=u,s=c)}n[o]=a[l]}return Bn(e,t,n)}(t,r,H),q={},U=0;U1)}}));var s=Object.keys(t).filter((function(e){return t[e].cutVertex})).map((function(t){return e.getElementById(t)}));return{cut:e.spawn(s),components:o}},qn=function(){var e=this,t={},n=0,r=[],o=[],a=e.spawn(e),i=function i(l){if(o.push(l),t[l]={index:n,low:n++,explored:!1},e.getElementById(l).connectedEdges().intersection(e).forEach((function(e){var n=e.target().id();n!==l&&(n in t||i(n),t[n].explored||(t[l].low=Math.min(t[l].low,t[n].low)))})),t[l].index===t[l].low){for(var s=e.spawn();;){var u=o.pop();if(s.merge(e.getElementById(u)),t[u].low=t[l].index,t[u].explored=!0,u===l)break}var c=s.edgesWith(s),f=s.merge(c);r.push(f),a=a.difference(f)}};return e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||i(n)}})),{cut:a,components:r}},Un={};[Be,Ke,He,qe,Ye,$e,Je,Kt,Wt,Ut,Xt,on,Pn,jn,Kn,{hierholzer:function(e){if(!M(e)){var t=arguments;e={root:t[0],directed:t[1]}}var n,r,o,a=Hn(e),i=a.root,l=a.directed,s=this,u=!1;i&&(o=P(i)?this.filter(i)[0].id():i[0].id());var c={},f={};l?s.forEach((function(e){var t=e.id();if(e.isNode()){var o=e.indegree(!0),a=e.outdegree(!0),i=o-a,l=a-o;1==i?n?u=!0:n=t:1==l?r?u=!0:r=t:(l>1||i>1)&&(u=!0),c[t]=[],e.outgoers().forEach((function(e){e.isEdge()&&c[t].push(e.id())}))}else f[t]=[void 0,e.target().id()]})):s.forEach((function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach((function(e){return c[t].push(e.id())}))):f[t]=[e.source().id(),e.target().id()]}));var d={found:!1,trail:void 0};if(u)return d;if(r&&n)if(l){if(o&&r!=o)return d;o=r}else{if(o&&r!=o&&n!=o)return d;o||(o=r)}else o||(o=s[0].id());var p=function(e){for(var t,n,r,o=e,a=[e];c[o].length;)t=c[o].shift(),n=f[t][0],o!=(r=f[t][1])?(c[r]=c[r].filter((function(e){return e!=t})),o=r):l||o==n||(c[n]=c[n].filter((function(e){return e!=t})),o=n),a.unshift(t),a.unshift(o);return a},h=[],v=[];for(v=p(o);1!=v.length;)0==c[v[0]].length?(h.unshift(s.getElementById(v.shift())),h.unshift(s.getElementById(v.shift()))):v=p(v.shift()).concat(v);for(var g in h.unshift(s.getElementById(v.shift())),c)if(c[g].length)return d;return d.found=!0,d.trail=this.spawn(h,!0),d}},{hopcroftTarjanBiconnected:Wn,htbc:Wn,htb:Wn,hopcroftTarjanBiconnectedComponents:Wn},{tarjanStronglyConnected:qn,tsc:qn,tscc:qn,tarjanStronglyConnectedComponents:qn}].forEach((function(e){X(Un,e)}));var Yn=function e(t){if(!(this instanceof e))return new e(t);this.id="Thenable/1.0.7",this.state=0,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"===typeof t&&t.call(this,this.fulfill.bind(this),this.reject.bind(this))};Yn.prototype={fulfill:function(e){return Xn(this,1,"fulfillValue",e)},reject:function(e){return Xn(this,2,"rejectReason",e)},then:function(e,t){var n=this,r=new Yn;return n.onFulfilled.push(Qn(e,r,"fulfill")),n.onRejected.push(Qn(t,r,"reject")),$n(n),r.proxy}};var Xn=function(e,t,n,r){return 0===e.state&&(e.state=t,e[n]=r,$n(e)),e},$n=function(e){1===e.state?Gn(e,"onFulfilled",e.fulfillValue):2===e.state&&Gn(e,"onRejected",e.rejectReason)},Gn=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var o=function(){for(var e=0;e0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){T(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,o=[],a=0,i=n.length;a0&&this.spawn(o).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout((function(){n.removeClass(e)}),t),n}};lr.className=lr.classNames=lr.classes;var sr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:U,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};sr.variable="(?:[\\w-.]|(?:\\\\"+sr.metaChar+"))+",sr.className="(?:[\\w-]|(?:\\\\"+sr.metaChar+"))+",sr.value=sr.string+"|"+sr.number,sr.id=sr.variable,function(){var e,t,n;for(e=sr.comparatorOp.split("|"),n=0;n=0||"="!==t&&(sr.comparatorOp+="|\\!"+t)}();var ur=0,cr=1,fr=2,dr=3,pr=4,hr=5,vr=6,gr=7,mr=8,yr=9,br=10,xr=11,wr=12,Er=13,kr=14,Cr=15,Sr=16,_r=17,Nr=18,Pr=19,Or=20,Tr=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort((function(e,t){return function(e,t){return-1*Y(e,t)}(e.selector,t.selector)})),Mr=function(){for(var e,t={},n=0;n0&&u.edgeCount>0)return Se("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return Se("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&Se("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return P(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,a){var i=r.type,l=r.value;switch(i){case ur:var s=e(l);return s.substring(0,s.length-1);case dr:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(l)+"]";case hr:var f=r.operator,d=r.field;return"["+e(f)+d+"]";case pr:return"["+r.field+"]";case vr:var p=r.operator;return"[["+r.field+n(e(p))+t(l)+"]]";case gr:return l;case mr:return"#"+l;case yr:return"."+l;case _r:case Cr:return o(r.parent,a)+n(">")+o(r.child,a);case Nr:case Sr:return o(r.ancestor,a)+" "+o(r.descendant,a);case Pr:var h=o(r.left,a),v=o(r.subject,a),g=o(r.right,a);return h+(h.length>0?" ":"")+v+g;case Or:return""}},o=function(e,t){return e.checks.reduce((function(n,o,a){return n+(t===e&&0===a?"$":"")+r(o,t)}),"")},a="",i=0;i1&&i=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(i||s||u)&&(o=i||l?""+e:"",a=""+n),u&&(e=o=o.toLowerCase(),n=a=a.toLowerCase()),t){case"*=":r=o.indexOf(a)>=0;break;case"$=":r=o.indexOf(a,o.length-a.length)>=0;break;case"^=":r=0===o.indexOf(a);break;case"=":r=e===n;break;case">":f=!0,r=e>n;break;case">=":f=!0,r=e>=n;break;case"<":f=!0,r=e0;){var u=o.shift();t(u),a.add(u.id()),i&&r(o,a,u)}return e}function Qr(e,t,n){if(n.isParent())for(var r=n._private.children,o=0;o1&&void 0!==arguments[1])||arguments[1];return Gr(this,e,t,Qr)},$r.forEachUp=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Gr(this,e,t,Zr)},$r.forEachUpAndDown=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Gr(this,e,t,Jr)},$r.ancestors=$r.parents,(Ur=Yr={data:ar.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:ar.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:ar.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:ar.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:ar.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:ar.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=Ur.data,Ur.removeAttr=Ur.removeData;var eo,to,no=Yr,ro={};function oo(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,o=n[0],a=o._private.edges,i=0;it})),minIndegree:ao("indegree",(function(e,t){return et})),minOutdegree:ao("outdegree",(function(e,t){return et}))}),X(ro,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0,c=u;u&&(s=s[0]);var f=c?s.position():{x:0,y:0};return o={x:l.x-f.x,y:l.y-f.y},void 0===e?o:o[e]}for(var d=0;d0,g=v;v&&(h=h[0]);var m=g?h.position():{x:0,y:0};void 0!==t?p.position(e,t+m[e]):void 0!==o&&p.position({x:o.x+m.x,y:o.y+m.y})}}else if(!a)return;return this}},eo.modelPosition=eo.point=eo.position,eo.modelPositions=eo.points=eo.positions,eo.renderedPoint=eo.renderedPosition,eo.relativePoint=eo.relativePosition;var so,uo,co=to;so=uo={},uo.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),o=n.pan(),a=t.x1*r+o.x,i=t.x2*r+o.x,l=t.y1*r+o.y,s=t.y2*r+o.y;return{x1:a,x2:i,y1:l,y2:s,w:i-a,h:s-l}},uo.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp((function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}})),this):this},uo.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,o={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},a=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),i=t.position;0!==a.w&&0!==a.h||((a={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=i.x-a.w/2,a.x2=i.x+a.w/2,a.y1=i.y-a.h/2,a.y2=i.y+a.h/2);var l=o.width.left.value;"px"===o.width.left.units&&o.width.val>0&&(l=100*l/o.width.val);var s=o.width.right.value;"px"===o.width.right.units&&o.width.val>0&&(s=100*s/o.width.val);var u=o.height.top.value;"px"===o.height.top.units&&o.height.val>0&&(u=100*u/o.height.val);var c=o.height.bottom.value;"px"===o.height.bottom.units&&o.height.val>0&&(c=100*c/o.height.val);var f=m(o.width.val-a.w,l,s),d=f.biasDiff,p=f.biasComplementDiff,h=m(o.height.val-a.h,u,c),v=h.biasDiff,g=h.biasComplementDiff;t.autoPadding=function(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}(a.w,a.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(a.w,o.width.val),i.x=(-d+a.x1+a.x2+p)/2,t.autoHeight=Math.max(a.h,o.height.val),i.y=(-v+a.y1+a.y2+g)/2}function m(e,t,n){var r=0,o=0,a=t+n;return e>0&&a>0&&(r=t/a*e,o=n/a*e),{biasDiff:r,biasComplementDiff:o}}}for(var r=0;re.x2?r:e.x2,e.y1=ne.y2?o:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},ho=function(e,t){return null==t?e:po(e,t.x1,t.y1,t.x2,t.y2)},vo=function(e,t,n){return De(e,t,n)},go=function(e,t,n){if(!t.cy().headless()){var r,o,a=t._private,i=a.rstyle,l=i.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=i.srcX,o=i.srcY):"target"===n?(r=i.tgtX,o=i.tgtY):(r=i.midX,o=i.midY);var s=a.arrowBounds=a.arrowBounds||{},u=s[n]=s[n]||{};u.x1=r-l,u.y1=o-l,u.x2=r+l,u.y2=o+l,u.w=u.x2-u.x1,u.h=u.y2-u.y1,ht(u,1),po(e,u.x1,u.y1,u.x2,u.y2)}}},mo=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var o=t._private,a=o.rstyle;if(t.pstyle(r+"label").strValue){var i,l,s,u,c=t.pstyle("text-halign"),f=t.pstyle("text-valign"),d=vo(a,"labelWidth",n),p=vo(a,"labelHeight",n),h=vo(a,"labelX",n),v=vo(a,"labelY",n),g=t.pstyle(r+"text-margin-x").pfValue,m=t.pstyle(r+"text-margin-y").pfValue,y=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,k=p,C=d,S=C/2,_=k/2;if(y)i=h-S,l=h+S,s=v-_,u=v+_;else{switch(c.value){case"left":i=h-C,l=h;break;case"center":i=h-S,l=h+S;break;case"right":i=h,l=h+C}switch(f.value){case"top":s=v-k,u=v;break;case"center":s=v-_,u=v+_;break;case"bottom":s=v,u=v+k}}i+=g-Math.max(x,w)-E-2,l+=g+Math.max(x,w)+E+2,s+=m-Math.max(x,w)-E-2,u+=m+Math.max(x,w)+E+2;var N=n||"main",P=o.labelBounds,O=P[N]=P[N]||{};O.x1=i,O.y1=s,O.x2=l,O.y2=u,O.w=l-i,O.h=u-s;var T=y&&"autorotate"===b.strValue,M=null!=b.pfValue&&0!==b.pfValue;if(T||M){var I=T?vo(o.rstyle,"labelAngle",n):b.pfValue,D=Math.cos(I),R=Math.sin(I),A=(i+l)/2,j=(s+u)/2;if(!y){switch(c.value){case"left":A=l;break;case"right":A=i}switch(f.value){case"top":j=u;break;case"bottom":j=s}}var L=function(e,t){return{x:(e-=A)*D-(t-=j)*R+A,y:e*R+t*D+j}},z=L(i,s),F=L(i,u),B=L(l,s),V=L(l,u);i=Math.min(z.x,F.x,B.x,V.x),l=Math.max(z.x,F.x,B.x,V.x),s=Math.min(z.y,F.y,B.y,V.y),u=Math.max(z.y,F.y,B.y,V.y)}var K=N+"Rot",H=P[K]=P[K]||{};H.x1=i,H.y1=s,H.x2=l,H.y2=u,H.w=l-i,H.h=u-s,po(e,i,s,l,u),po(o.labelBounds.all,i,s,l,u)}return e}},yo=function(e){var t=0,n=function(e){return(e?1:0)<(r=P[1].x)){var O=n;n=r,r=O}if(o>(a=P[1].y)){var T=o;o=a,a=T}po(d,n-k,o-k,r+k,a+k)}}else if("bezier"===N||"unbundled-bezier"===N||"segments"===N||"taxi"===N){var M;switch(N){case"bezier":case"unbundled-bezier":M=g.bezierPts;break;case"segments":case"taxi":M=g.linePts}if(null!=M)for(var I=0;I(r=A.x)){var j=n;n=r,r=j}if((o=R.y)>(a=A.y)){var L=o;o=a,a=L}po(d,n-=k,o-=k,r+=k,a+=k)}if(c&&t.includeEdges&&v&&(go(d,e,"mid-source"),go(d,e,"mid-target"),go(d,e,"source"),go(d,e,"target")),c&&"yes"===e.pstyle("ghost").value){var z=e.pstyle("ghost-offset-x").pfValue,F=e.pstyle("ghost-offset-y").pfValue;po(d,d.x1+z,d.y1+F,d.x2+z,d.y2+F)}var B=p.bodyBounds=p.bodyBounds||{};gt(B,d),vt(B,m),ht(B,1),c&&(n=d.x1,r=d.x2,o=d.y1,a=d.y2,po(d,n-E,o-E,r+E,a+E));var V=p.overlayBounds=p.overlayBounds||{};gt(V,d),vt(V,m),ht(V,1);var K=p.labelBounds=p.labelBounds||{};null!=K.all?((s=K.all).x1=1/0,s.y1=1/0,s.x2=-1/0,s.y2=-1/0,s.w=0,s.h=0):K.all=dt(),c&&t.includeLabels&&(t.includeMainLabels&&mo(d,e,null),v&&(t.includeSourceLabels&&mo(d,e,"source"),t.includeTargetLabels&&mo(d,e,"target")))}return d.x1=fo(d.x1),d.y1=fo(d.y1),d.x2=fo(d.x2),d.y2=fo(d.y2),d.w=fo(d.x2-d.x1),d.h=fo(d.y2-d.y1),d.w>0&&d.h>0&&b&&(vt(d,m),ht(d,1)),d}(e,wo),r.bbCache=n,r.bbCachePosKey=i):n=r.bbCache,!a){var c=e.isNode();n=dt(),(t.includeNodes&&c||t.includeEdges&&!c)&&(t.includeOverlays?ho(n,r.overlayBounds):ho(n,r.bodyBounds)),t.includeLabels&&(t.includeMainLabels&&(!o||t.includeSourceLabels&&t.includeTargetLabels)?ho(n,r.labelBounds.all):(t.includeMainLabels&&ho(n,r.labelBounds.mainRot),t.includeSourceLabels&&ho(n,r.labelBounds.sourceRot),t.includeTargetLabels&&ho(n,r.labelBounds.targetRot))),n.w=n.x2-n.x1,n.h=n.y2-n.y1}return n},wo={includeNodes:!0,includeEdges:!0,includeLabels:!0,includeMainLabels:!0,includeSourceLabels:!0,includeTargetLabels:!0,includeOverlays:!0,includeUnderlays:!0,useCache:!0},Eo=yo(wo),ko=Te(wo);uo.boundingBox=function(e){var t;if(1!==this.length||null==this[0]._private.bbCache||this[0]._private.styleDirty||void 0!==e&&void 0!==e.useCache&&!0!==e.useCache){t=dt();var n=ko(e=e||wo),r=this;if(r.cy().styleEnabled())for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:zo,t=arguments.length>1?arguments[1]:void 0,n=0;n=0;l--)i(l);return this},Bo.removeAllListeners=function(){return this.removeListener("*")},Bo.emit=Bo.trigger=function(e,t,n){var r=this.listeners,o=r.length;return this.emitting++,T(t)||(t=[t]),Ho(this,(function(e,a){null!=n&&(r=[{event:a.event,type:a.type,namespace:a.namespace,callback:n}],o=r.length);for(var i=function(n){var o=r[n];if(o.type===a.type&&(!o.namespace||o.namespace===a.namespace||".*"===o.namespace)&&e.eventMatches(e.context,o,a)){var i=[a];null!=t&&function(e,t){for(var n=0;n1&&!r){var o=this.length-1,a=this[o],i=a._private.data.id;this[o]=void 0,this[e]=a,n.set(i,{ele:a,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var o=r.index;return this.unmergeAt(o),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&P(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r=0;t--){e(this[t])&&this.unmergeAt(t)}return this},map:function(e,t){for(var n=[],r=this,o=0;or&&(r=l,n=i)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,o=this,a=0;a=0&&o1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){this.cleanStyle();var o=n._private.style[e];return null!=o?o:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=n.style();if(M(e)){var o=e;r.applyBypass(this,o,false),this.emitAndNotify("style")}else if(P(e)){if(void 0===t){var a=this[0];return a?r.getStylePropertyValue(a,e):void 0}r.applyBypass(this,e,t,false),this.emitAndNotify("style")}else if(void 0===e){var i=this[0];return i?r.getRawStyle(i):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=t.style(),r=this;if(void 0===e)for(var o=0;o0&&t.push(c[0]),t.push(l[0])}return this.spawn(t,!0).filter(e)}),"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),pa.neighbourhood=pa.neighborhood,pa.closedNeighbourhood=pa.closedNeighborhood,pa.openNeighbourhood=pa.openNeighborhood,X(pa,{source:Xr((function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t}),"source"),target:Xr((function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t}),"target"),sources:ma({attr:"source"}),targets:ma({attr:"target"})}),X(pa,{edgesWith:Xr(ya(),"edgesWith"),edgesTo:Xr(ya({thisIsSrc:!0}),"edgesTo")}),X(pa,{connectedEdges:Xr((function(e){for(var t=[],n=0;n0);return a},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),pa.componentsOf=pa.components;var xa=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(void 0!==e){var r=new Ae,o=!1;if(t){if(t.length>0&&M(t[0])&&!A(t[0])){o=!0;for(var a=[],i=new Le,l=0,s=t.length;l0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=this,a=o.cy(),i=a._private,l=[],s=[],u=0,c=o.length;u0){for(var L=e.length===o.length?o:new xa(a,e),z=0;z0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],o={},a=n._private.cy;function i(e){for(var t=e._private.edges,n=0;n0&&(e?N.emitAndNotify("remove"):t&&N.emit("remove"));for(var P=0;Pf&&Math.abs(l.v)>f;);return a?function(e){return u[e*(u.length-1)|0]}:c}}(),Ca=function(e,t,n,r){var o=function(e,t,n,r){var o=4,a=.001,i=1e-7,l=10,s=11,u=1/(s-1),c="undefined"!==typeof Float32Array;if(4!==arguments.length)return!1;for(var f=0;f<4;++f)if("number"!==typeof arguments[f]||isNaN(arguments[f])||!isFinite(arguments[f]))return!1;e=Math.min(e,1),n=Math.min(n,1),e=Math.max(e,0),n=Math.max(n,0);var d=c?new Float32Array(s):new Array(s);function p(e,t){return 1-3*t+3*e}function h(e,t){return 3*t-6*e}function v(e){return 3*e}function g(e,t,n){return((p(t,n)*e+h(t,n))*e+v(t))*e}function m(e,t,n){return 3*p(t,n)*e*e+2*h(t,n)*e+v(t)}function y(t,r){for(var a=0;a0?o=s:r=s}while(Math.abs(a)>i&&++u=a?y(t,l):0===c?l:x(t,r,r+u)}var E=!1;function k(){E=!0,e===t&&n===r||b()}var C=function(o){return E||k(),e===t&&n===r?o:0===o?0:1===o?1:g(w(o),t,r)};C.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var S="generateBezier("+[e,t,n,r]+")";return C.toString=function(){return S},C}(e,t,n,r);return function(e,t,n){return e+(t-e)*o(n)}},Sa={linear:function(e,t,n){return e+(t-e)*n},ease:Ca(.25,.1,.25,1),"ease-in":Ca(.42,0,1,1),"ease-out":Ca(0,0,.58,1),"ease-in-out":Ca(.42,0,.58,1),"ease-in-sine":Ca(.47,0,.745,.715),"ease-out-sine":Ca(.39,.575,.565,1),"ease-in-out-sine":Ca(.445,.05,.55,.95),"ease-in-quad":Ca(.55,.085,.68,.53),"ease-out-quad":Ca(.25,.46,.45,.94),"ease-in-out-quad":Ca(.455,.03,.515,.955),"ease-in-cubic":Ca(.55,.055,.675,.19),"ease-out-cubic":Ca(.215,.61,.355,1),"ease-in-out-cubic":Ca(.645,.045,.355,1),"ease-in-quart":Ca(.895,.03,.685,.22),"ease-out-quart":Ca(.165,.84,.44,1),"ease-in-out-quart":Ca(.77,0,.175,1),"ease-in-quint":Ca(.755,.05,.855,.06),"ease-out-quint":Ca(.23,1,.32,1),"ease-in-out-quint":Ca(.86,0,.07,1),"ease-in-expo":Ca(.95,.05,.795,.035),"ease-out-expo":Ca(.19,1,.22,1),"ease-in-out-expo":Ca(1,0,0,1),"ease-in-circ":Ca(.6,.04,.98,.335),"ease-out-circ":Ca(.075,.82,.165,1),"ease-in-out-circ":Ca(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Sa.linear;var r=ka(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":Ca};function _a(e,t,n,r,o){if(1===r)return n;if(t===n)return n;var a=o(t,n,r);return null==e||((e.roundValue||e.color)&&(a=Math.round(a)),void 0!==e.min&&(a=Math.max(a,e.min)),void 0!==e.max&&(a=Math.min(a,e.max))),a}function Na(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function Pa(e,t,n,r,o){var a=null!=o?o.type:null;n<0?n=0:n>1&&(n=1);var i=Na(e,o),l=Na(t,o);if(I(i)&&I(l))return _a(a,i,l,n,r);if(T(i)&&T(l)){for(var s=[],u=0;u0?("spring"===f&&d.push(i.duration),i.easingImpl=Sa[f].apply(null,d)):i.easingImpl=Sa[f]}var p,h=i.easingImpl;if(p=0===i.duration?1:(n-s)/i.duration,i.applying&&(p=i.progress),p<0?p=0:p>1&&(p=1),null==i.delay){var v=i.startPosition,g=i.position;if(g&&o&&!e.locked()){var m={};Ta(v.x,g.x)&&(m.x=Pa(v.x,g.x,p,h)),Ta(v.y,g.y)&&(m.y=Pa(v.y,g.y,p,h)),e.position(m)}var y=i.startPan,b=i.pan,x=a.pan,w=null!=b&&r;w&&(Ta(y.x,b.x)&&(x.x=Pa(y.x,b.x,p,h)),Ta(y.y,b.y)&&(x.y=Pa(y.y,b.y,p,h)),e.emit("pan"));var E=i.startZoom,k=i.zoom,C=null!=k&&r;C&&(Ta(E,k)&&(a.zoom=ft(a.minZoom,Pa(E,k,p,h),a.maxZoom)),e.emit("zoom")),(w||C)&&e.emit("viewport");var S=i.style;if(S&&S.length>0&&o){for(var _=0;_=0;t--){(0,e[t])()}e.splice(0,e.length)},c=a.length-1;c>=0;c--){var f=a[c],d=f._private;d.stopped?(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.frames)):(d.playing||d.applying)&&(d.playing&&d.applying&&(d.applying=!1),d.started||Ma(0,f,e),Oa(t,f,e,n),d.applying&&(d.applying=!1),u(d.frames),null!=d.step&&d.step(e),f.completed()&&(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.completes)),l=!0)}return n||0!==a.length||0!==i.length||r.push(t),l}for(var a=!1,i=0;i0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var Da={animate:ar.animate(),animation:ar.animation(),animated:ar.animated(),clearQueue:ar.clearQueue(),delay:ar.delay(),delayAnimation:ar.delayAnimation(),stop:ar.stop(),addToAnimationPool:function(e){this.styleEnabled()&&this._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender((function(t,n){Ia(n,e)}),t.beforeRenderPriorities.animations):function t(){e._private.animationsRunning&&ne((function(n){Ia(n,e),t()}))}()}}},Ra={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&A(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},Aa=function(e){return P(e)?new Hr(e):e},ja={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Fo(Ra,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,Aa(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,Aa(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,Aa(t),n),this},once:function(e,t,n){return this.emitter().one(e,Aa(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};ar.eventAliasesOn(ja);var La={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};La.jpeg=La.jpg;var za={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var o;o=P(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var a=new r(X({},e,{cy:t,eles:o}));return a}ke("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else ke("A `name` must be specified to make a layout");else ke("Layout options must be specified to make a layout")}};za.createLayout=za.makeLayout=za.layout;var Fa={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var o=this.renderer();!this.destroyed()&&o&&o.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach((function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)}))}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch((function(){for(var n=Object.keys(e),r=0;r0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach((function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]}))},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};Va.invalidateDimensions=Va.resize;var Ka={collection:function(e,t){return P(e)?this.$(e):R(e)?e.collection():T(e)?new xa(this,e,t):new xa(this)},nodes:function(e){var t=this.$((function(e){return e.isNode()}));return e?t.filter(e):t},edges:function(e){var t=this.$((function(e){return e.isEdge()}));return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};Ka.elements=Ka.filter=Ka.$;var Ha={},Wa="t";Ha.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r0;if(d||f&&p){var h=void 0;d&&p||d?h=u.properties:p&&(h=u.mappedProperties);for(var v=0;v1&&(g=1),l.color){var w=o.valueMin[0],E=o.valueMax[0],k=o.valueMin[1],C=o.valueMax[1],S=o.valueMin[2],_=o.valueMax[2],N=null==o.valueMin[3]?1:o.valueMin[3],P=null==o.valueMax[3]?1:o.valueMax[3],O=[Math.round(w+(E-w)*g),Math.round(k+(C-k)*g),Math.round(S+(_-S)*g),Math.round(N+(P-N)*g)];n={bypass:o.bypass,name:o.name,value:O,strValue:"rgb("+O[0]+", "+O[1]+", "+O[2]+")"}}else{if(!l.number)return!1;var T=o.valueMin+(o.valueMax-o.valueMin)*g;n=this.parse(o.name,T,o.bypass,d)}if(!n)return v(),!1;n.mapping=o,o=n;break;case i.data:for(var M=o.field.split("."),D=f.data,R=0;R0&&a>0){for(var l={},s=!1,u=0;u0?e.delayAnimation(i).play().promise().then(t):t()})).then((function(){return e.animation({style:l,duration:a,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()})).then((function(){n.removeBypasses(e,o),e.emitAndNotify("style"),r.transitioning=!1}))}else r.transitioning&&(this.removeBypasses(e,o),e.emitAndNotify("style"),r.transitioning=!1)},Ha.checkTrigger=function(e,t,n,r,o,a){var i=this.properties[t],l=o(i);null!=l&&l(n,r)&&a(i)},Ha.checkZOrderTrigger=function(e,t,n,r){var o=this;this.checkTrigger(e,t,n,r,(function(e){return e.triggersZOrder}),(function(){o._private.cy.notify("zorder",e)}))},Ha.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBounds}),(function(o){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache(),!o.triggersBoundsOfParallelBeziers||("curve-style"!==t||"bezier"!==n&&"bezier"!==r)&&("display"!==t||"none"!==n&&"none"!==r)||e.parallelEdges().forEach((function(e){e.isBundledBezier()&&e.dirtyBoundingBoxCache()}))}))},Ha.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r)};var qa={applyBypass:function(e,t,n,r){var o=[];if("*"===t||"**"===t){if(void 0!==n)for(var a=0;at.length?a.substr(t.length):""}function l(){n=n.length>r.length?n.substr(r.length):""}for(a=a.replace(/[/][*](\s|.)+?[*][/]/g,"");;){if(a.match(/^\s*$/))break;var s=a.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!s){Se("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+a);break}t=s[0];var u=s[1];if("core"!==u)if(new Hr(u).invalid){Se("Skipping parsing of block: Invalid selector found in string stylesheet: "+u),i();continue}var c=s[2],f=!1;n=c;for(var d=[];;){if(n.match(/^\s*$/))break;var p=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!p){Se("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+c),f=!0;break}r=p[0];var h=p[1],v=p[2];if(this.properties[h])o.parse(h,v)?(d.push({name:h,val:v}),l()):(Se("Skipping property: Invalid property definition in: "+r),l());else Se("Skipping property: Invalid property name in: "+r),l()}if(f){i();break}o.selector(u);for(var g=0;g=7&&"d"===t[0]&&(u=new RegExp(l.data.regex).exec(t))){if(n)return!1;var d=l.data;return{name:e,value:u,strValue:""+t,mapped:d,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(l.mapData.regex).exec(t))){if(n)return!1;if(f.multiple)return!1;var p=l.mapData;if(!f.color&&!f.number)return!1;var h=this.parse(e,c[4]);if(!h||h.mapped)return!1;var v=this.parse(e,c[5]);if(!v||v.mapped)return!1;if(h.pfValue===v.pfValue||h.strValue===v.strValue)return Se("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+h.strValue+"`"),this.parse(e,h.strValue);if(f.color){var g=h.value,m=v.value;if(g[0]===m[0]&&g[1]===m[1]&&g[2]===m[2]&&(g[3]===m[3]||(null==g[3]||1===g[3])&&(null==m[3]||1===m[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:p,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:h.value,valueMax:v.value,bypass:n}}}if(f.multiple&&"multiple"!==r){var y;if(y=s?t.split(/\s+/):T(t)?t:[t],f.evenMultiple&&y.length%2!==0)return null;for(var b=[],x=[],w=[],E="",k=!1,C=0;C0?" ":"")+S.strValue}return f.validate&&!f.validate(b,x)?null:f.singleEnum&&k?1===b.length&&P(b[0])?{name:e,value:b[0],strValue:b[0],bypass:n}:null:{name:e,value:b,pfValue:w,strValue:E,bypass:n,units:x}}var _,N,M=function(){for(var r=0;rf.max||f.strictMax&&t===f.max))return null;var L={name:e,value:t,strValue:""+t+(D||""),units:D,bypass:n};return f.unitless||"px"!==D&&"em"!==D?L.pfValue=t:L.pfValue="px"!==D&&D?this.getEmSizeInPixels()*t:t,"ms"!==D&&"s"!==D||(L.pfValue="ms"===D?t:1e3*t),"deg"!==D&&"rad"!==D||(L.pfValue="rad"===D?t:(_=t,Math.PI*_/180)),"%"===D&&(L.pfValue=t/100),L}if(f.propList){var z=[],F=""+t;if("none"===F);else{for(var B=F.split(/\s*,\s*|\s+/),V=0;V0&&s>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:i=(i=(i=Math.min((l-2*t)/n.w,(s-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:i)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,o=r.pan,a=r.zoom,i=!1;if(r.zoomingEnabled||(i=!0),I(e)?n=e:M(e)&&(n=e.level,null!=e.position?t=et(e.position,a,o):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(i=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?a=!0:(t.zoom=l,o.push("zoom"))}if(r&&(!a||!e.cancelOnFailedZoom)&&t.panningEnabled){var s=e.pan;I(s.x)&&(t.pan.x=s.x,i=!1),I(s.y)&&(t.pan.y=s.y,i=!1),i||o.push("pan")}return o.length>0&&(o.push("viewport"),this.emit(o.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(P(e)){var n=e;e=this.mutableElements().filter(n)}else R(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),o=this.width(),a=this.height();return{x:(o-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(a-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e=this._private,t=e.container;return e.sizeCache=e.sizeCache||(t?function(){var e=w.getComputedStyle(t),n=function(t){return parseFloat(e.getPropertyValue(t))};return{width:t.clientWidth-n("padding-left")-n("padding-right"),height:t.clientHeight-n("padding-top")-n("padding-bottom")}}():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};ti.centre=ti.center,ti.autolockNodes=ti.autolock,ti.autoungrabifyNodes=ti.autoungrabify;var ni={data:ar.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:ar.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:ar.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:ar.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};ni.attr=ni.data,ni.removeAttr=ni.removeData;var ri=function(e){var t=this,n=(e=X({},e)).container;n&&!D(n)&&D(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var o=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var a=void 0!==w&&void 0!==n&&!e.headless,i=e;i.layout=X({name:a?"grid":"null"},i.layout),i.renderer=X({name:a?"canvas":"null"},i.renderer);var l=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},s=this._private={container:n,ready:!1,options:i,elements:new xa(this),listeners:[],aniEles:new xa(this),data:i.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:l(!0,i.zoomingEnabled),userZoomingEnabled:l(!0,i.userZoomingEnabled),panningEnabled:l(!0,i.panningEnabled),userPanningEnabled:l(!0,i.userPanningEnabled),boxSelectionEnabled:l(!0,i.boxSelectionEnabled),autolock:l(!1,i.autolock,i.autolockNodes),autoungrabify:l(!1,i.autoungrabify,i.autoungrabifyNodes),autounselectify:l(!1,i.autounselectify),styleEnabled:void 0===i.styleEnabled?a:i.styleEnabled,zoom:I(i.zoom)?i.zoom:1,pan:{x:M(i.pan)&&I(i.pan.x)?i.pan.x:0,y:M(i.pan)&&I(i.pan.y)?i.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:l(250,i.multiClickDebounceTime)};this.createEmitter(),this.selectionType(i.selectionType),this.zoomRange({min:i.minZoom,max:i.maxZoom});s.styleEnabled&&t.setStyle([]);var u=X({},i,i.renderer);t.initRenderer(u);!function(e,t){if(e.some(B))return Jn.all(e).then(t);t(e)}([i.style,i.elements],(function(e){var n=e[0],a=e[1];s.styleEnabled&&t.style().append(n),function(e,n,r){t.notifications(!1);var o=t.mutableElements();o.length>0&&o.remove(),null!=e&&(M(e)||T(e))&&t.add(e),t.one("layoutready",(function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")})).one("layoutstop",(function(){t.one("done",r),t.emit("done")}));var a=X({},t._private.options.layout);a.eles=t.elements(),t.layout(a).run()}(a,(function(){t.startAnimationLoop(),s.ready=!0,O(i.ready)&&t.on("ready",i.ready);for(var e=0;e0,u=dt(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(R(n.roots))e=n.roots;else if(T(n.roots)){for(var c=[],f=0;f0;){var M=_.shift(),I=S(M,N);if(I)M.outgoers().filter((function(e){return e.isNode()&&o.has(e)})).forEach(O);else if(null===I){Se("Detected double maximal shift for node `"+M.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}C();var D=0;if(n.avoidOverlap)for(var A=0;A0&&m[0].length<=3?s/2:0),f=2*Math.PI/m[r].length*o;return 0===r&&1===m[0].length&&(c=1),{x:X+c*Math.cos(f),y:$+c*Math.sin(f)}}return{x:X+(o+1-(a+1)/2)*i,y:(r+1)*l}})),this};var ui={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function ci(e){this.options=X({},ui,e)}ci.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,o=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));for(var i,l=dt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),s=l.x1+l.w/2,u=l.y1+l.h/2,c=(void 0===t.sweep?2*Math.PI-2*Math.PI/a.length:t.sweep)/Math.max(1,a.length-1),f=0,d=0;d1&&t.avoidOverlap){f*=1.75;var g=Math.cos(c)-Math.cos(0),m=Math.sin(c)-Math.sin(0),y=Math.sqrt(f*f/(g*g+m*m));i=Math.max(y,i)}return r.nodes().layoutPositions(this,t,(function(e,n){var r=t.startAngle+n*c*(o?1:-1),a=i*Math.cos(r),l=i*Math.sin(r);return{x:s+a,y:u+l}})),this};var fi,di={fit:!0,padding:30,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function pi(e){this.options=X({},di,e)}pi.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,o=t.eles,a=o.nodes().not(":parent"),i=dt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l=i.x1+i.w/2,s=i.y1+i.h/2,u=[],c=0,f=0;f0)Math.abs(y[0].value-x.value)>=g&&(y=[],m.push(y));y.push(x)}var w=c+t.minNodeSpacing;if(!t.avoidOverlap){var E=m.length>0&&m[0].length>1,k=(Math.min(i.w,i.h)/2-w)/(m.length+E?1:0);w=Math.min(w,k)}for(var C=0,S=0;S1&&t.avoidOverlap){var O=Math.cos(P)-Math.cos(0),T=Math.sin(P)-Math.sin(0),M=Math.sqrt(w*w/(O*O+T*T));C=Math.max(M,C)}_.r=C,C+=w}if(t.equidistant){for(var I=0,D=0,R=0;R=e.numIter)&&(Ei(r,e),r.temperature=r.temperature*e.coolingFactor,!(r.temperature=e.animationThreshold&&a(),ne(t)):(Ri(r,e),l())}()}else{for(;u;)u=i(s),s++;Ri(r,e),l()}return this},vi.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},vi.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var gi=function(e,t,n){for(var r=n.eles.edges(),o=n.eles.nodes(),a={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:o.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:e.width(),clientHeight:e.width(),boundingBox:dt(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()})},i=n.eles.components(),l={},s=0;s0){a.graphSet.push(x);for(s=0;sr.count?0:r.graph},yi=function e(t,n,r,o){var a=o.graphSet[r];if(-10)var l=(u=r.nodeOverlap*i)*o/(v=Math.sqrt(o*o+a*a)),s=u*a/v;else{var u,c=Ni(e,o,a),f=Ni(t,-1*o,-1*a),d=f.x-c.x,p=f.y-c.y,h=d*d+p*p,v=Math.sqrt(h);l=(u=(e.nodeRepulsion+t.nodeRepulsion)/h)*d/v,s=u*p/v}e.isLocked||(e.offsetX-=l,e.offsetY-=s),t.isLocked||(t.offsetX+=l,t.offsetY+=s)}},_i=function(e,t,n,r){if(n>0)var o=e.maxX-t.minX;else o=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else a=t.maxY-e.minY;return o>=0&&a>=0?Math.sqrt(o*o+a*a):0},Ni=function(e,t,n){var r=e.positionX,o=e.positionY,a=e.height||1,i=e.width||1,l=n/t,s=a/i,u={};return 0===t&&0n?(u.x=r,u.y=o+a/2,u):0t&&-1*s<=l&&l<=s?(u.x=r-i/2,u.y=o-i*n/2/t,u):0=s)?(u.x=r+a*t/2/n,u.y=o+a/2,u):0>n&&(l<=-1*s||l>=s)?(u.x=r-a*t/2/n,u.y=o-a/2,u):u},Pi=function(e,t){for(var n=0;n1){var h=t.gravity*f/p,v=t.gravity*d/p;c.offsetX+=h,c.offsetY+=v}}}}},Ti=function(e,t){var n=[],r=0,o=-1;for(n.push.apply(n,e.graphSet[0]),o+=e.graphSet[0].length;r<=o;){var a=n[r++],i=e.idToIndex[a],l=e.layoutNodes[i],s=l.children;if(0n)var o={x:n*e/r,y:n*t/r};else o={x:e,y:t};return o},Di=function e(t,n){var r=t.parentId;if(null!=r){var o=n.layoutNodes[n.idToIndex[r]],a=!1;return(null==o.maxX||t.maxX+o.padRight>o.maxX)&&(o.maxX=t.maxX+o.padRight,a=!0),(null==o.minX||t.minX-o.padLefto.maxY)&&(o.maxY=t.maxY+o.padBottom,a=!0),(null==o.minY||t.minY-o.padToph&&(f+=p+t.componentSpacing,c=0,d=0,p=0)}}},Ai={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function ji(e){this.options=X({},Ai,e)}ji.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,o=r.nodes().not(":parent");t.sort&&(o=o.sort(t.sort));var a=dt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===a.h||0===a.w)r.nodes().layoutPositions(this,t,(function(e){return{x:a.x1,y:a.y1}}));else{var i=o.size(),l=Math.sqrt(i*a.h/a.w),s=Math.round(l),u=Math.round(a.w/a.h*l),c=function(e){if(null==e)return Math.min(s,u);Math.min(s,u)==s?s=e:u=e},f=function(e){if(null==e)return Math.max(s,u);Math.max(s,u)==s?s=e:u=e},d=t.rows,p=null!=t.cols?t.cols:t.columns;if(null!=d&&null!=p)s=d,u=p;else if(null!=d&&null==p)s=d,u=Math.ceil(i/s);else if(null==d&&null!=p)u=p,s=Math.ceil(i/u);else if(u*s>i){var h=c(),v=f();(h-1)*v>=i?c(h-1):(v-1)*h>=i&&f(v-1)}else for(;u*s=i?f(m+1):c(g+1)}var y=a.w/u,b=a.h/s;if(t.condense&&(y=0,b=0),t.avoidOverlap)for(var x=0;x=u&&(M=0,T++)},D={},R=0;R(r=Ct(e,t,x[w],x[w+1],x[w+2],x[w+3])))return g(n,r),!0}else if("bezier"===a.edgeType||"multibezier"===a.edgeType||"self"===a.edgeType||"compound"===a.edgeType)for(x=a.allpts,w=0;w+5(r=kt(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return g(n,r),!0;y=y||o.source,b=b||o.target;var E=i.getArrowWidth(s,c),k=[{name:"source",x:a.arrowStartX,y:a.arrowStartY,angle:a.srcArrowAngle},{name:"target",x:a.arrowEndX,y:a.arrowEndY,angle:a.tgtArrowAngle},{name:"mid-source",x:a.midX,y:a.midY,angle:a.midsrcArrowAngle},{name:"mid-target",x:a.midX,y:a.midY,angle:a.midtgtArrowAngle}];for(w=0;w0&&(m(y),m(b))}function b(e,t,n){return De(e,t,n)}function x(n,r){var o,a=n._private,i=h;o=r?r+"-":"",n.boundingBox();var l=a.labelBounds[r||"main"],s=n.pstyle(o+"label").value;if("yes"===n.pstyle("text-events").strValue&&s){var u=b(a.rscratch,"labelX",r),c=b(a.rscratch,"labelY",r),f=b(a.rscratch,"labelAngle",r),d=n.pstyle(o+"text-margin-x").pfValue,p=n.pstyle(o+"text-margin-y").pfValue,v=l.x1-i-d,m=l.x2+i-d,y=l.y1-i-p,x=l.y2+i-p;if(f){var w=Math.cos(f),E=Math.sin(f),k=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},C=k(v,y),S=k(v,x),_=k(m,y),N=k(m,x),P=[C.x+d,C.y+p,_.x+d,_.y+p,N.x+d,N.y+p,S.x+d,S.y+p];if(St(e,t,P))return g(n),!0}else if(yt(l,e,t))return g(n),!0}}n&&(s=s.interactive);for(var w=s.length-1;w>=0;w--){var E=s[w];E.isNode()?m(E)||x(E):y(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){for(var o,a,i=this.getCachedZSortedEles().interactive,l=[],s=Math.min(e,n),u=Math.max(e,n),c=Math.min(t,r),f=Math.max(t,r),d=dt({x1:e=s,y1:t=c,x2:n=u,y2:r=f}),p=0;p0?Math.max(e-t,0):Math.min(e+t,0)},N=_(C,E),P=_(S,k),O=!1;"auto"===g?v=Math.abs(N)>Math.abs(P)?o:r:g===s||g===l?(v=r,O=!0):g!==a&&g!==i||(v=o,O=!0);var T,M=v===r,I=M?P:N,D=M?S:C,R=at(D),A=!1;(O&&(y||x)||!(g===l&&D<0||g===s&&D>0||g===a&&D>0||g===i&&D<0)||(I=(R*=-1)*Math.abs(I),A=!0),y)?T=(b<0?1+b:b)*I:T=(b<0?I:0)+b*R;var j=function(e){return Math.abs(e)=Math.abs(I)},L=j(T),z=j(Math.abs(I)-Math.abs(T));if((L||z)&&!A)if(M){var F=Math.abs(D)<=f/2,B=Math.abs(C)<=d/2;if(F){var V=(u.x1+u.x2)/2,K=u.y1,H=u.y2;n.segpts=[V,K,V,H]}else if(B){var W=(u.y1+u.y2)/2,q=u.x1,U=u.x2;n.segpts=[q,W,U,W]}else n.segpts=[u.x1,u.y2]}else{var Y=Math.abs(D)<=c/2,X=Math.abs(S)<=p/2;if(Y){var $=(u.y1+u.y2)/2,G=u.x1,Q=u.x2;n.segpts=[G,$,Q,$]}else if(X){var Z=(u.x1+u.x2)/2,J=u.y1,ee=u.y2;n.segpts=[Z,J,Z,ee]}else n.segpts=[u.x2,u.y1]}else if(M){var te=u.y1+T+(h?f/2*R:0),ne=u.x1,re=u.x2;n.segpts=[ne,te,re,te]}else{var oe=u.x1+T+(h?c/2*R:0),ae=u.y1,ie=u.y2;n.segpts=[oe,ae,oe,ie]}},Gi.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,o=t.tgtPos,a=t.srcW,i=t.srcH,l=t.tgtW,s=t.tgtH,u=t.srcShape,c=t.tgtShape,f=!I(n.startX)||!I(n.startY),d=!I(n.arrowStartX)||!I(n.arrowStartY),p=!I(n.endX)||!I(n.endY),h=!I(n.arrowEndX)||!I(n.arrowEndY),v=3*(this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth),g=it({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),m=gd.poolIndex()){var p=f;f=d,d=p}var h=l.srcPos=f.position(),v=l.tgtPos=d.position(),g=l.srcW=f.outerWidth(),m=l.srcH=f.outerHeight(),y=l.tgtW=d.outerWidth(),b=l.tgtH=d.outerHeight(),x=l.srcShape=n.nodeShapes[t.getNodeShape(f)],w=l.tgtShape=n.nodeShapes[t.getNodeShape(d)];l.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var E=0;E0){var K=u,H=lt(K,nt(t)),W=lt(K,nt(V)),q=H;if(W2)lt(K,{x:V[2],y:V[3]})0){var oe=c,ae=lt(oe,nt(t)),ie=lt(oe,nt(re)),le=ae;if(ie2)lt(oe,{x:re[2],y:re[3]})=u||y){c={cp:v,segment:m};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-d)/x.length,E=x.t1-x.t0,k=l?x.t0+E*w:x.t1-E*w;k=ft(0,k,1),t=ct(b.p0,b.p1,b.p2,k),o=function(e,t,n,r){var o=ft(0,r-.001,1),a=ft(0,r+.001,1),i=ct(e,t,n,o),l=ct(e,t,n,a);return rl(i,l)}(b.p0,b.p1,b.p2,k);break;case"straight":case"segments":case"haystack":for(var C,S,_,N,P=0,O=r.allpts.length,T=0;T+3=u));T+=2);var M=(u-S)/C;M=ft(0,M,1),t=function(e,t,n,r){var o=t.x-e.x,a=t.y-e.y,i=it(e,t),l=o/i,s=a/i;return n=null==n?0:n,r=null!=r?r:n*i,{x:e.x+l*r,y:e.y+s*r}}(_,N,M),o=rl(_,N)}i("labelX",n,t.x),i("labelY",n,t.y),i("labelAutoAngle",n,o)}};u("source"),u("target"),this.applyLabelDimensions(e)}},tl.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},tl.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),o=this.calculateLabelDimensions(e,r),a=e.pstyle("line-height").pfValue,i=e.pstyle("text-wrap").strValue,l=De(n.rscratch,"labelWrapCachedLines",t)||[],s="wrap"!==i?1:Math.max(l.length,1),u=o.height/s,c=u*a,f=o.width,d=o.height+(s-1)*(a-1)*u;Re(n.rstyle,"labelWidth",t,f),Re(n.rscratch,"labelWidth",t,f),Re(n.rstyle,"labelHeight",t,d),Re(n.rscratch,"labelHeight",t,d),Re(n.rscratch,"labelLineHeight",t,c)},tl.getLabelText=function(e,t){var n=e._private,r=t?t+"-":"",o=e.pstyle(r+"label").strValue,a=e.pstyle("text-transform").value,i=function(e,r){return r?(Re(n.rscratch,e,t,r),r):De(n.rscratch,e,t)};if(!o)return"";"none"==a||("uppercase"==a?o=o.toUpperCase():"lowercase"==a&&(o=o.toLowerCase()));var l=e.pstyle("text-wrap").value;if("wrap"===l){var s=i("labelKey");if(null!=s&&i("labelWrapKey")===s)return i("labelWrapCachedText");for(var u=o.split("\n"),c=e.pstyle("text-max-width").pfValue,f="anywhere"===e.pstyle("text-overflow-wrap").value,d=[],p=/[\s\u200b]+/,h=f?"":" ",v=0;vc){for(var b=g.split(p),x="",w=0;wC)break;S+=o[N],N===o.length-1&&(_=!0)}return _||(S+="\u2026"),S}return o},tl.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;if("auto"!==t)return t;if(!e.isNode())return"center";switch(n){case"left":return"right";case"right":return"left";default:return"center"}},tl.calculateLabelDimensions=function(e,t){var n=de(t,e._private.labelDimsKey),r=this.labelDimCache||(this.labelDimCache=[]),o=r[n];if(null!=o)return o;var a=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue,l=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,u=this.labelCalcCanvas,c=this.labelCalcCanvasContext;if(!u){u=this.labelCalcCanvas=document.createElement("canvas"),c=this.labelCalcCanvasContext=u.getContext("2d");var f=u.style;f.position="absolute",f.left="-9999px",f.top="-9999px",f.zIndex="-1",f.visibility="hidden",f.pointerEvents="none"}c.font="".concat(a," ").concat(s," ").concat(i,"px ").concat(l);for(var d=0,p=0,h=t.split("\n"),v=0;v1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r=e.desktopTapThreshold2}var _=r(t);g&&(e.hoverData.tapholdCancelled=!0);a=!0,n(v,["mousemove","vmousemove","tapdrag"],t,{x:c[0],y:c[1]});var N=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||i.emit({originalEvent:t,type:"boxstart",position:{x:c[0],y:c[1]}}),h[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(g){var P={originalEvent:t,type:"cxtdrag",position:{x:c[0],y:c[1]}};y?y.emit(P):i.emit(P),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&v===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:c[0],y:c[1]}}),e.hoverData.cxtOver=v,v&&v.emit({originalEvent:t,type:"cxtdragover",position:{x:c[0],y:c[1]}}))}}else if(e.hoverData.dragging){if(a=!0,i.panningEnabled()&&i.userPanningEnabled()){var O;if(e.hoverData.justStartedPan){var T=e.hoverData.mdownPos;O={x:(c[0]-T[0])*l,y:(c[1]-T[1])*l},e.hoverData.justStartedPan=!1}else O={x:b[0]*l,y:b[1]*l};i.panBy(O),i.emit("dragpan"),e.hoverData.dragged=!0}c=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=h[4]||null!=y&&!y.pannable()){if(y&&y.pannable()&&y.active()&&y.unactivate(),y&&y.grabbed()||v==m||(m&&n(m,["mouseout","tapdragout"],t,{x:c[0],y:c[1]}),v&&n(v,["mouseover","tapdragover"],t,{x:c[0],y:c[1]}),e.hoverData.last=v),y)if(g){if(i.boxSelectionEnabled()&&_)y&&y.grabbed()&&(f(x),y.emit("freeon"),x.emit("free"),e.dragData.didDrag&&(y.emit("dragfreeon"),x.emit("dragfree"))),N();else if(y&&y.grabbed()&&e.nodeIsDraggable(y)){var M=!e.dragData.didDrag;M&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||s(x,{inDragLayer:!0});var D={x:0,y:0};if(I(b[0])&&I(b[1])&&(D.x+=b[0],D.y+=b[1],M)){var R=e.hoverData.dragDelta;R&&I(R[0])&&I(R[1])&&(D.x+=R[0],D.y+=R[1])}e.hoverData.draggingEles=!0,x.silentShift(D).emit("position drag"),e.redrawHint("drag",!0),e.redraw()}}else!function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(b[0]),t.push(b[1])):(t[0]+=b[0],t[1]+=b[1])}();a=!0}else if(g){if(e.hoverData.dragging||!i.boxSelectionEnabled()||!_&&i.panningEnabled()&&i.userPanningEnabled()){if(!e.hoverData.selecting&&i.panningEnabled()&&i.userPanningEnabled()){o(y,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,h[4]=0,e.data.bgActivePosistion=nt(d),e.redrawHint("select",!0),e.redraw())}}else N();y&&y.pannable()&&y.active()&&y.unactivate()}return h[2]=c[0],h[3]=c[1],a?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}}),!1),e.registerBinding(window,"mouseup",(function(o){if(e.hoverData.capture){e.hoverData.capture=!1;var a=e.cy,i=e.projectIntoViewport(o.clientX,o.clientY),l=e.selection,s=e.findNearestElement(i[0],i[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,d=r(o);if(e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate(),3===e.hoverData.which){var p={originalEvent:o,type:"cxttapend",position:{x:i[0],y:i[1]}};if(c?c.emit(p):a.emit(p),!e.hoverData.cxtDragged){var h={originalEvent:o,type:"cxttap",position:{x:i[0],y:i[1]}};c?c.emit(h):a.emit(h)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(n(s,["mouseup","tapend","vmouseup"],o,{x:i[0],y:i[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(n(c,["click","tap","vclick"],o,{x:i[0],y:i[1]}),b=!1,o.timeStamp-x<=a.multiClickDebounceTime()?(y&&clearTimeout(y),b=!0,x=null,n(c,["dblclick","dbltap","vdblclick"],o,{x:i[0],y:i[1]})):(y=setTimeout((function(){b||n(c,["oneclick","onetap","voneclick"],o,{x:i[0],y:i[1]})}),a.multiClickDebounceTime()),x=o.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||r(o)||(a.$(t).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=a.collection()),s!=c||e.dragData.didDrag||e.hoverData.selecting||null!=s&&s._private.selectable&&(e.hoverData.dragging||("additive"===a.selectionType()||d?s.selected()?s.unselect(["tapunselect"]):s.select(["tapselect"]):d||(a.$(t).unmerge(s).unselect(["tapunselect"]),s.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var v=a.collection(e.getAllInBox(l[0],l[1],l[2],l[3]));e.redrawHint("select",!0),v.length>0&&e.redrawHint("eles",!0),a.emit({type:"boxend",originalEvent:o,position:{x:i[0],y:i[1]}});var g=function(e){return e.selectable()&&!e.selected()};"additive"===a.selectionType()||d||a.$(t).unmerge(v).unselect(),v.emit("box").stdFilter(g).select().emit("boxselect"),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!l[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var m=c&&c.grabbed();f(u),m&&(c.emit("freeon"),u.emit("free"),e.dragData.didDrag&&(c.emit("dragfreeon"),u.emit("dragfree")))}}l[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null}}),!1);var E,k,C,S,_,N,P,O,T,M,D,R,A,j=function(t){if(!e.scrollingPage){var n=e.cy,r=n.zoom(),o=n.pan(),a=e.projectIntoViewport(t.clientX,t.clientY),i=[a[0]*r+o.x,a[1]*r+o.y];if(e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.cxtStarted||0!==e.selection[4])t.preventDefault();else if(n.panningEnabled()&&n.userPanningEnabled()&&n.zoomingEnabled()&&n.userZoomingEnabled()){var l;t.preventDefault(),e.data.wheelZooming=!0,clearTimeout(e.data.wheelTimeout),e.data.wheelTimeout=setTimeout((function(){e.data.wheelZooming=!1,e.redrawHint("eles",!0),e.redraw()}),150),l=null!=t.deltaY?t.deltaY/-250:null!=t.wheelDeltaY?t.wheelDeltaY/1e3:t.wheelDelta/1e3,l*=e.wheelSensitivity,1===t.deltaMode&&(l*=33);var s=n.zoom()*Math.pow(10,l);"gesturechange"===t.type&&(s=e.gestureStartZoom*t.scale),n.zoom({level:s,renderedPosition:{x:i[0],y:i[1]}}),n.emit("gesturechange"===t.type?"pinchzoom":"scrollzoom")}}};e.registerBinding(e.container,"wheel",j,!0),e.registerBinding(window,"scroll",(function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout((function(){e.scrollingPage=!1}),250)}),!0),e.registerBinding(e.container,"gesturestart",(function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()}),!0),e.registerBinding(e.container,"gesturechange",(function(t){e.hasTouchStarted||j(t)}),!0),e.registerBinding(e.container,"mouseout",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})}),!1),e.registerBinding(e.container,"mouseover",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})}),!1);var L,z,F,B,V,K,H,W=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},q=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",L=function(t){if(e.hasTouchStarted=!0,w(t)){p(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var r=e.cy,o=e.touchData.now,a=e.touchData.earlier;if(t.touches[0]){var l=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);o[0]=l[0],o[1]=l[1]}if(t.touches[1]){l=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);o[2]=l[0],o[3]=l[1]}if(t.touches[2]){l=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);o[4]=l[0],o[5]=l[1]}if(t.touches[1]){e.touchData.singleTouchMoved=!0,f(e.dragData.touchDragEles);var u=e.findContainerClientCoords();T=u[0],M=u[1],D=u[2],R=u[3],E=t.touches[0].clientX-T,k=t.touches[0].clientY-M,C=t.touches[1].clientX-T,S=t.touches[1].clientY-M,A=0<=E&&E<=D&&0<=C&&C<=D&&0<=k&&k<=R&&0<=S&&S<=R;var d=r.pan(),h=r.zoom();_=W(E,k,C,S),N=q(E,k,C,S),O=[((P=[(E+C)/2,(k+S)/2])[0]-d.x)/h,(P[1]-d.y)/h];if(N<4e4&&!t.touches[2]){var v=e.findNearestElement(o[0],o[1],!0,!0),g=e.findNearestElement(o[2],o[3],!0,!0);return v&&v.isNode()?(v.activate().emit({originalEvent:t,type:"cxttapstart",position:{x:o[0],y:o[1]}}),e.touchData.start=v):g&&g.isNode()?(g.activate().emit({originalEvent:t,type:"cxttapstart",position:{x:o[0],y:o[1]}}),e.touchData.start=g):r.emit({originalEvent:t,type:"cxttapstart",position:{x:o[0],y:o[1]}}),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!0,e.touchData.cxtDragged=!1,e.data.bgActivePosistion=void 0,void e.redraw()}}if(t.touches[2])r.boxSelectionEnabled()&&t.preventDefault();else if(t.touches[1]);else if(t.touches[0]){var m=e.findNearestElements(o[0],o[1],!0,!0),y=m[0];if(null!=y&&(y.activate(),e.touchData.start=y,e.touchData.starts=m,e.nodeIsGrabbable(y))){var b=e.dragData.touchDragEles=r.collection(),x=null;e.redrawHint("eles",!0),e.redrawHint("drag",!0),y.selected()?(x=r.$((function(t){return t.selected()&&e.nodeIsGrabbable(t)})),s(x,{addToList:b})):c(y,{addToList:b}),i(y);var I=function(e){return{originalEvent:t,type:e,position:{x:o[0],y:o[1]}}};y.emit(I("grabon")),x?x.forEach((function(e){e.emit(I("grab"))})):y.emit(I("grab"))}n(y,["touchstart","tapstart","vmousedown"],t,{x:o[0],y:o[1]}),null==y&&(e.data.bgActivePosistion={x:l[0],y:l[1]},e.redrawHint("select",!0),e.redraw()),e.touchData.singleTouchMoved=!1,e.touchData.singleTouchStartTime=+new Date,clearTimeout(e.touchData.tapholdTimeout),e.touchData.tapholdTimeout=setTimeout((function(){!1!==e.touchData.singleTouchMoved||e.pinching||e.touchData.selecting||n(e.touchData.start,["taphold"],t,{x:o[0],y:o[1]})}),e.tapholdDuration)}if(t.touches.length>=1){for(var j=e.touchData.startPosition=[],L=0;L=e.touchTapThreshold2}if(r&&e.touchData.cxt){t.preventDefault();var x=t.touches[0].clientX-T,P=t.touches[0].clientY-M,D=t.touches[1].clientX-T,R=t.touches[1].clientY-M,j=q(x,P,D,R);if(j/N>=2.25||j>=22500){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var L={originalEvent:t,type:"cxttapend",position:{x:l[0],y:l[1]}};e.touchData.start?(e.touchData.start.unactivate().emit(L),e.touchData.start=null):i.emit(L)}}if(r&&e.touchData.cxt){L={originalEvent:t,type:"cxtdrag",position:{x:l[0],y:l[1]}};e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(L):i.emit(L),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var z=e.findNearestElement(l[0],l[1],!0,!0);e.touchData.cxtOver&&z===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:l[0],y:l[1]}}),e.touchData.cxtOver=z,z&&z.emit({originalEvent:t,type:"cxtdragover",position:{x:l[0],y:l[1]}}))}else if(r&&t.touches[2]&&i.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||i.emit({originalEvent:t,type:"boxstart",position:{x:l[0],y:l[1]}}),e.touchData.selecting=!0,e.touchData.didSelect=!0,a[4]=1,a&&0!==a.length&&void 0!==a[0]?(a[2]=(l[0]+l[2]+l[4])/3,a[3]=(l[1]+l[3]+l[5])/3):(a[0]=(l[0]+l[2]+l[4])/3,a[1]=(l[1]+l[3]+l[5])/3,a[2]=(l[0]+l[2]+l[4])/3+1,a[3]=(l[1]+l[3]+l[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(r&&t.touches[1]&&!e.touchData.didSelect&&i.zoomingEnabled()&&i.panningEnabled()&&i.userZoomingEnabled()&&i.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),ee=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var F=0;F0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(window,"touchcancel",F=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(window,"touchend",B=function(r){var o=e.touchData.start;if(e.touchData.capture){0===r.touches.length&&(e.touchData.capture=!1),r.preventDefault();var a=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var i,l=e.cy,s=l.zoom(),u=e.touchData.now,c=e.touchData.earlier;if(r.touches[0]){var d=e.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);u[0]=d[0],u[1]=d[1]}if(r.touches[1]){d=e.projectIntoViewport(r.touches[1].clientX,r.touches[1].clientY);u[2]=d[0],u[3]=d[1]}if(r.touches[2]){d=e.projectIntoViewport(r.touches[2].clientX,r.touches[2].clientY);u[4]=d[0],u[5]=d[1]}if(o&&o.unactivate(),e.touchData.cxt){if(i={originalEvent:r,type:"cxttapend",position:{x:u[0],y:u[1]}},o?o.emit(i):l.emit(i),!e.touchData.cxtDragged){var p={originalEvent:r,type:"cxttap",position:{x:u[0],y:u[1]}};o?o.emit(p):l.emit(p)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!r.touches[2]&&l.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var h=l.collection(e.getAllInBox(a[0],a[1],a[2],a[3]));a[0]=void 0,a[1]=void 0,a[2]=void 0,a[3]=void 0,a[4]=0,e.redrawHint("select",!0),l.emit({type:"boxend",originalEvent:r,position:{x:u[0],y:u[1]}});h.emit("box").stdFilter((function(e){return e.selectable()&&!e.selected()})).select().emit("boxselect"),h.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=o&&o.unactivate(),r.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(r.touches[1]);else if(r.touches[0]);else if(!r.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var v=e.dragData.touchDragEles;if(null!=o){var g=o._private.grabbed;f(v),e.redrawHint("drag",!0),e.redrawHint("eles",!0),g&&(o.emit("freeon"),v.emit("free"),e.dragData.didDrag&&(o.emit("dragfreeon"),v.emit("dragfree"))),n(o,["touchend","tapend","vmouseup","tapdragout"],r,{x:u[0],y:u[1]}),o.unactivate(),e.touchData.start=null}else{var m=e.findNearestElement(u[0],u[1],!0,!0);n(m,["touchend","tapend","vmouseup","tapdragout"],r,{x:u[0],y:u[1]})}var y=e.touchData.startPosition[0]-u[0],b=y*y,x=e.touchData.startPosition[1]-u[1],w=(b+x*x)*s*s;e.touchData.singleTouchMoved||(o||l.$(":selected").unselect(["tapunselect"]),n(o,["tap","vclick"],r,{x:u[0],y:u[1]}),V=!1,r.timeStamp-H<=l.multiClickDebounceTime()?(K&&clearTimeout(K),V=!0,H=null,n(o,["dbltap","vdblclick"],r,{x:u[0],y:u[1]})):(K=setTimeout((function(){V||n(o,["onetap","voneclick"],r,{x:u[0],y:u[1]})}),l.multiClickDebounceTime()),H=r.timeStamp)),null!=o&&!e.dragData.didDrag&&o._private.selectable&&w2){for(var P=[u[0],u[1]],O=Math.pow(P[0]-e,2)+Math.pow(P[1]-t,2),T=1;T0)return v[0]}return null},d=Object.keys(c),p=0;p0?s:xt(o,a,e,t,n,r,i)},checkPoint:function(e,t,n,r,o,a,i){var l=zt(r,o),s=2*l;if(_t(e,t,this.points,a,i,r,o-s,[0,-1],n))return!0;if(_t(e,t,this.points,a,i,r-s,o,[0,-1],n))return!0;var u=r/2+2*n,c=o/2+2*n;return!!St(e,t,[a-u,i-c,a-u,i,a+u,i,a+u,i-c])||(!!Ot(e,t,s,s,a+r/2-l,i+o/2-l,n)||!!Ot(e,t,s,s,a-r/2+l,i+o/2-l,n))}}},fl.registerNodeShapes=function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",At(3,0)),this.generateRoundPolygon("round-triangle",At(3,0)),this.generatePolygon("rectangle",At(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",At(5,0)),this.generateRoundPolygon("round-pentagon",At(5,0)),this.generatePolygon("hexagon",At(6,0)),this.generateRoundPolygon("round-hexagon",At(6,0)),this.generatePolygon("heptagon",At(7,0)),this.generateRoundPolygon("round-heptagon",At(7,0)),this.generatePolygon("octagon",At(8,0)),this.generateRoundPolygon("round-octagon",At(8,0));var r=new Array(20),o=Lt(5,0),a=Lt(5,Math.PI/5),i=.5*(3-Math.sqrt(5));i*=1.57;for(var l=0;l=e.deqFastCost*v)break}else if(o){if(p>=e.deqCost*s||p>=e.deqAvgCost*l)break}else if(h>=e.deqNoDrawCost*gl)break;var g=e.deq(t,f,c);if(!(g.length>0))break;for(var m=0;m0&&(e.onDeqd(t,u),!o&&e.shouldRedraw(t,u,f,c)&&r())}),o(t))}}},yl=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:xe;v(this,e),this.idsByKey=new Ae,this.keyForId=new Ae,this.cachesByLvl=new Ae,this.lvls=[],this.getKey=t,this.doesEleInvalidateKey=n}return m(e,[{key:"getIdsFor",value:function(e){null==e&&ke("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new Le,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new Ae,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach((function(n){return t.deleteCache(e,n)}))}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}]),e}(),bl={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},xl=Te({getKey:null,doesEleInvalidateKey:xe,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:be,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),wl=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=xl(t);X(n,r),n.lookup=new yl(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},El=wl.prototype;El.reasons=bl,El.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},El.getRetiredTextureQueue=function(e){var t=this.eleImgCaches.retired=this.eleImgCaches.retired||{};return t[e]=t[e]||[]},El.getElementQueue=function(){return this.eleCacheQueue=this.eleCacheQueue||new c.default((function(e,t){return t.reqs-e.reqs}))},El.getElementKeyToQueue=function(){return this.eleKeyToCacheQueue=this.eleKeyToCacheQueue||{}},El.getElement=function(e,t,n,r,o){var a=this,i=this.renderer,l=i.cy.zoom(),s=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!a.allowEdgeTxrCaching&&e.isEdge()||!a.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(ot(l*n))),r<-4)r=-4;else if(l>=7.99||r>3)return null;var u=Math.pow(2,r),c=t.h*u,f=t.w*u,d=i.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,d))return null;var p,h=s.get(e,r);if(h&&h.invalidated&&(h.invalidated=!1,h.texture.invalidatedWidth-=h.width),h)return h;if(p=c<=25?25:c<=50?50:50*Math.ceil(c/50),c>1024||f>1024)return null;var v=a.getTextureQueue(p),g=v[v.length-2],m=function(){return a.recycleTexture(p,f)||a.addTexture(p,f)};g||(g=v[v.length-1]),g||(g=m()),g.width-g.usedWidthr;N--)S=a.getElement(e,t,n,N,bl.downscale);_()}else{var P;if(!x&&!w&&!E)for(var O=r-1;O>=-4;O--){var T=s.get(e,O);if(T){P=T;break}}if(b(P))return a.queueElement(e,r),P;g.context.translate(g.usedWidth,0),g.context.scale(u,u),this.drawElement(g.context,e,t,d,!1),g.context.scale(1/u,1/u),g.context.translate(-g.usedWidth,0)}return h={x:g.usedWidth,texture:g,level:r,scale:u,width:f,height:c,scaledLabelShown:d},g.usedWidth+=Math.ceil(f+8),g.eleCaches.push(h),s.set(e,r,h),a.checkTextureFullness(g),h},El.invalidateElements=function(e){for(var t=0;t=.2*e.width&&this.retireTexture(e)},El.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>.8&&e.fullnessChecks>=10?Me(t,e):e.fullnessChecks++},El.retireTexture=function(e){var t=e.height,n=this.getTextureQueue(t),r=this.lookup;Me(n,e),e.retired=!0;for(var o=e.eleCaches,a=0;a=t)return a.retired=!1,a.usedWidth=0,a.invalidatedWidth=0,a.fullnessChecks=0,Ie(a.eleCaches),a.context.setTransform(1,0,0,1,0,0),a.context.clearRect(0,0,a.width,a.height),Me(r,a),n.push(a),a}},El.queueElement=function(e,t){var n=this.getElementQueue(),r=this.getElementKeyToQueue(),o=this.getKey(e),a=r[o];if(a)a.level=Math.max(a.level,t),a.eles.merge(e),a.reqs++,n.updateItem(a);else{var i={eles:e.spawn().merge(e),level:t,reqs:1,key:o};n.push(i),r[o]=i}},El.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),o=[],a=t.lookup,i=0;i<1&&n.size()>0;i++){var l=n.pop(),s=l.key,u=l.eles[0],c=a.hasCache(u,l.level);if(r[s]=null,!c){o.push(l);var f=t.getBoundingBox(u);t.getElement(u,f,e,l.level,bl.dequeue)}}return o},El.removeFromQueue=function(e){var t=this.getElementQueue(),n=this.getElementKeyToQueue(),r=this.getKey(e),o=n[r];null!=o&&(1===o.eles.length?(o.reqs=ye,t.updateItem(o),t.pop(),n[r]=null):o.eles.unmerge(e))},El.onDequeue=function(e){this.onDequeues.push(e)},El.offDequeue=function(e){Me(this.onDequeues,e)},El.setupDequeueing=ml({deqRedrawThreshold:100,deqCost:.15,deqAvgCost:.1,deqNoDrawCost:.9,deqFastCost:.9,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n=3.99||n>2)return null;r.validateLayersElesOrdering(n,e);var i,l,s=r.layersByLevel,u=Math.pow(2,n),c=s[n]=s[n]||[];if(r.levelIsComplete(n,e))return c;!function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return l=s[t],!0},o=function(e){if(!l)for(var r=n+e;-4<=r&&r<=2&&!t(r);r+=e);};o(1),o(-1);for(var a=c.length-1;a>=0;a--){var i=c[a];i.invalid&&Me(c,i)}}();var f=function(t){var o=(t=t||{}).after;if(function(){if(!i){i=dt();for(var t=0;t16e6)return null;var a=r.makeLayer(i,n);if(null!=o){var l=c.indexOf(o)+1;c.splice(l,0,a)}else(void 0===t.insert||t.insert)&&c.unshift(a);return a};if(r.skipping&&!a)return null;for(var d=null,p=e.length/1,h=!a,v=0;v=p||!bt(d.bb,g.boundingBox()))&&!(d=f({insert:!0,after:d})))return null;l||h?r.queueLayer(d,g):r.drawEleInLayer(d,g,n,t),d.eles.push(g),y[n]=d}}return l||(h?null:c)},Cl.getEleLevelForLayerLevel=function(e,t){return e},Cl.drawEleInLayer=function(e,t,n,r){var o=this.renderer,a=e.context,i=t.boundingBox();0!==i.w&&0!==i.h&&t.visible()&&(n=this.getEleLevelForLayerLevel(n,r),o.setImgSmoothing(a,!1),o.drawCachedElement(a,t,null,null,n,true),o.setImgSmoothing(a,!0))},Cl.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,o=0;o0)return!1;if(a.invalid)return!1;r+=a.eles.length}return r===t.length},Cl.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r0){e=!0;break}}return e},Cl.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=re(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,(function(e,n,r){t.invalidateLayer(e)})))},Cl.invalidateLayer=function(e){if(this.lastInvalidationTime=re(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];Me(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var o=0;o3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],i=this,l=t._private.rscratch;if((!a||t.visible())&&!l.badLine&&null!=l.allpts&&!isNaN(l.allpts[0])){var s;n&&(s=n,e.translate(-s.x1,-s.y1));var u=a?t.pstyle("opacity").value:1,c=a?t.pstyle("line-opacity").value:1,f=t.pstyle("curve-style").value,d=t.pstyle("line-style").value,p=t.pstyle("width").pfValue,h=t.pstyle("line-cap").value,v=u*c,g=u*c,m=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v;"straight-triangle"===f?(i.eleStrokeStyle(e,t,n),i.drawEdgeTrianglePath(t,e,l.allpts)):(e.lineWidth=p,e.lineCap=h,i.eleStrokeStyle(e,t,n),i.drawEdgePath(t,e,l.allpts,d),e.lineCap="butt")},y=function(){o&&i.drawEdgeOverlay(e,t)},b=function(){o&&i.drawEdgeUnderlay(e,t)},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g;i.drawArrowheads(e,t,n)},w=function(){i.drawElementText(e,t,null,r)};e.lineJoin="round";var E="yes"===t.pstyle("ghost").value;if(E){var k=t.pstyle("ghost-offset-x").pfValue,C=t.pstyle("ghost-offset-y").pfValue,S=t.pstyle("ghost-opacity").value,_=v*S;e.translate(k,C),m(_),x(_),e.translate(-k,-C)}b(),m(),x(),y(),w(),n&&e.translate(s.x1,s.y1)}}},Kl=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var o=this,a=o.usePaths(),i=n._private.rscratch,l=2*n.pstyle("".concat(e,"-padding")).pfValue,s=n.pstyle("".concat(e,"-color")).value;t.lineWidth=l,"self"!==i.edgeType||a?t.lineCap="round":t.lineCap="butt",o.colorStrokeStyle(t,s[0],s[1],s[2],r),o.drawEdgePath(n,t,i.allpts,"solid")}}}};Vl.drawEdgeOverlay=Kl("overlay"),Vl.drawEdgeUnderlay=Kl("underlay"),Vl.drawEdgePath=function(e,t,n,r){var o,a=e._private.rscratch,i=t,l=!1,s=this.usePaths(),u=e.pstyle("line-dash-pattern").pfValue,c=e.pstyle("line-dash-offset").pfValue;if(s){var f=n.join("$");a.pathCacheKey&&a.pathCacheKey===f?(o=t=a.pathCache,l=!0):(o=t=new Path2D,a.pathCacheKey=f,a.pathCache=o)}if(i.setLineDash)switch(r){case"dotted":i.setLineDash([1,1]);break;case"dashed":i.setLineDash(u),i.lineDashOffset=c;break;case"solid":i.setLineDash([])}if(!l&&!a.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),a.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var d=2;d+35&&void 0!==arguments[5]?arguments[5]:5;e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.quadraticCurveTo(t+r,n,t+r,n+a),e.lineTo(t+r,n+o-a),e.quadraticCurveTo(t+r,n+o,t+r-a,n+o),e.lineTo(t+a,n+o),e.quadraticCurveTo(t,n+o,t,n+o-a),e.lineTo(t,n+a),e.quadraticCurveTo(t,n,t+a,n),e.closePath(),e.fill()}Wl.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),o=Math.ceil(ot(n*r));t=Math.pow(2,o)}return!(e.pstyle("font-size").pfValue*t5&&void 0!==arguments[5])||arguments[5],i=this;if(null==r){if(a&&!i.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var l=t.pstyle("label");if(!l||!l.value)return;var s=i.getLabelJustification(t);e.textAlign=s,e.textBaseline="bottom"}else{var u=t.element()._private.rscratch.badLine,c=t.pstyle("label"),f=t.pstyle("source-label"),d=t.pstyle("target-label");if(u||(!c||!c.value)&&(!f||!f.value)&&(!d||!d.value))return;e.textAlign="center",e.textBaseline="bottom"}var p,h=!n;n&&(p=n,e.translate(-p.x1,-p.y1)),null==o?(i.drawText(e,t,null,h,a),t.isEdge()&&(i.drawText(e,t,"source",h,a),i.drawText(e,t,"target",h,a))):i.drawText(e,t,o,h,a),n&&e.translate(p.x1,p.y1)},Wl.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,o=t.pstyle("font-size").pfValue+"px",a=t.pstyle("font-family").strValue,i=t.pstyle("font-weight").strValue,l=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,s=t.pstyle("text-outline-opacity").value*l,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+i+" "+o+" "+a,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],l),this.colorStrokeStyle(e,c[0],c[1],c[2],s)},Wl.getTextAngle=function(e,t){var n=e._private.rscratch,r=t?t+"-":"",o=e.pstyle(r+"text-rotation"),a=De(n,"labelAngle",t);return"autorotate"===o.strValue?e.isEdge()?a:0:"none"===o.strValue?0:o.pfValue},Wl.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=t._private,i=a.rscratch,l=o?t.effectiveOpacity():1;if(!o||0!==l&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,u,c=De(i,"labelX",n),f=De(i,"labelY",n),d=this.getLabelText(t,n);if(null!=d&&""!==d&&!isNaN(c)&&!isNaN(f)){this.setupTextStyle(e,t,o);var p,h=n?n+"-":"",v=De(i,"labelWidth",n),g=De(i,"labelHeight",n),m=t.pstyle(h+"text-margin-x").pfValue,y=t.pstyle(h+"text-margin-y").pfValue,b=t.isEdge(),x=t.pstyle("text-halign").value,w=t.pstyle("text-valign").value;switch(b&&(x="center",w="center"),c+=m,f+=y,0!==(p=r?this.getTextAngle(t,n):0)&&(s=c,u=f,e.translate(s,u),e.rotate(p),c=0,f=0),w){case"top":break;case"center":f+=g/2;break;case"bottom":f+=g}var E=t.pstyle("text-background-opacity").value,k=t.pstyle("text-border-opacity").value,C=t.pstyle("text-border-width").pfValue,S=t.pstyle("text-background-padding").pfValue;if(E>0||C>0&&k>0){var _=c-S;switch(x){case"left":_-=v;break;case"center":_-=v/2}var N=f-g-S,P=v+2*S,O=g+2*S;if(E>0){var T=e.fillStyle,M=t.pstyle("text-background-color").value;e.fillStyle="rgba("+M[0]+","+M[1]+","+M[2]+","+E*l+")";var I=t.pstyle("text-background-shape").strValue;0===I.indexOf("round")?ql(e,_,N,P,O,2):e.fillRect(_,N,P,O),e.fillStyle=T}if(C>0&&k>0){var D=e.strokeStyle,R=e.lineWidth,A=t.pstyle("text-border-color").value,j=t.pstyle("text-border-style").value;if(e.strokeStyle="rgba("+A[0]+","+A[1]+","+A[2]+","+k*l+")",e.lineWidth=C,e.setLineDash)switch(j){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=C/4,e.setLineDash([]);break;case"solid":e.setLineDash([])}if(e.strokeRect(_,N,P,O),"double"===j){var L=C/2;e.strokeRect(_+L,N+L,P-2*L,O-2*L)}e.setLineDash&&e.setLineDash([]),e.lineWidth=R,e.strokeStyle=D}}var z=2*t.pstyle("text-outline-width").pfValue;if(z>0&&(e.lineWidth=z),"wrap"===t.pstyle("text-wrap").value){var F=De(i,"labelWrapCachedLines",n),B=De(i,"labelLineHeight",n),V=v/2,K=this.getLabelJustification(t);switch("auto"===K||("left"===x?"left"===K?c+=-v:"center"===K&&(c+=-V):"center"===x?"left"===K?c+=-V:"right"===K&&(c+=V):"right"===x&&("center"===K?c+=V:"right"===K&&(c+=v))),w){case"top":case"center":case"bottom":f-=(F.length-1)*B}for(var H=0;H0&&e.strokeText(F[H],c,f),e.fillText(F[H],c,f),f+=B}else z>0&&e.strokeText(d,c,f),e.fillText(d,c,f);0!==p&&(e.rotate(-p),e.translate(-s,-u))}}};var Ul={drawNode:function(e,t,n){var r,o,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],l=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],s=this,u=t._private,c=u.rscratch,f=t.position();if(I(f.x)&&I(f.y)&&(!l||t.visible())){var d,p,h=l?t.effectiveOpacity():1,v=s.usePaths(),g=!1,m=t.padding();r=t.width()+2*m,o=t.height()+2*m,n&&(p=n,e.translate(-p.x1,-p.y1));for(var y=t.pstyle("background-image"),b=y.value,x=new Array(b.length),w=new Array(b.length),E=0,k=0;k0&&void 0!==arguments[0]?arguments[0]:O;s.eleFillStyle(e,t,n)},A=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:D;s.colorStrokeStyle(e,T[0],T[1],T[2],t)},j=t.pstyle("shape").strValue,L=t.pstyle("shape-polygon-points").pfValue;if(v){e.translate(f.x,f.y);var z=s.nodePathCache=s.nodePathCache||[],F=pe("polygon"===j?j+","+L.join(","):j,""+o,""+r),B=z[F];null!=B?(d=B,g=!0,c.pathCache=d):(d=new Path2D,z[F]=c.pathCache=d)}var V=function(){if(!g){var n=f;v&&(n={x:0,y:0}),s.nodeShapes[s.getNodeShape(t)].draw(d||e,n.x,n.y,r,o)}v?e.fill(d):e.fill()},K=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:h,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=u.backgrounding,a=0,i=0;i0&&void 0!==arguments[0]&&arguments[0],a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:h;s.hasPie(t)&&(s.drawPie(e,t,a),n&&(v||s.nodeShapes[s.getNodeShape(t)].draw(e,f.x,f.y,r,o)))},W=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:h,n=(N>0?N:-N)*t,r=N>0?0:255;0!==N&&(s.colorFillStyle(e,r,r,r,n),v?e.fill(d):e.fill())},q=function(){if(P>0){if(e.lineWidth=P,e.lineCap="butt",e.setLineDash)switch(M){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}if(v?e.stroke(d):e.stroke(),"double"===M){e.lineWidth=P/3;var t=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",v?e.stroke(d):e.stroke(),e.globalCompositeOperation=t}e.setLineDash&&e.setLineDash([])}},U=function(){i&&s.drawNodeOverlay(e,t,f,r,o)},Y=function(){i&&s.drawNodeUnderlay(e,t,f,r,o)},X=function(){s.drawElementText(e,t,null,a)},$="yes"===t.pstyle("ghost").value;if($){var G=t.pstyle("ghost-offset-x").pfValue,Q=t.pstyle("ghost-offset-y").pfValue,Z=t.pstyle("ghost-opacity").value,J=Z*h;e.translate(G,Q),R(Z*O),V(),K(J,!0),A(Z*D),q(),H(0!==N||0!==P),K(J,!1),W(J),e.translate(-G,-Q)}v&&e.translate(-f.x,-f.y),Y(),v&&e.translate(f.x,f.y),R(),V(),K(h,!0),A(),q(),H(0!==N||0!==P),K(h,!1),W(),v&&e.translate(-f.x,-f.y),X(),U(),n&&e.translate(p.x1,p.y1)}}},Yl=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n,r,o,a){if(n.visible()){var i=n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-opacity")).value,s=n.pstyle("".concat(e,"-color")).value,u=n.pstyle("".concat(e,"-shape")).value;if(l>0){if(r=r||n.position(),null==o||null==a){var c=n.padding();o=n.width()+2*c,a=n.height()+2*c}this.colorFillStyle(t,s[0],s[1],s[2],l),this.nodeShapes[u].draw(t,r.x,r.y,o+2*i,a+2*i),t.fill()}}}};Ul.drawNodeOverlay=Yl("overlay"),Ul.drawNodeUnderlay=Yl("underlay"),Ul.hasPie=function(e){return(e=e[0])._private.hasPie},Ul.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var o=t.cy().style(),a=t.pstyle("pie-size"),i=r.x,l=r.y,s=t.width(),u=t.height(),c=Math.min(s,u)/2,f=0;this.usePaths()&&(i=0,l=0),"%"===a.units?c*=a.pfValue:void 0!==a.pfValue&&(c=a.pfValue/2);for(var d=1;d<=o.pieBackgroundN;d++){var p=t.pstyle("pie-"+d+"-background-size").value,h=t.pstyle("pie-"+d+"-background-color").value,v=t.pstyle("pie-"+d+"-background-opacity").value*n,g=p/100;g+f>1&&(g=1-f);var m=1.5*Math.PI+2*Math.PI*f,y=m+2*Math.PI*g;0===p||f>=1||f+g>1||(e.beginPath(),e.moveTo(i,l),e.arc(i,l,c,m,y),e.closePath(),this.colorFillStyle(e,h[0],h[1],h[2],v),e.fill(),f+=g)}};var Xl={};Xl.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},Xl.paintCache=function(e){for(var t,n=this.paintCaches=this.paintCaches||[],r=!0,o=0;oi.minMbLowQualFrames&&(i.motionBlurPxRatio=i.mbPxRBlurry)),i.clearingMotionBlur&&(i.motionBlurPxRatio=1),i.textureDrawLastFrame&&!f&&(c[i.NODE]=!0,c[i.SELECT_BOX]=!0);var y=s.style(),b=s.zoom(),x=void 0!==o?o:b,w=s.pan(),E={x:w.x,y:w.y},k={zoom:b,pan:{x:w.x,y:w.y}},C=i.prevViewport;void 0===C||k.zoom!==C.zoom||k.pan.x!==C.pan.x||k.pan.y!==C.pan.y||v&&!h||(i.motionBlurPxRatio=1),a&&(E=a),x*=l,E.x*=l,E.y*=l;var S=i.getCachedZSortedEles();function _(e,t,n,r,o){var a=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",i.colorFillStyle(e,255,255,255,i.motionBlurTransparency),e.fillRect(t,n,r,o),e.globalCompositeOperation=a}function N(e,r){var l,s,c,f;i.clearingMotionBlur||e!==u.bufferContexts[i.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[i.MOTIONBLUR_BUFFER_DRAG]?(l=E,s=x,c=i.canvasWidth,f=i.canvasHeight):(l={x:w.x*p,y:w.y*p},s=b*p,c=i.canvasWidth*p,f=i.canvasHeight*p),e.setTransform(1,0,0,1,0,0),"motionBlur"===r?_(e,0,0,c,f):t||void 0!==r&&!r||e.clearRect(0,0,c,f),n||(e.translate(l.x,l.y),e.scale(s,s)),a&&e.translate(a.x,a.y),o&&e.scale(o,o)}if(f||(i.textureDrawLastFrame=!1),f){if(i.textureDrawLastFrame=!0,!i.textureCache){i.textureCache={},i.textureCache.bb=s.mutableElements().boundingBox(),i.textureCache.texture=i.data.bufferCanvases[i.TEXTURE_BUFFER];var P=i.data.bufferContexts[i.TEXTURE_BUFFER];P.setTransform(1,0,0,1,0,0),P.clearRect(0,0,i.canvasWidth*i.textureMult,i.canvasHeight*i.textureMult),i.render({forcedContext:P,drawOnlyNodeLayer:!0,forcedPxRatio:l*i.textureMult}),(k=i.textureCache.viewport={zoom:s.zoom(),pan:s.pan(),width:i.canvasWidth,height:i.canvasHeight}).mpan={x:(0-k.pan.x)/k.zoom,y:(0-k.pan.y)/k.zoom}}c[i.DRAG]=!1,c[i.NODE]=!1;var O=u.contexts[i.NODE],T=i.textureCache.texture;k=i.textureCache.viewport;O.setTransform(1,0,0,1,0,0),d?_(O,0,0,k.width,k.height):O.clearRect(0,0,k.width,k.height);var M=y.core("outside-texture-bg-color").value,I=y.core("outside-texture-bg-opacity").value;i.colorFillStyle(O,M[0],M[1],M[2],I),O.fillRect(0,0,k.width,k.height);b=s.zoom();N(O,!1),O.clearRect(k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l),O.drawImage(T,k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l)}else i.textureOnViewport&&!t&&(i.textureCache=null);var D=s.extent(),R=i.pinching||i.hoverData.dragging||i.swipePanning||i.data.wheelZooming||i.hoverData.draggingEles||i.cy.animated(),A=i.hideEdgesOnViewport&&R,j=[];if(j[i.NODE]=!c[i.NODE]&&d&&!i.clearedForMotionBlur[i.NODE]||i.clearingMotionBlur,j[i.NODE]&&(i.clearedForMotionBlur[i.NODE]=!0),j[i.DRAG]=!c[i.DRAG]&&d&&!i.clearedForMotionBlur[i.DRAG]||i.clearingMotionBlur,j[i.DRAG]&&(i.clearedForMotionBlur[i.DRAG]=!0),c[i.NODE]||n||r||j[i.NODE]){var L=d&&!j[i.NODE]&&1!==p;N(O=t||(L?i.data.bufferContexts[i.MOTIONBLUR_BUFFER_NODE]:u.contexts[i.NODE]),d&&!L?"motionBlur":void 0),A?i.drawCachedNodes(O,S.nondrag,l,D):i.drawLayeredElements(O,S.nondrag,l,D),i.debug&&i.drawDebugPoints(O,S.nondrag),n||d||(c[i.NODE]=!1)}if(!r&&(c[i.DRAG]||n||j[i.DRAG])){L=d&&!j[i.DRAG]&&1!==p;N(O=t||(L?i.data.bufferContexts[i.MOTIONBLUR_BUFFER_DRAG]:u.contexts[i.DRAG]),d&&!L?"motionBlur":void 0),A?i.drawCachedNodes(O,S.drag,l,D):i.drawCachedElements(O,S.drag,l,D),i.debug&&i.drawDebugPoints(O,S.drag),n||d||(c[i.DRAG]=!1)}if(i.showFps||!r&&c[i.SELECT_BOX]&&!n){if(N(O=t||u.contexts[i.SELECT_BOX]),1==i.selection[4]&&(i.hoverData.selecting||i.touchData.selecting)){b=i.cy.zoom();var z=y.core("selection-box-border-width").value/b;O.lineWidth=z,O.fillStyle="rgba("+y.core("selection-box-color").value[0]+","+y.core("selection-box-color").value[1]+","+y.core("selection-box-color").value[2]+","+y.core("selection-box-opacity").value+")",O.fillRect(i.selection[0],i.selection[1],i.selection[2]-i.selection[0],i.selection[3]-i.selection[1]),z>0&&(O.strokeStyle="rgba("+y.core("selection-box-border-color").value[0]+","+y.core("selection-box-border-color").value[1]+","+y.core("selection-box-border-color").value[2]+","+y.core("selection-box-opacity").value+")",O.strokeRect(i.selection[0],i.selection[1],i.selection[2]-i.selection[0],i.selection[3]-i.selection[1]))}if(u.bgActivePosistion&&!i.hoverData.selecting){b=i.cy.zoom();var F=u.bgActivePosistion;O.fillStyle="rgba("+y.core("active-bg-color").value[0]+","+y.core("active-bg-color").value[1]+","+y.core("active-bg-color").value[2]+","+y.core("active-bg-opacity").value+")",O.beginPath(),O.arc(F.x,F.y,y.core("active-bg-size").pfValue/b,0,2*Math.PI),O.fill()}var B=i.lastRedrawTime;if(i.showFps&&B){B=Math.round(B);var V=Math.round(1e3/B);O.setTransform(1,0,0,1,0,0),O.fillStyle="rgba(255, 0, 0, 0.75)",O.strokeStyle="rgba(255, 0, 0, 0.75)",O.lineWidth=1,O.fillText("1 frame = "+B+" ms = "+V+" fps",0,20);O.strokeRect(0,30,250,20),O.fillRect(0,30,250*Math.min(V/60,1),20)}n||(c[i.SELECT_BOX]=!1)}if(d&&1!==p){var K=u.contexts[i.NODE],H=i.data.bufferCanvases[i.MOTIONBLUR_BUFFER_NODE],W=u.contexts[i.DRAG],q=i.data.bufferCanvases[i.MOTIONBLUR_BUFFER_DRAG],U=function(e,t,n){e.setTransform(1,0,0,1,0,0),n||!m?e.clearRect(0,0,i.canvasWidth,i.canvasHeight):_(e,0,0,i.canvasWidth,i.canvasHeight);var r=p;e.drawImage(t,0,0,i.canvasWidth*r,i.canvasHeight*r,0,0,i.canvasWidth,i.canvasHeight)};(c[i.NODE]||j[i.NODE])&&(U(K,H,j[i.NODE]),c[i.NODE]=!1),(c[i.DRAG]||j[i.DRAG])&&(U(W,q,j[i.DRAG]),c[i.DRAG]=!1)}i.prevViewport=k,i.clearingMotionBlur&&(i.clearingMotionBlur=!1,i.motionBlurCleared=!0,i.motionBlur=!0),d&&(i.motionBlurTimeout=setTimeout((function(){i.motionBlurTimeout=null,i.clearedForMotionBlur[i.NODE]=!1,i.clearedForMotionBlur[i.DRAG]=!1,i.motionBlur=!1,i.clearingMotionBlur=!f,i.mbFrames=0,c[i.NODE]=!0,c[i.DRAG]=!0,i.redraw()}),100)),t||s.emit("render")};for(var $l={drawPolygonPath:function(e,t,n,r,o,a){var i=r/2,l=o/2;e.beginPath&&e.beginPath(),e.moveTo(t+i*a[0],n+l*a[1]);for(var s=1;s0&&a>0){d.clearRect(0,0,o,a),d.globalCompositeOperation="source-over";var p=this.getCachedZSortedEles();if(e.full)d.translate(-n.x1*s,-n.y1*s),d.scale(s,s),this.drawElements(d,p),d.scale(1/s,1/s),d.translate(n.x1*s,n.y1*s);else{var h=t.pan(),v={x:h.x*s,y:h.y*s};s*=t.zoom(),d.translate(v.x,v.y),d.scale(s,s),this.drawElements(d,p),d.scale(1/s,1/s),d.translate(-v.x,-v.y)}e.bg&&(d.globalCompositeOperation="destination-over",d.fillStyle=e.bg,d.rect(0,0,o,a),d.fill())}return f},ns.png=function(e){return os(e,this.bufferCanvasImage(e),"image/png")},ns.jpg=function(e){return os(e,this.bufferCanvasImage(e),"image/jpeg")};var as={nodeShapeImpl:function(e,t,n,r,o,a,i){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,o,a);case"polygon":return this.drawPolygonPath(t,n,r,o,a,i);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,o,a,i);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,o,a);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,o,a);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,o,a);case"barrel":return this.drawBarrelPath(t,n,r,o,a)}}},is=ss,ls=ss.prototype;function ss(e){var t=this;t.data={canvases:new Array(ls.CANVAS_LAYERS),contexts:new Array(ls.CANVAS_LAYERS),canvasNeedsRedraw:new Array(ls.CANVAS_LAYERS),bufferCanvases:new Array(ls.BUFFER_COUNT),bufferContexts:new Array(ls.CANVAS_LAYERS)};var n="-webkit-tap-highlight-color",r="rgba(0,0,0,0)";t.data.canvasContainer=document.createElement("div");var o=t.data.canvasContainer.style;t.data.canvasContainer.style[n]=r,o.position="relative",o.zIndex="0",o.overflow="hidden";var a=e.cy.container();a.appendChild(t.data.canvasContainer),a.style[n]=r;var i={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};E&&E.userAgent.match(/msie|trident|edge/i)&&(i["-ms-touch-action"]="none",i["touch-action"]="none");for(var l=0;l{e.exports={graphlib:n(2990),layout:n(6456),debug:n(7920),util:{time:n(8392).time,notime:n(8392).notime},version:n(6206)}},2212:(e,t,n)=>{"use strict";var r=n(8899),o=n(3857);e.exports={run:function(e){var t="greedy"===e.graph().acyclicer?o(e,function(e){return function(t){return e.edge(t).weight}}(e)):function(e){var t=[],n={},o={};function a(i){r.has(o,i)||(o[i]=!0,n[i]=!0,r.forEach(e.outEdges(i),(function(e){r.has(n,e.w)?t.push(e):a(e.w)})),delete n[i])}return r.forEach(e.nodes(),a),t}(e);r.forEach(t,(function(t){var n=e.edge(t);e.removeEdge(t),n.forwardName=t.name,n.reversed=!0,e.setEdge(t.w,t.v,n,r.uniqueId("rev"))}))},undo:function(e){r.forEach(e.edges(),(function(t){var n=e.edge(t);if(n.reversed){e.removeEdge(t);var r=n.forwardName;delete n.reversed,delete n.forwardName,e.setEdge(t.w,t.v,n,r)}}))}}},4093:(e,t,n)=>{var r=n(8899),o=n(8392);function a(e,t,n,r,a,i){var l={width:0,height:0,rank:i,borderType:t},s=a[t][i-1],u=o.addDummyNode(e,"border",l,n);a[t][i]=u,e.setParent(u,r),s&&e.setEdge(s,u,{weight:1})}e.exports=function(e){r.forEach(e.children(),(function t(n){var o=e.children(n),i=e.node(n);if(o.length&&r.forEach(o,t),r.has(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var l=i.minRank,s=i.maxRank+1;l{"use strict";var r=n(8899);function o(e){r.forEach(e.nodes(),(function(t){a(e.node(t))})),r.forEach(e.edges(),(function(t){a(e.edge(t))}))}function a(e){var t=e.width;e.width=e.height,e.height=t}function i(e){e.y=-e.y}function l(e){var t=e.x;e.x=e.y,e.y=t}e.exports={adjust:function(e){var t=e.graph().rankdir.toLowerCase();"lr"!==t&&"rl"!==t||o(e)},undo:function(e){var t=e.graph().rankdir.toLowerCase();"bt"!==t&&"rl"!==t||function(e){r.forEach(e.nodes(),(function(t){i(e.node(t))})),r.forEach(e.edges(),(function(t){var n=e.edge(t);r.forEach(n.points,i),r.has(n,"y")&&i(n)}))}(e);"lr"!==t&&"rl"!==t||(!function(e){r.forEach(e.nodes(),(function(t){l(e.node(t))})),r.forEach(e.edges(),(function(t){var n=e.edge(t);r.forEach(n.points,l),r.has(n,"x")&&l(n)}))}(e),o(e))}}},5639:e=>{function t(){var e={};e._next=e._prev=e,this._sentinel=e}function n(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function r(e,t){if("_next"!==e&&"_prev"!==e)return t}e.exports=t,t.prototype.dequeue=function(){var e=this._sentinel,t=e._prev;if(t!==e)return n(t),t},t.prototype.enqueue=function(e){var t=this._sentinel;e._prev&&e._next&&n(e),e._next=t._next,t._next._prev=e,t._next=e,e._prev=t},t.prototype.toString=function(){for(var e=[],t=this._sentinel,n=t._prev;n!==t;)e.push(JSON.stringify(n,r)),n=n._prev;return"["+e.join(", ")+"]"}},7920:(e,t,n)=>{var r=n(8899),o=n(8392),a=n(2990).Graph;e.exports={debugOrdering:function(e){var t=o.buildLayerMatrix(e),n=new a({compound:!0,multigraph:!0}).setGraph({});return r.forEach(e.nodes(),(function(t){n.setNode(t,{label:t}),n.setParent(t,"layer"+e.node(t).rank)})),r.forEach(e.edges(),(function(e){n.setEdge(e.v,e.w,{},e.name)})),r.forEach(t,(function(e,t){var o="layer"+t;n.setNode(o,{rank:"same"}),r.reduce(e,(function(e,t){return n.setEdge(e,t,{style:"invis"}),t}))})),n}}},2990:(e,t,n)=>{var r;try{r=n(6118)}catch(o){}r||(r=window.graphlib),e.exports=r},3857:(e,t,n)=>{var r=n(8899),o=n(2990).Graph,a=n(5639);e.exports=function(e,t){if(e.nodeCount()<=1)return[];var n=function(e,t){var n=new o,i=0,l=0;r.forEach(e.nodes(),(function(e){n.setNode(e,{v:e,in:0,out:0})})),r.forEach(e.edges(),(function(e){var r=n.edge(e.v,e.w)||0,o=t(e),a=r+o;n.setEdge(e.v,e.w,a),l=Math.max(l,n.node(e.v).out+=o),i=Math.max(i,n.node(e.w).in+=o)}));var u=r.range(l+i+3).map((function(){return new a})),c=i+1;return r.forEach(n.nodes(),(function(e){s(u,c,n.node(e))})),{graph:n,buckets:u,zeroIdx:c}}(e,t||i),u=function(e,t,n){var r,o=[],a=t[t.length-1],i=t[0];for(;e.nodeCount();){for(;r=i.dequeue();)l(e,t,n,r);for(;r=a.dequeue();)l(e,t,n,r);if(e.nodeCount())for(var s=t.length-2;s>0;--s)if(r=t[s].dequeue()){o=o.concat(l(e,t,n,r,!0));break}}return o}(n.graph,n.buckets,n.zeroIdx);return r.flatten(r.map(u,(function(t){return e.outEdges(t.v,t.w)})),!0)};var i=r.constant(1);function l(e,t,n,o,a){var i=a?[]:void 0;return r.forEach(e.inEdges(o.v),(function(r){var o=e.edge(r),l=e.node(r.v);a&&i.push({v:r.v,w:r.w}),l.out-=o,s(t,n,l)})),r.forEach(e.outEdges(o.v),(function(r){var o=e.edge(r),a=r.w,i=e.node(a);i.in-=o,s(t,n,i)})),e.removeNode(o.v),i}function s(e,t,n){n.out?n.in?e[n.out-n.in+t].enqueue(n):e[e.length-1].enqueue(n):e[0].enqueue(n)}},6456:(e,t,n)=>{"use strict";var r=n(8899),o=n(2212),a=n(1898),i=n(6744),l=n(8392).normalizeRanks,s=n(7652),u=n(8392).removeEmptyRanks,c=n(1652),f=n(4093),d=n(5384),p=n(7348),h=n(3090),v=n(8392),g=n(2990).Graph;e.exports=function(e,t){var n=t&&t.debugTiming?v.time:v.notime;n("layout",(function(){var t=n(" buildLayoutGraph",(function(){return function(e){var t=new g({multigraph:!0,compound:!0}),n=_(e.graph());return t.setGraph(r.merge({},y,S(n,m),r.pick(n,b))),r.forEach(e.nodes(),(function(n){var o=_(e.node(n));t.setNode(n,r.defaults(S(o,x),w)),t.setParent(n,e.parent(n))})),r.forEach(e.edges(),(function(n){var o=_(e.edge(n));t.setEdge(n,r.merge({},k,S(o,E),r.pick(o,C)))})),t}(e)}));n(" runLayout",(function(){!function(e,t){t(" makeSpaceForEdgeLabels",(function(){!function(e){var t=e.graph();t.ranksep/=2,r.forEach(e.edges(),(function(n){var r=e.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===t.rankdir||"BT"===t.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(e)})),t(" removeSelfEdges",(function(){!function(e){r.forEach(e.edges(),(function(t){if(t.v===t.w){var n=e.node(t.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:t,label:e.edge(t)}),e.removeEdge(t)}}))}(e)})),t(" acyclic",(function(){o.run(e)})),t(" nestingGraph.run",(function(){c.run(e)})),t(" rank",(function(){i(v.asNonCompoundGraph(e))})),t(" injectEdgeLabelProxies",(function(){!function(e){r.forEach(e.edges(),(function(t){var n=e.edge(t);if(n.width&&n.height){var r=e.node(t.v),o={rank:(e.node(t.w).rank-r.rank)/2+r.rank,e:t};v.addDummyNode(e,"edge-proxy",o,"_ep")}}))}(e)})),t(" removeEmptyRanks",(function(){u(e)})),t(" nestingGraph.cleanup",(function(){c.cleanup(e)})),t(" normalizeRanks",(function(){l(e)})),t(" assignRankMinMax",(function(){!function(e){var t=0;r.forEach(e.nodes(),(function(n){var o=e.node(n);o.borderTop&&(o.minRank=e.node(o.borderTop).rank,o.maxRank=e.node(o.borderBottom).rank,t=r.max(t,o.maxRank))})),e.graph().maxRank=t}(e)})),t(" removeEdgeLabelProxies",(function(){!function(e){r.forEach(e.nodes(),(function(t){var n=e.node(t);"edge-proxy"===n.dummy&&(e.edge(n.e).labelRank=n.rank,e.removeNode(t))}))}(e)})),t(" normalize.run",(function(){a.run(e)})),t(" parentDummyChains",(function(){s(e)})),t(" addBorderSegments",(function(){f(e)})),t(" order",(function(){p(e)})),t(" insertSelfEdges",(function(){!function(e){var t=v.buildLayerMatrix(e);r.forEach(t,(function(t){var n=0;r.forEach(t,(function(t,o){var a=e.node(t);a.order=o+n,r.forEach(a.selfEdges,(function(t){v.addDummyNode(e,"selfedge",{width:t.label.width,height:t.label.height,rank:a.rank,order:o+ ++n,e:t.e,label:t.label},"_se")})),delete a.selfEdges}))}))}(e)})),t(" adjustCoordinateSystem",(function(){d.adjust(e)})),t(" position",(function(){h(e)})),t(" positionSelfEdges",(function(){!function(e){r.forEach(e.nodes(),(function(t){var n=e.node(t);if("selfedge"===n.dummy){var r=e.node(n.e.v),o=r.x+r.width/2,a=r.y,i=n.x-o,l=r.height/2;e.setEdge(n.e,n.label),e.removeNode(t),n.label.points=[{x:o+2*i/3,y:a-l},{x:o+5*i/6,y:a-l},{x:o+i,y:a},{x:o+5*i/6,y:a+l},{x:o+2*i/3,y:a+l}],n.label.x=n.x,n.label.y=n.y}}))}(e)})),t(" removeBorderNodes",(function(){!function(e){r.forEach(e.nodes(),(function(t){if(e.children(t).length){var n=e.node(t),o=e.node(n.borderTop),a=e.node(n.borderBottom),i=e.node(r.last(n.borderLeft)),l=e.node(r.last(n.borderRight));n.width=Math.abs(l.x-i.x),n.height=Math.abs(a.y-o.y),n.x=i.x+n.width/2,n.y=o.y+n.height/2}})),r.forEach(e.nodes(),(function(t){"border"===e.node(t).dummy&&e.removeNode(t)}))}(e)})),t(" normalize.undo",(function(){a.undo(e)})),t(" fixupEdgeLabelCoords",(function(){!function(e){r.forEach(e.edges(),(function(t){var n=e.edge(t);if(r.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(e)})),t(" undoCoordinateSystem",(function(){d.undo(e)})),t(" translateGraph",(function(){!function(e){var t=Number.POSITIVE_INFINITY,n=0,o=Number.POSITIVE_INFINITY,a=0,i=e.graph(),l=i.marginx||0,s=i.marginy||0;function u(e){var r=e.x,i=e.y,l=e.width,s=e.height;t=Math.min(t,r-l/2),n=Math.max(n,r+l/2),o=Math.min(o,i-s/2),a=Math.max(a,i+s/2)}r.forEach(e.nodes(),(function(t){u(e.node(t))})),r.forEach(e.edges(),(function(t){var n=e.edge(t);r.has(n,"x")&&u(n)})),t-=l,o-=s,r.forEach(e.nodes(),(function(n){var r=e.node(n);r.x-=t,r.y-=o})),r.forEach(e.edges(),(function(n){var a=e.edge(n);r.forEach(a.points,(function(e){e.x-=t,e.y-=o})),r.has(a,"x")&&(a.x-=t),r.has(a,"y")&&(a.y-=o)})),i.width=n-t+l,i.height=a-o+s}(e)})),t(" assignNodeIntersects",(function(){!function(e){r.forEach(e.edges(),(function(t){var n,r,o=e.edge(t),a=e.node(t.v),i=e.node(t.w);o.points?(n=o.points[0],r=o.points[o.points.length-1]):(o.points=[],n=i,r=a),o.points.unshift(v.intersectRect(a,n)),o.points.push(v.intersectRect(i,r))}))}(e)})),t(" reversePoints",(function(){!function(e){r.forEach(e.edges(),(function(t){var n=e.edge(t);n.reversed&&n.points.reverse()}))}(e)})),t(" acyclic.undo",(function(){o.undo(e)}))}(t,n)})),n(" updateInputGraph",(function(){!function(e,t){r.forEach(e.nodes(),(function(n){var r=e.node(n),o=t.node(n);r&&(r.x=o.x,r.y=o.y,t.children(n).length&&(r.width=o.width,r.height=o.height))})),r.forEach(e.edges(),(function(n){var o=e.edge(n),a=t.edge(n);o.points=a.points,r.has(a,"x")&&(o.x=a.x,o.y=a.y)})),e.graph().width=t.graph().width,e.graph().height=t.graph().height}(e,t)}))}))};var m=["nodesep","edgesep","ranksep","marginx","marginy"],y={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},b=["acyclicer","ranker","rankdir","align"],x=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},C=["labelpos"];function S(e,t){return r.mapValues(r.pick(e,t),Number)}function _(e){var t={};return r.forEach(e,(function(e,n){t[n.toLowerCase()]=e})),t}},8899:(e,t,n)=>{var r;try{r={cloneDeep:n(8121),constant:n(1547),defaults:n(6933),each:n(9430),filter:n(86),find:n(1211),flatten:n(5506),forEach:n(6514),forIn:n(9144),has:n(7805),isUndefined:n(2530),last:n(5727),map:n(2034),mapValues:n(7702),max:n(9627),merge:n(9286),min:n(6452),minBy:n(3638),now:n(72),pick:n(6460),range:n(6222),reduce:n(5080),sortBy:n(4286),uniqueId:n(804),values:n(2063),zipObject:n(4827)}}catch(o){}r||(r=window._),e.exports=r},1652:(e,t,n)=>{var r=n(8899),o=n(8392);function a(e,t,n,i,l,s,u){var c=e.children(u);if(c.length){var f=o.addBorderNode(e,"_bt"),d=o.addBorderNode(e,"_bb"),p=e.node(u);e.setParent(f,u),p.borderTop=f,e.setParent(d,u),p.borderBottom=d,r.forEach(c,(function(r){a(e,t,n,i,l,s,r);var o=e.node(r),c=o.borderTop?o.borderTop:r,p=o.borderBottom?o.borderBottom:r,h=o.borderTop?i:2*i,v=c!==p?1:l-s[u]+1;e.setEdge(f,c,{weight:h,minlen:v,nestingEdge:!0}),e.setEdge(p,d,{weight:h,minlen:v,nestingEdge:!0})})),e.parent(u)||e.setEdge(t,f,{weight:0,minlen:l+s[u]})}else u!==t&&e.setEdge(t,u,{weight:0,minlen:n})}e.exports={run:function(e){var t=o.addDummyNode(e,"root",{},"_root"),n=function(e){var t={};function n(o,a){var i=e.children(o);i&&i.length&&r.forEach(i,(function(e){n(e,a+1)})),t[o]=a}return r.forEach(e.children(),(function(e){n(e,1)})),t}(e),i=r.max(r.values(n))-1,l=2*i+1;e.graph().nestingRoot=t,r.forEach(e.edges(),(function(t){e.edge(t).minlen*=l}));var s=function(e){return r.reduce(e.edges(),(function(t,n){return t+e.edge(n).weight}),0)}(e)+1;r.forEach(e.children(),(function(r){a(e,t,l,s,i,n,r)})),e.graph().nodeRankFactor=l},cleanup:function(e){var t=e.graph();e.removeNode(t.nestingRoot),delete t.nestingRoot,r.forEach(e.edges(),(function(t){e.edge(t).nestingEdge&&e.removeEdge(t)}))}}},1898:(e,t,n)=>{"use strict";var r=n(8899),o=n(8392);e.exports={run:function(e){e.graph().dummyChains=[],r.forEach(e.edges(),(function(t){!function(e,t){var n,r,a,i=t.v,l=e.node(i).rank,s=t.w,u=e.node(s).rank,c=t.name,f=e.edge(t),d=f.labelRank;if(u===l+1)return;for(e.removeEdge(t),a=0,++l;l{var r=n(8899);e.exports=function(e,t,n){var o,a={};r.forEach(n,(function(n){for(var r,i,l=e.parent(n);l;){if((r=e.parent(l))?(i=a[r],a[r]=l):(i=o,o=l),i&&i!==l)return void t.setEdge(i,l);l=r}}))}},5213:(e,t,n)=>{var r=n(8899);e.exports=function(e,t){return r.map(t,(function(t){var n=e.inEdges(t);if(n.length){var o=r.reduce(n,(function(t,n){var r=e.edge(n),o=e.node(n.v);return{sum:t.sum+r.weight*o.order,weight:t.weight+r.weight}}),{sum:0,weight:0});return{v:t,barycenter:o.sum/o.weight,weight:o.weight}}return{v:t}}))}},1386:(e,t,n)=>{var r=n(8899),o=n(2990).Graph;e.exports=function(e,t,n){var a=function(e){var t;for(;e.hasNode(t=r.uniqueId("_root")););return t}(e),i=new o({compound:!0}).setGraph({root:a}).setDefaultNodeLabel((function(t){return e.node(t)}));return r.forEach(e.nodes(),(function(o){var l=e.node(o),s=e.parent(o);(l.rank===t||l.minRank<=t&&t<=l.maxRank)&&(i.setNode(o),i.setParent(o,s||a),r.forEach(e[n](o),(function(t){var n=t.v===o?t.w:t.v,a=i.edge(n,o),l=r.isUndefined(a)?0:a.weight;i.setEdge(n,o,{weight:e.edge(t).weight+l})})),r.has(l,"minRank")&&i.setNode(o,{borderLeft:l.borderLeft[t],borderRight:l.borderRight[t]}))})),i}},3862:(e,t,n)=>{"use strict";var r=n(8899);function o(e,t,n){for(var o=r.zipObject(n,r.map(n,(function(e,t){return t}))),a=r.flatten(r.map(t,(function(t){return r.sortBy(r.map(e.outEdges(t),(function(t){return{pos:o[t.w],weight:e.edge(t).weight}})),"pos")})),!0),i=1;i0;)t%2&&(n+=s[t+1]),s[t=t-1>>1]+=e.weight;u+=e.weight*n}))),u}e.exports=function(e,t){for(var n=0,r=1;r{"use strict";var r=n(8899),o=n(5586),a=n(3862),i=n(3616),l=n(1386),s=n(4388),u=n(2990).Graph,c=n(8392);function f(e,t,n){return r.map(t,(function(t){return l(e,t,n)}))}function d(e,t){var n=new u;r.forEach(e,(function(e){var o=e.graph().root,a=i(e,o,n,t);r.forEach(a.vs,(function(t,n){e.node(t).order=n})),s(e,n,a.vs)}))}function p(e,t){r.forEach(t,(function(t){r.forEach(t,(function(t,n){e.node(t).order=n}))}))}e.exports=function(e){var t=c.maxRank(e),n=f(e,r.range(1,t+1),"inEdges"),i=f(e,r.range(t-1,-1,-1),"outEdges"),l=o(e);p(e,l);for(var s,u=Number.POSITIVE_INFINITY,h=0,v=0;v<4;++h,++v){d(h%2?n:i,h%4>=2),l=c.buildLayerMatrix(e);var g=a(e,l);g{"use strict";var r=n(8899);e.exports=function(e){var t={},n=r.filter(e.nodes(),(function(t){return!e.children(t).length})),o=r.max(r.map(n,(function(t){return e.node(t).rank}))),a=r.map(r.range(o+1),(function(){return[]}));var i=r.sortBy(n,(function(t){return e.node(t).rank}));return r.forEach(i,(function n(o){if(r.has(t,o))return;t[o]=!0;var i=e.node(o);a[i.rank].push(o),r.forEach(e.successors(o),n)})),a}},1982:(e,t,n)=>{"use strict";var r=n(8899);e.exports=function(e,t){var n={};return r.forEach(e,(function(e,t){var o=n[e.v]={indegree:0,in:[],out:[],vs:[e.v],i:t};r.isUndefined(e.barycenter)||(o.barycenter=e.barycenter,o.weight=e.weight)})),r.forEach(t.edges(),(function(e){var t=n[e.v],o=n[e.w];r.isUndefined(t)||r.isUndefined(o)||(o.indegree++,t.out.push(n[e.w]))})),function(e){var t=[];function n(e){return function(t){t.merged||(r.isUndefined(t.barycenter)||r.isUndefined(e.barycenter)||t.barycenter>=e.barycenter)&&function(e,t){var n=0,r=0;e.weight&&(n+=e.barycenter*e.weight,r+=e.weight);t.weight&&(n+=t.barycenter*t.weight,r+=t.weight);e.vs=t.vs.concat(e.vs),e.barycenter=n/r,e.weight=r,e.i=Math.min(t.i,e.i),t.merged=!0}(e,t)}}function o(t){return function(n){n.in.push(t),0===--n.indegree&&e.push(n)}}for(;e.length;){var a=e.pop();t.push(a),r.forEach(a.in.reverse(),n(a)),r.forEach(a.out,o(a))}return r.map(r.filter(t,(function(e){return!e.merged})),(function(e){return r.pick(e,["vs","i","barycenter","weight"])}))}(r.filter(n,(function(e){return!e.indegree})))}},3616:(e,t,n)=>{var r=n(8899),o=n(5213),a=n(1982),i=n(4929);e.exports=function e(t,n,l,s){var u=t.children(n),c=t.node(n),f=c?c.borderLeft:void 0,d=c?c.borderRight:void 0,p={};f&&(u=r.filter(u,(function(e){return e!==f&&e!==d})));var h=o(t,u);r.forEach(h,(function(n){if(t.children(n.v).length){var o=e(t,n.v,l,s);p[n.v]=o,r.has(o,"barycenter")&&(a=n,i=o,r.isUndefined(a.barycenter)?(a.barycenter=i.barycenter,a.weight=i.weight):(a.barycenter=(a.barycenter*a.weight+i.barycenter*i.weight)/(a.weight+i.weight),a.weight+=i.weight))}var a,i}));var v=a(h,l);!function(e,t){r.forEach(e,(function(e){e.vs=r.flatten(e.vs.map((function(e){return t[e]?t[e].vs:e})),!0)}))}(v,p);var g=i(v,s);if(f&&(g.vs=r.flatten([f,g.vs,d],!0),t.predecessors(f).length)){var m=t.node(t.predecessors(f)[0]),y=t.node(t.predecessors(d)[0]);r.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+m.order+y.order)/(g.weight+2),g.weight+=2}return g}},4929:(e,t,n)=>{var r=n(8899),o=n(8392);function a(e,t,n){for(var o;t.length&&(o=r.last(t)).i<=n;)t.pop(),e.push(o.vs),n++;return n}e.exports=function(e,t){var n=o.partition(e,(function(e){return r.has(e,"barycenter")})),i=n.lhs,l=r.sortBy(n.rhs,(function(e){return-e.i})),s=[],u=0,c=0,f=0;i.sort((d=!!t,function(e,t){return e.barycentert.barycenter?1:d?t.i-e.i:e.i-t.i})),f=a(s,l,f),r.forEach(i,(function(e){f+=e.vs.length,s.push(e.vs),u+=e.barycenter*e.weight,c+=e.weight,f=a(s,l,f)}));var d;var p={vs:r.flatten(s,!0)};c&&(p.barycenter=u/c,p.weight=c);return p}},7652:(e,t,n)=>{var r=n(8899);e.exports=function(e){var t=function(e){var t={},n=0;function o(a){var i=n;r.forEach(e.children(a),o),t[a]={low:i,lim:n++}}return r.forEach(e.children(),o),t}(e);r.forEach(e.graph().dummyChains,(function(n){for(var r=e.node(n),o=r.edgeObj,a=function(e,t,n,r){var o,a,i=[],l=[],s=Math.min(t[n].low,t[r].low),u=Math.max(t[n].lim,t[r].lim);o=n;do{o=e.parent(o),i.push(o)}while(o&&(t[o].low>s||u>t[o].lim));a=o,o=r;for(;(o=e.parent(o))!==a;)l.push(o);return{path:i.concat(l.reverse()),lca:a}}(e,t,o.v,o.w),i=a.path,l=a.lca,s=0,u=i[s],c=!0;n!==o.w;){if(r=e.node(n),c){for(;(u=i[s])!==l&&e.node(u).maxRank{"use strict";var r=n(8899),o=n(2990).Graph,a=n(8392);function i(e,t){var n={};return r.reduce(t,(function(t,o){var a=0,i=0,l=t.length,u=r.last(o);return r.forEach(o,(function(t,c){var f=function(e,t){if(e.node(t).dummy)return r.find(e.predecessors(t),(function(t){return e.node(t).dummy}))}(e,t),d=f?e.node(f).order:l;(f||t===u)&&(r.forEach(o.slice(i,c+1),(function(t){r.forEach(e.predecessors(t),(function(r){var o=e.node(r),i=o.order;!(il)&&s(n,t,u)}))}))}return r.reduce(t,(function(t,n){var a,i=-1,l=0;return r.forEach(n,(function(r,s){if("border"===e.node(r).dummy){var u=e.predecessors(r);u.length&&(a=e.node(u[0]).order,o(n,l,s,i,a),l=s,i=a)}o(n,l,n.length,a,t.length)})),n})),n}function s(e,t,n){if(t>n){var r=t;t=n,n=r}var o=e[t];o||(e[t]=o={}),o[n]=!0}function u(e,t,n){if(t>n){var o=t;t=n,n=o}return r.has(e[t],n)}function c(e,t,n,o){var a={},i={},l={};return r.forEach(t,(function(e){r.forEach(e,(function(e,t){a[e]=e,i[e]=e,l[e]=t}))})),r.forEach(t,(function(e){var t=-1;r.forEach(e,(function(e){var s=o(e);if(s.length){s=r.sortBy(s,(function(e){return l[e]}));for(var c=(s.length-1)/2,f=Math.floor(c),d=Math.ceil(c);f<=d;++f){var p=s[f];i[e]===e&&t{"use strict";var r=n(8899),o=n(8392),a=n(6137).positionX;e.exports=function(e){(function(e){var t=o.buildLayerMatrix(e),n=e.graph().ranksep,a=0;r.forEach(t,(function(t){var o=r.max(r.map(t,(function(t){return e.node(t).height})));r.forEach(t,(function(t){e.node(t).y=a+o/2})),a+=o+n}))})(e=o.asNonCompoundGraph(e)),r.forEach(a(e),(function(t,n){e.node(n).x=t}))}},5378:(e,t,n)=>{"use strict";var r=n(8899),o=n(2990).Graph,a=n(4441).slack;function i(e,t){return r.forEach(e.nodes(),(function n(o){r.forEach(t.nodeEdges(o),(function(r){var i=r.v,l=o===i?r.w:i;e.hasNode(l)||a(t,r)||(e.setNode(l,{}),e.setEdge(o,l,{}),n(l))}))})),e.nodeCount()}function l(e,t){return r.minBy(t.edges(),(function(n){if(e.hasNode(n.v)!==e.hasNode(n.w))return a(t,n)}))}function s(e,t,n){r.forEach(e.nodes(),(function(e){t.node(e).rank+=n}))}e.exports=function(e){var t,n,r=new o({directed:!1}),u=e.nodes()[0],c=e.nodeCount();r.setNode(u,{});for(;i(r,e){"use strict";var r=n(4441).longestPath,o=n(5378),a=n(7986);e.exports=function(e){switch(e.graph().ranker){case"network-simplex":default:l(e);break;case"tight-tree":!function(e){r(e),o(e)}(e);break;case"longest-path":i(e)}};var i=r;function l(e){a(e)}},7986:(e,t,n)=>{"use strict";var r=n(8899),o=n(5378),a=n(4441).slack,i=n(4441).longestPath,l=n(2990).alg.preorder,s=n(2990).alg.postorder,u=n(8392).simplify;function c(e){e=u(e),i(e);var t,n=o(e);for(p(n),f(n,e);t=v(n);)m(n,e,t,g(n,e,t))}function f(e,t){var n=s(e,e.nodes());n=n.slice(0,n.length-1),r.forEach(n,(function(n){!function(e,t,n){var r=e.node(n).parent;e.edge(n,r).cutvalue=d(e,t,n)}(e,t,n)}))}function d(e,t,n){var o=e.node(n).parent,a=!0,i=t.edge(n,o),l=0;return i||(a=!1,i=t.edge(o,n)),l=i.weight,r.forEach(t.nodeEdges(n),(function(r){var i,s,u=r.v===n,c=u?r.w:r.v;if(c!==o){var f=u===a,d=t.edge(r).weight;if(l+=f?d:-d,i=n,s=c,e.hasEdge(i,s)){var p=e.edge(n,c).cutvalue;l+=f?-p:p}}})),l}function p(e,t){arguments.length<2&&(t=e.nodes()[0]),h(e,{},1,t)}function h(e,t,n,o,a){var i=n,l=e.node(o);return t[o]=!0,r.forEach(e.neighbors(o),(function(a){r.has(t,a)||(n=h(e,t,n,a,o))})),l.low=i,l.lim=n++,a?l.parent=a:delete l.parent,n}function v(e){return r.find(e.edges(),(function(t){return e.edge(t).cutvalue<0}))}function g(e,t,n){var o=n.v,i=n.w;t.hasEdge(o,i)||(o=n.w,i=n.v);var l=e.node(o),s=e.node(i),u=l,c=!1;l.lim>s.lim&&(u=s,c=!0);var f=r.filter(t.edges(),(function(t){return c===y(e,e.node(t.v),u)&&c!==y(e,e.node(t.w),u)}));return r.minBy(f,(function(e){return a(t,e)}))}function m(e,t,n,o){var a=n.v,i=n.w;e.removeEdge(a,i),e.setEdge(o.v,o.w,{}),p(e),f(e,t),function(e,t){var n=r.find(e.nodes(),(function(e){return!t.node(e).parent})),o=l(e,n);o=o.slice(1),r.forEach(o,(function(n){var r=e.node(n).parent,o=t.edge(n,r),a=!1;o||(o=t.edge(r,n),a=!0),t.node(n).rank=t.node(r).rank+(a?o.minlen:-o.minlen)}))}(e,t)}function y(e,t,n){return n.low<=t.lim&&t.lim<=n.lim}e.exports=c,c.initLowLimValues=p,c.initCutValues=f,c.calcCutValue=d,c.leaveEdge=v,c.enterEdge=g,c.exchangeEdges=m},4441:(e,t,n)=>{"use strict";var r=n(8899);e.exports={longestPath:function(e){var t={};r.forEach(e.sources(),(function n(o){var a=e.node(o);if(r.has(t,o))return a.rank;t[o]=!0;var i=r.min(r.map(e.outEdges(o),(function(t){return n(t.w)-e.edge(t).minlen})));return i!==Number.POSITIVE_INFINITY&&void 0!==i&&null!==i||(i=0),a.rank=i}))},slack:function(e,t){return e.node(t.w).rank-e.node(t.v).rank-e.edge(t).minlen}}},8392:(e,t,n)=>{"use strict";var r=n(8899),o=n(2990).Graph;function a(e,t,n,o){var a;do{a=r.uniqueId(o)}while(e.hasNode(a));return n.dummy=t,e.setNode(a,n),a}function i(e){return r.max(r.map(e.nodes(),(function(t){var n=e.node(t).rank;if(!r.isUndefined(n))return n})))}e.exports={addDummyNode:a,simplify:function(e){var t=(new o).setGraph(e.graph());return r.forEach(e.nodes(),(function(n){t.setNode(n,e.node(n))})),r.forEach(e.edges(),(function(n){var r=t.edge(n.v,n.w)||{weight:0,minlen:1},o=e.edge(n);t.setEdge(n.v,n.w,{weight:r.weight+o.weight,minlen:Math.max(r.minlen,o.minlen)})})),t},asNonCompoundGraph:function(e){var t=new o({multigraph:e.isMultigraph()}).setGraph(e.graph());return r.forEach(e.nodes(),(function(n){e.children(n).length||t.setNode(n,e.node(n))})),r.forEach(e.edges(),(function(n){t.setEdge(n,e.edge(n))})),t},successorWeights:function(e){var t=r.map(e.nodes(),(function(t){var n={};return r.forEach(e.outEdges(t),(function(t){n[t.w]=(n[t.w]||0)+e.edge(t).weight})),n}));return r.zipObject(e.nodes(),t)},predecessorWeights:function(e){var t=r.map(e.nodes(),(function(t){var n={};return r.forEach(e.inEdges(t),(function(t){n[t.v]=(n[t.v]||0)+e.edge(t).weight})),n}));return r.zipObject(e.nodes(),t)},intersectRect:function(e,t){var n,r,o=e.x,a=e.y,i=t.x-o,l=t.y-a,s=e.width/2,u=e.height/2;if(!i&&!l)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(l)*s>Math.abs(i)*u?(l<0&&(u=-u),n=u*i/l,r=u):(i<0&&(s=-s),n=s,r=s*l/i);return{x:o+n,y:a+r}},buildLayerMatrix:function(e){var t=r.map(r.range(i(e)+1),(function(){return[]}));return r.forEach(e.nodes(),(function(n){var o=e.node(n),a=o.rank;r.isUndefined(a)||(t[a][o.order]=n)})),t},normalizeRanks:function(e){var t=r.min(r.map(e.nodes(),(function(t){return e.node(t).rank})));r.forEach(e.nodes(),(function(n){var o=e.node(n);r.has(o,"rank")&&(o.rank-=t)}))},removeEmptyRanks:function(e){var t=r.min(r.map(e.nodes(),(function(t){return e.node(t).rank}))),n=[];r.forEach(e.nodes(),(function(r){var o=e.node(r).rank-t;n[o]||(n[o]=[]),n[o].push(r)}));var o=0,a=e.graph().nodeRankFactor;r.forEach(n,(function(t,n){r.isUndefined(t)&&n%a!==0?--o:o&&r.forEach(t,(function(t){e.node(t).rank+=o}))}))},addBorderNode:function(e,t,n,r){var o={width:0,height:0};arguments.length>=4&&(o.rank=n,o.order=r);return a(e,"border",o,t)},maxRank:i,partition:function(e,t){var n={lhs:[],rhs:[]};return r.forEach(e,(function(e){t(e)?n.lhs.push(e):n.rhs.push(e)})),n},time:function(e,t){var n=r.now();try{return t()}finally{console.log(e+" time: "+(r.now()-n)+"ms")}},notime:function(e,t){return t()}}},6206:e=>{e.exports="0.8.5"},6118:(e,t,n)=>{var r=n(5828);e.exports={Graph:r.Graph,json:n(5710),alg:n(5280),version:r.version}},6666:(e,t,n)=>{var r=n(980);e.exports=function(e){var t,n={},o=[];function a(o){r.has(n,o)||(n[o]=!0,t.push(o),r.each(e.successors(o),a),r.each(e.predecessors(o),a))}return r.each(e.nodes(),(function(e){t=[],a(e),t.length&&o.push(t)})),o}},672:(e,t,n)=>{var r=n(980);function o(e,t,n,a,i,l){r.has(a,t)||(a[t]=!0,n||l.push(t),r.each(i(t),(function(t){o(e,t,n,a,i,l)})),n&&l.push(t))}e.exports=function(e,t,n){r.isArray(t)||(t=[t]);var a=(e.isDirected()?e.successors:e.neighbors).bind(e),i=[],l={};return r.each(t,(function(t){if(!e.hasNode(t))throw new Error("Graph does not have node: "+t);o(e,t,"post"===n,l,a,i)})),i}},9919:(e,t,n)=>{var r=n(4871),o=n(980);e.exports=function(e,t,n){return o.transform(e.nodes(),(function(o,a){o[a]=r(e,a,t,n)}),{})}},4871:(e,t,n)=>{var r=n(980),o=n(6071);e.exports=function(e,t,n,r){return function(e,t,n,r){var a,i,l={},s=new o,u=function(e){var t=e.v!==a?e.v:e.w,r=l[t],o=n(e),u=i.distance+o;if(o<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+e+" Weight: "+o);u0&&(a=s.removeMin(),(i=l[a]).distance!==Number.POSITIVE_INFINITY);)r(a).forEach(u);return l}(e,String(t),n||a,r||function(t){return e.outEdges(t)})};var a=r.constant(1)},6953:(e,t,n)=>{var r=n(980),o=n(8172);e.exports=function(e){return r.filter(o(e),(function(t){return t.length>1||1===t.length&&e.hasEdge(t[0],t[0])}))}},5053:(e,t,n)=>{var r=n(980);e.exports=function(e,t,n){return function(e,t,n){var r={},o=e.nodes();return o.forEach((function(e){r[e]={},r[e][e]={distance:0},o.forEach((function(t){e!==t&&(r[e][t]={distance:Number.POSITIVE_INFINITY})})),n(e).forEach((function(n){var o=n.v===e?n.w:n.v,a=t(n);r[e][o]={distance:a,predecessor:e}}))})),o.forEach((function(e){var t=r[e];o.forEach((function(n){var a=r[n];o.forEach((function(n){var r=a[e],o=t[n],i=a[n],l=r.distance+o.distance;l{e.exports={components:n(6666),dijkstra:n(4871),dijkstraAll:n(9919),findCycles:n(6953),floydWarshall:n(5053),isAcyclic:n(810),postorder:n(1189),preorder:n(6743),prim:n(9863),tarjan:n(8172),topsort:n(1731)}},810:(e,t,n)=>{var r=n(1731);e.exports=function(e){try{r(e)}catch(t){if(t instanceof r.CycleException)return!1;throw t}return!0}},1189:(e,t,n)=>{var r=n(672);e.exports=function(e,t){return r(e,t,"post")}},6743:(e,t,n)=>{var r=n(672);e.exports=function(e,t){return r(e,t,"pre")}},9863:(e,t,n)=>{var r=n(980),o=n(1311),a=n(6071);e.exports=function(e,t){var n,i=new o,l={},s=new a;function u(e){var r=e.v===n?e.w:e.v,o=s.priority(r);if(void 0!==o){var a=t(e);a0;){if(n=s.removeMin(),r.has(l,n))i.setEdge(n,l[n]);else{if(c)throw new Error("Input graph is not connected: "+e);c=!0}e.nodeEdges(n).forEach(u)}return i}},8172:(e,t,n)=>{var r=n(980);e.exports=function(e){var t=0,n=[],o={},a=[];function i(l){var s=o[l]={onStack:!0,lowlink:t,index:t++};if(n.push(l),e.successors(l).forEach((function(e){r.has(o,e)?o[e].onStack&&(s.lowlink=Math.min(s.lowlink,o[e].index)):(i(e),s.lowlink=Math.min(s.lowlink,o[e].lowlink))})),s.lowlink===s.index){var u,c=[];do{u=n.pop(),o[u].onStack=!1,c.push(u)}while(l!==u);a.push(c)}}return e.nodes().forEach((function(e){r.has(o,e)||i(e)})),a}},1731:(e,t,n)=>{var r=n(980);function o(e){var t={},n={},o=[];if(r.each(e.sinks(),(function i(l){if(r.has(n,l))throw new a;r.has(t,l)||(n[l]=!0,t[l]=!0,r.each(e.predecessors(l),i),delete n[l],o.push(l))})),r.size(t)!==e.nodeCount())throw new a;return o}function a(){}e.exports=o,o.CycleException=a,a.prototype=new Error},6071:(e,t,n)=>{var r=n(980);function o(){this._arr=[],this._keyIndices={}}e.exports=o,o.prototype.size=function(){return this._arr.length},o.prototype.keys=function(){return this._arr.map((function(e){return e.key}))},o.prototype.has=function(e){return r.has(this._keyIndices,e)},o.prototype.priority=function(e){var t=this._keyIndices[e];if(void 0!==t)return this._arr[t].priority},o.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},o.prototype.add=function(e,t){var n=this._keyIndices;if(e=String(e),!r.has(n,e)){var o=this._arr,a=o.length;return n[e]=a,o.push({key:e,priority:t}),this._decrease(a),!0}return!1},o.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var e=this._arr.pop();return delete this._keyIndices[e.key],this._heapify(0),e.key},o.prototype.decrease=function(e,t){var n=this._keyIndices[e];if(t>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+e+" Old: "+this._arr[n].priority+" New: "+t);this._arr[n].priority=t,this._decrease(n)},o.prototype._heapify=function(e){var t=this._arr,n=2*e,r=n+1,o=e;n>1].priority{"use strict";var r=n(980);e.exports=a;var o="\0";function a(e){this._isDirected=!r.has(e,"directed")||e.directed,this._isMultigraph=!!r.has(e,"multigraph")&&e.multigraph,this._isCompound=!!r.has(e,"compound")&&e.compound,this._label=void 0,this._defaultNodeLabelFn=r.constant(void 0),this._defaultEdgeLabelFn=r.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function i(e,t){e[t]?e[t]++:e[t]=1}function l(e,t){--e[t]||delete e[t]}function s(e,t,n,o){var a=""+t,i=""+n;if(!e&&a>i){var l=a;a=i,i=l}return a+"\x01"+i+"\x01"+(r.isUndefined(o)?"\0":o)}function u(e,t,n,r){var o=""+t,a=""+n;if(!e&&o>a){var i=o;o=a,a=i}var l={v:o,w:a};return r&&(l.name=r),l}function c(e,t){return s(e,t.v,t.w,t.name)}a.prototype._nodeCount=0,a.prototype._edgeCount=0,a.prototype.isDirected=function(){return this._isDirected},a.prototype.isMultigraph=function(){return this._isMultigraph},a.prototype.isCompound=function(){return this._isCompound},a.prototype.setGraph=function(e){return this._label=e,this},a.prototype.graph=function(){return this._label},a.prototype.setDefaultNodeLabel=function(e){return r.isFunction(e)||(e=r.constant(e)),this._defaultNodeLabelFn=e,this},a.prototype.nodeCount=function(){return this._nodeCount},a.prototype.nodes=function(){return r.keys(this._nodes)},a.prototype.sources=function(){var e=this;return r.filter(this.nodes(),(function(t){return r.isEmpty(e._in[t])}))},a.prototype.sinks=function(){var e=this;return r.filter(this.nodes(),(function(t){return r.isEmpty(e._out[t])}))},a.prototype.setNodes=function(e,t){var n=arguments,o=this;return r.each(e,(function(e){n.length>1?o.setNode(e,t):o.setNode(e)})),this},a.prototype.setNode=function(e,t){return r.has(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=t),this):(this._nodes[e]=arguments.length>1?t:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=o,this._children[e]={},this._children["\0"][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)},a.prototype.node=function(e){return this._nodes[e]},a.prototype.hasNode=function(e){return r.has(this._nodes,e)},a.prototype.removeNode=function(e){var t=this;if(r.has(this._nodes,e)){var n=function(e){t.removeEdge(t._edgeObjs[e])};delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],r.each(this.children(e),(function(e){t.setParent(e)})),delete this._children[e]),r.each(r.keys(this._in[e]),n),delete this._in[e],delete this._preds[e],r.each(r.keys(this._out[e]),n),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this},a.prototype.setParent=function(e,t){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(r.isUndefined(t))t=o;else{for(var n=t+="";!r.isUndefined(n);n=this.parent(n))if(n===e)throw new Error("Setting "+t+" as parent of "+e+" would create a cycle");this.setNode(t)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=t,this._children[t][e]=!0,this},a.prototype._removeFromParentsChildList=function(e){delete this._children[this._parent[e]][e]},a.prototype.parent=function(e){if(this._isCompound){var t=this._parent[e];if(t!==o)return t}},a.prototype.children=function(e){if(r.isUndefined(e)&&(e=o),this._isCompound){var t=this._children[e];if(t)return r.keys(t)}else{if(e===o)return this.nodes();if(this.hasNode(e))return[]}},a.prototype.predecessors=function(e){var t=this._preds[e];if(t)return r.keys(t)},a.prototype.successors=function(e){var t=this._sucs[e];if(t)return r.keys(t)},a.prototype.neighbors=function(e){var t=this.predecessors(e);if(t)return r.union(t,this.successors(e))},a.prototype.isLeaf=function(e){return 0===(this.isDirected()?this.successors(e):this.neighbors(e)).length},a.prototype.filterNodes=function(e){var t=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});t.setGraph(this.graph());var n=this;r.each(this._nodes,(function(n,r){e(r)&&t.setNode(r,n)})),r.each(this._edgeObjs,(function(e){t.hasNode(e.v)&&t.hasNode(e.w)&&t.setEdge(e,n.edge(e))}));var o={};function a(e){var r=n.parent(e);return void 0===r||t.hasNode(r)?(o[e]=r,r):r in o?o[r]:a(r)}return this._isCompound&&r.each(t.nodes(),(function(e){t.setParent(e,a(e))})),t},a.prototype.setDefaultEdgeLabel=function(e){return r.isFunction(e)||(e=r.constant(e)),this._defaultEdgeLabelFn=e,this},a.prototype.edgeCount=function(){return this._edgeCount},a.prototype.edges=function(){return r.values(this._edgeObjs)},a.prototype.setPath=function(e,t){var n=this,o=arguments;return r.reduce(e,(function(e,r){return o.length>1?n.setEdge(e,r,t):n.setEdge(e,r),r})),this},a.prototype.setEdge=function(){var e,t,n,o,a=!1,l=arguments[0];"object"===typeof l&&null!==l&&"v"in l?(e=l.v,t=l.w,n=l.name,2===arguments.length&&(o=arguments[1],a=!0)):(e=l,t=arguments[1],n=arguments[3],arguments.length>2&&(o=arguments[2],a=!0)),e=""+e,t=""+t,r.isUndefined(n)||(n=""+n);var c=s(this._isDirected,e,t,n);if(r.has(this._edgeLabels,c))return a&&(this._edgeLabels[c]=o),this;if(!r.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(t),this._edgeLabels[c]=a?o:this._defaultEdgeLabelFn(e,t,n);var f=u(this._isDirected,e,t,n);return e=f.v,t=f.w,Object.freeze(f),this._edgeObjs[c]=f,i(this._preds[t],e),i(this._sucs[e],t),this._in[t][c]=f,this._out[e][c]=f,this._edgeCount++,this},a.prototype.edge=function(e,t,n){var r=1===arguments.length?c(this._isDirected,arguments[0]):s(this._isDirected,e,t,n);return this._edgeLabels[r]},a.prototype.hasEdge=function(e,t,n){var o=1===arguments.length?c(this._isDirected,arguments[0]):s(this._isDirected,e,t,n);return r.has(this._edgeLabels,o)},a.prototype.removeEdge=function(e,t,n){var r=1===arguments.length?c(this._isDirected,arguments[0]):s(this._isDirected,e,t,n),o=this._edgeObjs[r];return o&&(e=o.v,t=o.w,delete this._edgeLabels[r],delete this._edgeObjs[r],l(this._preds[t],e),l(this._sucs[e],t),delete this._in[t][r],delete this._out[e][r],this._edgeCount--),this},a.prototype.inEdges=function(e,t){var n=this._in[e];if(n){var o=r.values(n);return t?r.filter(o,(function(e){return e.v===t})):o}},a.prototype.outEdges=function(e,t){var n=this._out[e];if(n){var o=r.values(n);return t?r.filter(o,(function(e){return e.w===t})):o}},a.prototype.nodeEdges=function(e,t){var n=this.inEdges(e,t);if(n)return n.concat(this.outEdges(e,t))}},5828:(e,t,n)=>{e.exports={Graph:n(1311),version:n(4161)}},5710:(e,t,n)=>{var r=n(980),o=n(1311);function a(e){return r.map(e.nodes(),(function(t){var n=e.node(t),o=e.parent(t),a={v:t};return r.isUndefined(n)||(a.value=n),r.isUndefined(o)||(a.parent=o),a}))}function i(e){return r.map(e.edges(),(function(t){var n=e.edge(t),o={v:t.v,w:t.w};return r.isUndefined(t.name)||(o.name=t.name),r.isUndefined(n)||(o.value=n),o}))}e.exports={write:function(e){var t={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:a(e),edges:i(e)};r.isUndefined(e.graph())||(t.value=r.clone(e.graph()));return t},read:function(e){var t=new o(e.options).setGraph(e.value);return r.each(e.nodes,(function(e){t.setNode(e.v,e.value),e.parent&&t.setParent(e.v,e.parent)})),r.each(e.edges,(function(e){t.setEdge({v:e.v,w:e.w,name:e.name},e.value)})),t}}},980:(e,t,n)=>{var r;try{r={clone:n(8787),constant:n(1547),each:n(9430),filter:n(86),has:n(7805),isArray:n(3629),isEmpty:n(6364),isFunction:n(4786),isUndefined:n(2530),keys:n(2742),map:n(2034),reduce:n(5080),size:n(9467),transform:n(5653),union:n(6310),values:n(2063)}}catch(o){}r||(r=window._),e.exports=r},4161:e=>{e.exports="2.1.8"},4097:(e,t,n)=>{var r;!function(o,a,i,l){"use strict";var s,u=["","webkit","Moz","MS","ms","o"],c=a.createElement("div"),f=Math.round,d=Math.abs,p=Date.now;function h(e,t,n){return setTimeout(w(e,n),t)}function v(e,t,n){return!!Array.isArray(e)&&(g(e,n[t],n),!0)}function g(e,t,n){var r;if(e)if(e.forEach)e.forEach(t,n);else if(e.length!==l)for(r=0;r\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",a=o.console&&(o.console.warn||o.console.log);return a&&a.call(o.console,r,n),e.apply(this,arguments)}}s="function"!==typeof Object.assign?function(e){if(e===l||null===e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n-1}function P(e){return e.trim().split(/\s+/g)}function O(e,t,n){if(e.indexOf&&!n)return e.indexOf(t);for(var r=0;rn[t]})):r.sort()),r}function I(e,t){for(var n,r,o=t[0].toUpperCase()+t.slice(1),a=0;a1&&!n.firstMultiple?n.firstMultiple=q(t):1===o&&(n.firstMultiple=!1);var a=n.firstInput,i=n.firstMultiple,s=i?i.center:a.center,u=t.center=U(r);t.timeStamp=p(),t.deltaTime=t.timeStamp-a.timeStamp,t.angle=G(s,u),t.distance=$(s,u),function(e,t){var n=t.center,r=e.offsetDelta||{},o=e.prevDelta||{},a=e.prevInput||{};1!==t.eventType&&4!==a.eventType||(o=e.prevDelta={x:a.deltaX||0,y:a.deltaY||0},r=e.offsetDelta={x:n.x,y:n.y});t.deltaX=o.x+(n.x-r.x),t.deltaY=o.y+(n.y-r.y)}(n,t),t.offsetDirection=X(t.deltaX,t.deltaY);var c=Y(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=c.x,t.overallVelocityY=c.y,t.overallVelocity=d(c.x)>d(c.y)?c.x:c.y,t.scale=i?(f=i.pointers,h=r,$(h[0],h[1],K)/$(f[0],f[1],K)):1,t.rotation=i?function(e,t){return G(t[1],t[0],K)+G(e[1],e[0],K)}(i.pointers,r):0,t.maxPointers=n.prevInput?t.pointers.length>n.prevInput.maxPointers?t.pointers.length:n.prevInput.maxPointers:t.pointers.length,function(e,t){var n,r,o,a,i=e.lastInterval||t,s=t.timeStamp-i.timeStamp;if(8!=t.eventType&&(s>25||i.velocity===l)){var u=t.deltaX-i.deltaX,c=t.deltaY-i.deltaY,f=Y(s,u,c);r=f.x,o=f.y,n=d(f.x)>d(f.y)?f.x:f.y,a=X(u,c),e.lastInterval=t}else n=i.velocity,r=i.velocityX,o=i.velocityY,a=i.direction;t.velocity=n,t.velocityX=r,t.velocityY=o,t.direction=a}(n,t);var f,h;var v=e.element;_(t.srcEvent.target,v)&&(v=t.srcEvent.target);t.target=v}(e,n),e.emit("hammer.input",n),e.recognize(n),e.session.prevInput=n}function q(e){for(var t=[],n=0;n=d(t)?e<0?2:4:t<0?8:16}function $(e,t,n){n||(n=V);var r=t[n[0]]-e[n[0]],o=t[n[1]]-e[n[1]];return Math.sqrt(r*r+o*o)}function G(e,t,n){n||(n=V);var r=t[n[0]]-e[n[0]],o=t[n[1]]-e[n[1]];return 180*Math.atan2(o,r)/Math.PI}H.prototype={handler:function(){},init:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(R(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&S(this.element,this.evEl,this.domHandler),this.evTarget&&S(this.target,this.evTarget,this.domHandler),this.evWin&&S(R(this.element),this.evWin,this.domHandler)}};var Q={mousedown:1,mousemove:2,mouseup:4},Z="mousedown",J="mousemove mouseup";function ee(){this.evEl=Z,this.evWin=J,this.pressed=!1,H.apply(this,arguments)}x(ee,H,{handler:function(e){var t=Q[e.type];1&t&&0===e.button&&(this.pressed=!0),2&t&&1!==e.which&&(t=4),this.pressed&&(4&t&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[e],changedPointers:[e],pointerType:F,srcEvent:e}))}});var te={pointerdown:1,pointermove:2,pointerup:4,pointercancel:8,pointerout:8},ne={2:z,3:"pen",4:F,5:"kinect"},re="pointerdown",oe="pointermove pointerup pointercancel";function ae(){this.evEl=re,this.evWin=oe,H.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}o.MSPointerEvent&&!o.PointerEvent&&(re="MSPointerDown",oe="MSPointerMove MSPointerUp MSPointerCancel"),x(ae,H,{handler:function(e){var t=this.store,n=!1,r=e.type.toLowerCase().replace("ms",""),o=te[r],a=ne[e.pointerType]||e.pointerType,i=a==z,l=O(t,e.pointerId,"pointerId");1&o&&(0===e.button||i)?l<0&&(t.push(e),l=t.length-1):12&o&&(n=!0),l<0||(t[l]=e,this.callback(this.manager,o,{pointers:t,changedPointers:[e],pointerType:a,srcEvent:e}),n&&t.splice(l,1))}});var ie={touchstart:1,touchmove:2,touchend:4,touchcancel:8},le="touchstart",se="touchstart touchmove touchend touchcancel";function ue(){this.evTarget=le,this.evWin=se,this.started=!1,H.apply(this,arguments)}function ce(e,t){var n=T(e.touches),r=T(e.changedTouches);return 12&t&&(n=M(n.concat(r),"identifier",!0)),[n,r]}x(ue,H,{handler:function(e){var t=ie[e.type];if(1===t&&(this.started=!0),this.started){var n=ce.call(this,e,t);12&t&&n[0].length-n[1].length===0&&(this.started=!1),this.callback(this.manager,t,{pointers:n[0],changedPointers:n[1],pointerType:z,srcEvent:e})}}});var fe={touchstart:1,touchmove:2,touchend:4,touchcancel:8},de="touchstart touchmove touchend touchcancel";function pe(){this.evTarget=de,this.targetIds={},H.apply(this,arguments)}function he(e,t){var n=T(e.touches),r=this.targetIds;if(3&t&&1===n.length)return r[n[0].identifier]=!0,[n,n];var o,a,i=T(e.changedTouches),l=[],s=this.target;if(a=n.filter((function(e){return _(e.target,s)})),1===t)for(o=0;o-1&&r.splice(e,1)}),2500)}}function ye(e){for(var t=e.srcEvent.clientX,n=e.srcEvent.clientY,r=0;r-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(e){return!!this.simultaneous[e.id]},emit:function(e){var t=this,n=this.state;function r(n){t.manager.emit(n,e)}n<8&&r(t.options.event+Me(n)),r(t.options.event),e.additionalEvent&&r(e.additionalEvent),n>=8&&r(t.options.event+Me(n))},tryEmit:function(e){if(this.canEmit())return this.emit(e);this.state=Oe},canEmit:function(){for(var e=0;et.threshold&&o&t.direction},attrTest:function(e){return Re.prototype.attrTest.call(this,e)&&(2&this.state||!(2&this.state)&&this.directionTest(e))},emit:function(e){this.pX=e.deltaX,this.pY=e.deltaY;var t=Ie(e.direction);t&&(e.additionalEvent=this.options.event+t),this._super.emit.call(this,e)}}),x(je,Re,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[Ce]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.scale-1)>this.options.threshold||2&this.state)},emit:function(e){if(1!==e.scale){var t=e.scale<1?"in":"out";e.additionalEvent=this.options.event+t}this._super.emit.call(this,e)}}),x(Le,Te,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[Ee]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,r=e.distancet.time;if(this._input=e,!r||!n||12&e.eventType&&!o)this.reset();else if(1&e.eventType)this.reset(),this._timer=h((function(){this.state=8,this.tryEmit()}),t.time,this);else if(4&e.eventType)return 8;return Oe},reset:function(){clearTimeout(this._timer)},emit:function(e){8===this.state&&(e&&4&e.eventType?this.manager.emit(this.options.event+"up",e):(this._input.timeStamp=p(),this.manager.emit(this.options.event,this._input)))}}),x(ze,Re,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[Ce]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.rotation)>this.options.threshold||2&this.state)}}),x(Fe,Re,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:30,pointers:1},getTouchAction:function(){return Ae.prototype.getTouchAction.call(this)},attrTest:function(e){var t,n=this.options.direction;return 30&n?t=e.overallVelocity:6&n?t=e.overallVelocityX:n&B&&(t=e.overallVelocityY),this._super.attrTest.call(this,e)&&n&e.offsetDirection&&e.distance>this.options.threshold&&e.maxPointers==this.options.pointers&&d(t)>this.options.velocity&&4&e.eventType},emit:function(e){var t=Ie(e.offsetDirection);t&&this.manager.emit(this.options.event+t,e),this.manager.emit(this.options.event,e)}}),x(Be,Te,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ke]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,r=e.distance{e.exports=n(2132)},2132:function(e,t){var n,r,o;(function(){var a,i,l,s,u,c,f,d,p,h,v,g,m,y,b;l=Math.floor,h=Math.min,i=function(e,t){return et?1:0},p=function(e,t,n,r,o){var a;if(null==n&&(n=0),null==o&&(o=i),n<0)throw new Error("lo must be non-negative");for(null==r&&(r=e.length);nn;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse(),s=[],r=0,o=a.length;rv;0<=v?++c:--c)g.push(u(e,n));return g},y=function(e,t,n,r){var o,a,l;for(null==r&&(r=i),o=e[n];n>t&&r(o,a=e[l=n-1>>1])<0;)e[n]=a,n=l;return e[n]=o},b=function(e,t,n){var r,o,a,l,s;for(null==n&&(n=i),o=e.length,s=t,a=e[t],r=2*t+1;r{var r=n(8136)(n(7009),"DataView");e.exports=r},9676:(e,t,n)=>{var r=n(5403),o=n(2747),a=n(6037),i=n(4154),l=n(7728);function s(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(3894),o=n(8699),a=n(4957),i=n(7184),l=n(7109);function s(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(8136)(n(7009),"Map");e.exports=r},8059:(e,t,n)=>{var r=n(4086),o=n(9255),a=n(9186),i=n(3423),l=n(3739);function s(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(8136)(n(7009),"Promise");e.exports=r},3924:(e,t,n)=>{var r=n(8136)(n(7009),"Set");e.exports=r},692:(e,t,n)=>{var r=n(8059),o=n(5774),a=n(1596);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t{var r=n(8384),o=n(511),a=n(835),i=n(707),l=n(8832),s=n(5077);function u(e){var t=this.__data__=new r(e);this.size=t.size}u.prototype.clear=o,u.prototype.delete=a,u.prototype.get=i,u.prototype.has=l,u.prototype.set=s,e.exports=u},7197:(e,t,n)=>{var r=n(7009).Symbol;e.exports=r},6219:(e,t,n)=>{var r=n(7009).Uint8Array;e.exports=r},7091:(e,t,n)=>{var r=n(8136)(n(7009),"WeakMap");e.exports=r},3665:e=>{e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},4550:e=>{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,a=[];++n{var r=n(4842);e.exports=function(e,t){return!!(null==e?0:e.length)&&r(e,t,0)>-1}},2683:e=>{e.exports=function(e,t,n){for(var r=-1,o=null==e?0:e.length;++r{var r=n(6478),o=n(4963),a=n(3629),i=n(5174),l=n(6800),s=n(9102),u=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=a(e),c=!n&&o(e),f=!n&&!c&&i(e),d=!n&&!c&&!f&&s(e),p=n||c||f||d,h=p?r(e.length,String):[],v=h.length;for(var g in e)!t&&!u.call(e,g)||p&&("length"==g||f&&("offset"==g||"parent"==g)||d&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||l(g,v))||h.push(g);return h}},8950:e=>{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n{e.exports=function(e,t){for(var n=-1,r=t.length,o=e.length;++n{e.exports=function(e,t,n,r){var o=-1,a=null==e?0:e.length;for(r&&a&&(n=e[++o]);++o{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n{var r=n(9586)("length");e.exports=r},8002:(e,t,n)=>{var r=n(2526),o=n(9231);e.exports=function(e,t,n){(void 0!==n&&!o(e[t],n)||void 0===n&&!(t in e))&&r(e,t,n)}},8463:(e,t,n)=>{var r=n(2526),o=n(9231),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var i=e[t];a.call(e,t)&&o(i,n)&&(void 0!==n||t in e)||r(e,t,n)}},7112:(e,t,n)=>{var r=n(9231);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},1855:(e,t,n)=>{var r=n(4503),o=n(2742);e.exports=function(e,t){return e&&r(t,o(t),e)}},5076:(e,t,n)=>{var r=n(4503),o=n(3961);e.exports=function(e,t){return e&&r(t,o(t),e)}},2526:(e,t,n)=>{var r=n(8528);e.exports=function(e,t,n){"__proto__"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},1905:(e,t,n)=>{var r=n(2854),o=n(4550),a=n(8463),i=n(1855),l=n(5076),s=n(4523),u=n(291),c=n(2455),f=n(7636),d=n(8248),p=n(5341),h=n(8383),v=n(9243),g=n(9759),m=n(548),y=n(3629),b=n(5174),x=n(103),w=n(8092),E=n(6995),k=n(2742),C=n(3961),S="[object Arguments]",_="[object Function]",N="[object Object]",P={};P[S]=P["[object Array]"]=P["[object ArrayBuffer]"]=P["[object DataView]"]=P["[object Boolean]"]=P["[object Date]"]=P["[object Float32Array]"]=P["[object Float64Array]"]=P["[object Int8Array]"]=P["[object Int16Array]"]=P["[object Int32Array]"]=P["[object Map]"]=P["[object Number]"]=P[N]=P["[object RegExp]"]=P["[object Set]"]=P["[object String]"]=P["[object Symbol]"]=P["[object Uint8Array]"]=P["[object Uint8ClampedArray]"]=P["[object Uint16Array]"]=P["[object Uint32Array]"]=!0,P["[object Error]"]=P[_]=P["[object WeakMap]"]=!1,e.exports=function e(t,n,O,T,M,I){var D,R=1&n,A=2&n,j=4&n;if(O&&(D=M?O(t,T,M,I):O(t)),void 0!==D)return D;if(!w(t))return t;var L=y(t);if(L){if(D=v(t),!R)return u(t,D)}else{var z=h(t),F=z==_||"[object GeneratorFunction]"==z;if(b(t))return s(t,R);if(z==N||z==S||F&&!M){if(D=A||F?{}:m(t),!R)return A?f(t,l(D,t)):c(t,i(D,t))}else{if(!P[z])return M?t:{};D=g(t,z,R)}}I||(I=new r);var B=I.get(t);if(B)return B;I.set(t,D),E(t)?t.forEach((function(r){D.add(e(r,n,O,r,t,I))})):x(t)&&t.forEach((function(r,o){D.set(o,e(r,n,O,o,t,I))}));var V=L?void 0:(j?A?p:d:A?C:k)(t);return o(V||t,(function(r,o){V&&(r=t[o=r]),a(D,o,e(r,n,O,o,t,I))})),D}},5763:(e,t,n)=>{var r=n(8092),o=Object.create,a=function(){function e(){}return function(t){if(!r(t))return{};if(o)return o(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=a},7927:(e,t,n)=>{var r=n(5358),o=n(7056)(r);e.exports=o},3079:(e,t,n)=>{var r=n(152);e.exports=function(e,t,n){for(var o=-1,a=e.length;++o{var r=n(7927);e.exports=function(e,t){var n=[];return r(e,(function(e,r,o){t(e,r,o)&&n.push(e)})),n}},2045:e=>{e.exports=function(e,t,n,r){for(var o=e.length,a=n+(r?1:-1);r?a--:++a{var r=n(1705),o=n(3529);e.exports=function e(t,n,a,i,l){var s=-1,u=t.length;for(a||(a=o),l||(l=[]);++s0&&a(c)?n>1?e(c,n-1,a,i,l):r(l,c):i||(l[l.length]=c)}return l}},5099:(e,t,n)=>{var r=n(372)();e.exports=r},5358:(e,t,n)=>{var r=n(5099),o=n(2742);e.exports=function(e,t){return e&&r(e,t,o)}},8667:(e,t,n)=>{var r=n(3082),o=n(9793);e.exports=function(e,t){for(var n=0,a=(t=r(t,e)).length;null!=e&&n{var r=n(1705),o=n(3629);e.exports=function(e,t,n){var a=t(e);return o(e)?a:r(a,n(e))}},9066:(e,t,n)=>{var r=n(7197),o=n(1587),a=n(3581),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):a(e)}},1954:e=>{e.exports=function(e,t){return e>t}},7852:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e,n){return null!=e&&t.call(e,n)}},529:e=>{e.exports=function(e,t){return null!=e&&t in Object(e)}},4842:(e,t,n)=>{var r=n(2045),o=n(505),a=n(7167);e.exports=function(e,t,n){return t===t?a(e,t,n):r(e,o,n)}},4906:(e,t,n)=>{var r=n(9066),o=n(3141);e.exports=function(e){return o(e)&&"[object Arguments]"==r(e)}},1848:(e,t,n)=>{var r=n(3355),o=n(3141);e.exports=function e(t,n,a,i,l){return t===n||(null==t||null==n||!o(t)&&!o(n)?t!==t&&n!==n:r(t,n,a,i,e,l))}},3355:(e,t,n)=>{var r=n(2854),o=n(5305),a=n(2206),i=n(8078),l=n(8383),s=n(3629),u=n(5174),c=n(9102),f="[object Arguments]",d="[object Array]",p="[object Object]",h=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,v,g,m){var y=s(e),b=s(t),x=y?d:l(e),w=b?d:l(t),E=(x=x==f?p:x)==p,k=(w=w==f?p:w)==p,C=x==w;if(C&&u(e)){if(!u(t))return!1;y=!0,E=!1}if(C&&!E)return m||(m=new r),y||c(e)?o(e,t,n,v,g,m):a(e,t,x,n,v,g,m);if(!(1&n)){var S=E&&h.call(e,"__wrapped__"),_=k&&h.call(t,"__wrapped__");if(S||_){var N=S?e.value():e,P=_?t.value():t;return m||(m=new r),g(N,P,n,v,m)}}return!!C&&(m||(m=new r),i(e,t,n,v,g,m))}},3085:(e,t,n)=>{var r=n(8383),o=n(3141);e.exports=function(e){return o(e)&&"[object Map]"==r(e)}},8856:(e,t,n)=>{var r=n(2854),o=n(1848);e.exports=function(e,t,n,a){var i=n.length,l=i,s=!a;if(null==e)return!l;for(e=Object(e);i--;){var u=n[i];if(s&&u[2]?u[1]!==e[u[0]]:!(u[0]in e))return!1}for(;++i{e.exports=function(e){return e!==e}},6703:(e,t,n)=>{var r=n(4786),o=n(257),a=n(8092),i=n(7907),l=/^\[object .+?Constructor\]$/,s=Function.prototype,u=Object.prototype,c=s.toString,f=u.hasOwnProperty,d=RegExp("^"+c.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!a(e)||o(e))&&(r(e)?d:l).test(i(e))}},8680:(e,t,n)=>{var r=n(8383),o=n(3141);e.exports=function(e){return o(e)&&"[object Set]"==r(e)}},8150:(e,t,n)=>{var r=n(9066),o=n(4635),a=n(3141),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!i[r(e)]}},6025:(e,t,n)=>{var r=n(7080),o=n(4322),a=n(2100),i=n(3629),l=n(38);e.exports=function(e){return"function"==typeof e?e:null==e?a:"object"==typeof e?i(e)?o(e[0],e[1]):r(e):l(e)}},3654:(e,t,n)=>{var r=n(2936),o=n(8836),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=[];for(var n in Object(e))a.call(e,n)&&"constructor"!=n&&t.push(n);return t}},8664:(e,t,n)=>{var r=n(8092),o=n(2936),a=n(4221),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return a(e);var t=o(e),n=[];for(var l in e)("constructor"!=l||!t&&i.call(e,l))&&n.push(l);return n}},2580:e=>{e.exports=function(e,t){return e{var r=n(7927),o=n(1473);e.exports=function(e,t){var n=-1,a=o(e)?Array(e.length):[];return r(e,(function(e,r,o){a[++n]=t(e,r,o)})),a}},7080:(e,t,n)=>{var r=n(8856),o=n(9091),a=n(284);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},4322:(e,t,n)=>{var r=n(1848),o=n(6181),a=n(5658),i=n(5823),l=n(5072),s=n(284),u=n(9793);e.exports=function(e,t){return i(e)&&l(t)?s(u(e),t):function(n){var i=o(n,e);return void 0===i&&i===t?a(n,e):r(t,i,3)}}},4173:(e,t,n)=>{var r=n(2854),o=n(8002),a=n(5099),i=n(9216),l=n(8092),s=n(3961),u=n(5906);e.exports=function e(t,n,c,f,d){t!==n&&a(n,(function(a,s){if(d||(d=new r),l(a))i(t,n,s,c,e,f,d);else{var p=f?f(u(t,s),a,s+"",t,n,d):void 0;void 0===p&&(p=a),o(t,s,p)}}),s)}},9216:(e,t,n)=>{var r=n(8002),o=n(4523),a=n(613),i=n(291),l=n(548),s=n(4963),u=n(3629),c=n(6279),f=n(5174),d=n(4786),p=n(8092),h=n(3977),v=n(9102),g=n(5906),m=n(6576);e.exports=function(e,t,n,y,b,x,w){var E=g(e,n),k=g(t,n),C=w.get(k);if(C)r(e,n,C);else{var S=x?x(E,k,n+"",e,t,w):void 0,_=void 0===S;if(_){var N=u(k),P=!N&&f(k),O=!N&&!P&&v(k);S=k,N||P||O?u(E)?S=E:c(E)?S=i(E):P?(_=!1,S=o(k,!0)):O?(_=!1,S=a(k,!0)):S=[]:h(k)||s(k)?(S=E,s(E)?S=m(E):p(E)&&!d(E)||(S=l(k))):_=!1}_&&(w.set(k,S),b(S,k,y,x,w),w.delete(k)),r(e,n,S)}}},3226:(e,t,n)=>{var r=n(8950),o=n(8667),a=n(6025),i=n(3849),l=n(9179),s=n(6194),u=n(4480),c=n(2100),f=n(3629);e.exports=function(e,t,n){t=t.length?r(t,(function(e){return f(e)?function(t){return o(t,1===e.length?e[0]:e)}:e})):[c];var d=-1;t=r(t,s(a));var p=i(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++d,value:e}}));return l(p,(function(e,t){return u(e,t,n)}))}},4980:(e,t,n)=>{var r=n(2591),o=n(5658);e.exports=function(e,t){return r(e,t,(function(t,n){return o(e,n)}))}},2591:(e,t,n)=>{var r=n(8667),o=n(379),a=n(3082);e.exports=function(e,t,n){for(var i=-1,l=t.length,s={};++i{e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},4084:(e,t,n)=>{var r=n(8667);e.exports=function(e){return function(t){return r(t,e)}}},7255:e=>{var t=Math.ceil,n=Math.max;e.exports=function(e,r,o,a){for(var i=-1,l=n(t((r-e)/(o||1)),0),s=Array(l);l--;)s[a?l:++i]=e,e+=o;return s}},750:e=>{e.exports=function(e,t,n,r,o){return o(e,(function(e,o,a){n=r?(r=!1,e):t(n,e,o,a)})),n}},8794:(e,t,n)=>{var r=n(2100),o=n(4262),a=n(9156);e.exports=function(e,t){return a(o(e,t,r),e+"")}},379:(e,t,n)=>{var r=n(8463),o=n(3082),a=n(6800),i=n(8092),l=n(9793);e.exports=function(e,t,n,s){if(!i(e))return e;for(var u=-1,c=(t=o(t,e)).length,f=c-1,d=e;null!=d&&++u{var r=n(1547),o=n(8528),a=n(2100),i=o?function(e,t){return o(e,"toString",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:a;e.exports=i},9179:e=>{e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},6478:e=>{e.exports=function(e,t){for(var n=-1,r=Array(e);++n{var r=n(7197),o=n(8950),a=n(3629),i=n(152),l=r?r.prototype:void 0,s=l?l.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(a(t))return o(t,e)+"";if(i(t))return s?s.call(t):"";var n=t+"";return"0"==n&&1/t==-Infinity?"-0":n}},821:(e,t,n)=>{var r=n(6050),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},6194:e=>{e.exports=function(e){return function(t){return e(t)}}},9602:(e,t,n)=>{var r=n(692),o=n(9055),a=n(2683),i=n(75),l=n(7730),s=n(2230);e.exports=function(e,t,n){var u=-1,c=o,f=e.length,d=!0,p=[],h=p;if(n)d=!1,c=a;else if(f>=200){var v=t?null:l(e);if(v)return s(v);d=!1,c=i,h=new r}else h=t?[]:p;e:for(;++u{var r=n(8950);e.exports=function(e,t){return r(t,(function(t){return e[t]}))}},2971:e=>{e.exports=function(e,t,n){for(var r=-1,o=e.length,a=t.length,i={};++r{e.exports=function(e,t){return e.has(t)}},3410:(e,t,n)=>{var r=n(2100);e.exports=function(e){return"function"==typeof e?e:r}},3082:(e,t,n)=>{var r=n(3629),o=n(5823),a=n(170),i=n(3518);e.exports=function(e,t){return r(e)?e:o(e,t)?[e]:a(i(e))}},7010:(e,t,n)=>{var r=n(6219);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},4523:(e,t,n)=>{e=n.nmd(e);var r=n(7009),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,i=a&&a.exports===o?r.Buffer:void 0,l=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=l?l(n):new e.constructor(n);return e.copy(r),r}},1022:(e,t,n)=>{var r=n(7010);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}},8503:e=>{var t=/\w*$/;e.exports=function(e){var n=new e.constructor(e.source,t.exec(e));return n.lastIndex=e.lastIndex,n}},4720:(e,t,n)=>{var r=n(7197),o=r?r.prototype:void 0,a=o?o.valueOf:void 0;e.exports=function(e){return a?Object(a.call(e)):{}}},613:(e,t,n)=>{var r=n(7010);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},8558:(e,t,n)=>{var r=n(152);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,a=e===e,i=r(e),l=void 0!==t,s=null===t,u=t===t,c=r(t);if(!s&&!c&&!i&&e>t||i&&l&&u&&!s&&!c||o&&l&&u||!n&&u||!a)return 1;if(!o&&!i&&!c&&e{var r=n(8558);e.exports=function(e,t,n){for(var o=-1,a=e.criteria,i=t.criteria,l=a.length,s=n.length;++o=s?u:u*("desc"==n[o]?-1:1)}return e.index-t.index}},291:e=>{e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n{var r=n(8463),o=n(2526);e.exports=function(e,t,n,a){var i=!n;n||(n={});for(var l=-1,s=t.length;++l{var r=n(4503),o=n(5918);e.exports=function(e,t){return r(e,o(e),t)}},7636:(e,t,n)=>{var r=n(4503),o=n(8487);e.exports=function(e,t){return r(e,o(e),t)}},5525:(e,t,n)=>{var r=n(7009)["__core-js_shared__"];e.exports=r},9934:(e,t,n)=>{var r=n(8794),o=n(3195);e.exports=function(e){return r((function(t,n){var r=-1,a=n.length,i=a>1?n[a-1]:void 0,l=a>2?n[2]:void 0;for(i=e.length>3&&"function"==typeof i?(a--,i):void 0,l&&o(n[0],n[1],l)&&(i=a<3?void 0:i,a=1),t=Object(t);++r{var r=n(1473);e.exports=function(e,t){return function(n,o){if(null==n)return n;if(!r(n))return e(n,o);for(var a=n.length,i=t?a:-1,l=Object(n);(t?i--:++i{e.exports=function(e){return function(t,n,r){for(var o=-1,a=Object(t),i=r(t),l=i.length;l--;){var s=i[e?l:++o];if(!1===n(a[s],s,a))break}return t}}},5481:(e,t,n)=>{var r=n(6025),o=n(1473),a=n(2742);e.exports=function(e){return function(t,n,i){var l=Object(t);if(!o(t)){var s=r(n,3);t=a(t),n=function(e){return s(l[e],e,l)}}var u=e(t,n,i);return u>-1?l[s?t[u]:u]:void 0}}},6381:(e,t,n)=>{var r=n(7255),o=n(3195),a=n(1495);e.exports=function(e){return function(t,n,i){return i&&"number"!=typeof i&&o(t,n,i)&&(n=i=void 0),t=a(t),void 0===n?(n=t,t=0):n=a(n),i=void 0===i?t{var r=n(3924),o=n(9694),a=n(2230),i=r&&1/a(new r([,-0]))[1]==1/0?function(e){return new r(e)}:o;e.exports=i},8528:(e,t,n)=>{var r=n(8136),o=function(){try{var e=r(Object,"defineProperty");return e({},"",{}),e}catch(t){}}();e.exports=o},5305:(e,t,n)=>{var r=n(692),o=n(7897),a=n(75);e.exports=function(e,t,n,i,l,s){var u=1&n,c=e.length,f=t.length;if(c!=f&&!(u&&f>c))return!1;var d=s.get(e),p=s.get(t);if(d&&p)return d==t&&p==e;var h=-1,v=!0,g=2&n?new r:void 0;for(s.set(e,t),s.set(t,e);++h{var r=n(7197),o=n(6219),a=n(9231),i=n(5305),l=n(234),s=n(2230),u=r?r.prototype:void 0,c=u?u.valueOf:void 0;e.exports=function(e,t,n,r,u,f,d){switch(n){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!f(new o(e),new o(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return a(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var p=l;case"[object Set]":var h=1&r;if(p||(p=s),e.size!=t.size&&!h)return!1;var v=d.get(e);if(v)return v==t;r|=2,d.set(e,t);var g=i(p(e),p(t),r,u,f,d);return d.delete(e),g;case"[object Symbol]":if(c)return c.call(e)==c.call(t)}return!1}},8078:(e,t,n)=>{var r=n(8248),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,a,i,l){var s=1&n,u=r(e),c=u.length;if(c!=r(t).length&&!s)return!1;for(var f=c;f--;){var d=u[f];if(!(s?d in t:o.call(t,d)))return!1}var p=l.get(e),h=l.get(t);if(p&&h)return p==t&&h==e;var v=!0;l.set(e,t),l.set(t,e);for(var g=s;++f{var r=n(5506),o=n(4262),a=n(9156);e.exports=function(e){return a(o(e,void 0,r),e+"")}},1032:(e,t,n)=>{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;e.exports=r},8248:(e,t,n)=>{var r=n(1986),o=n(5918),a=n(2742);e.exports=function(e){return r(e,a,o)}},5341:(e,t,n)=>{var r=n(1986),o=n(8487),a=n(3961);e.exports=function(e){return r(e,a,o)}},2799:(e,t,n)=>{var r=n(5964);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},9091:(e,t,n)=>{var r=n(5072),o=n(2742);e.exports=function(e){for(var t=o(e),n=t.length;n--;){var a=t[n],i=e[a];t[n]=[a,i,r(i)]}return t}},8136:(e,t,n)=>{var r=n(6703),o=n(40);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},1137:(e,t,n)=>{var r=n(2709)(Object.getPrototypeOf,Object);e.exports=r},1587:(e,t,n)=>{var r=n(7197),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,l=r?r.toStringTag:void 0;e.exports=function(e){var t=a.call(e,l),n=e[l];try{e[l]=void 0;var r=!0}catch(s){}var o=i.call(e);return r&&(t?e[l]=n:delete e[l]),o}},5918:(e,t,n)=>{var r=n(4903),o=n(8174),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,l=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return a.call(e,t)})))}:o;e.exports=l},8487:(e,t,n)=>{var r=n(1705),o=n(1137),a=n(5918),i=n(8174),l=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)r(t,a(e)),e=o(e);return t}:i;e.exports=l},8383:(e,t,n)=>{var r=n(908),o=n(5797),a=n(8319),i=n(3924),l=n(7091),s=n(9066),u=n(7907),c="[object Map]",f="[object Promise]",d="[object Set]",p="[object WeakMap]",h="[object DataView]",v=u(r),g=u(o),m=u(a),y=u(i),b=u(l),x=s;(r&&x(new r(new ArrayBuffer(1)))!=h||o&&x(new o)!=c||a&&x(a.resolve())!=f||i&&x(new i)!=d||l&&x(new l)!=p)&&(x=function(e){var t=s(e),n="[object Object]"==t?e.constructor:void 0,r=n?u(n):"";if(r)switch(r){case v:return h;case g:return c;case m:return f;case y:return d;case b:return p}return t}),e.exports=x},40:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},6417:(e,t,n)=>{var r=n(3082),o=n(4963),a=n(3629),i=n(6800),l=n(4635),s=n(9793);e.exports=function(e,t,n){for(var u=-1,c=(t=r(t,e)).length,f=!1;++u{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},5403:(e,t,n)=>{var r=n(9620);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},2747:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},6037:(e,t,n)=>{var r=n(9620),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return"__lodash_hash_undefined__"===n?void 0:n}return o.call(t,e)?t[e]:void 0}},4154:(e,t,n)=>{var r=n(9620),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:o.call(t,e)}},7728:(e,t,n)=>{var r=n(9620);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?"__lodash_hash_undefined__":t,this}},9243:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e){var n=e.length,r=new e.constructor(n);return n&&"string"==typeof e[0]&&t.call(e,"index")&&(r.index=e.index,r.input=e.input),r}},9759:(e,t,n)=>{var r=n(7010),o=n(1022),a=n(8503),i=n(4720),l=n(613);e.exports=function(e,t,n){var s=e.constructor;switch(t){case"[object ArrayBuffer]":return r(e);case"[object Boolean]":case"[object Date]":return new s(+e);case"[object DataView]":return o(e,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return l(e,n);case"[object Map]":case"[object Set]":return new s;case"[object Number]":case"[object String]":return new s(e);case"[object RegExp]":return a(e);case"[object Symbol]":return i(e)}}},548:(e,t,n)=>{var r=n(5763),o=n(1137),a=n(2936);e.exports=function(e){return"function"!=typeof e.constructor||a(e)?{}:r(o(e))}},3529:(e,t,n)=>{var r=n(7197),o=n(4963),a=n(3629),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return a(e)||o(e)||!!(i&&e&&e[i])}},6800:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,n){var r=typeof e;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&t.test(e))&&e>-1&&e%1==0&&e{var r=n(9231),o=n(1473),a=n(6800),i=n(8092);e.exports=function(e,t,n){if(!i(n))return!1;var l=typeof t;return!!("number"==l?o(n)&&a(t,n.length):"string"==l&&t in n)&&r(n[t],e)}},5823:(e,t,n)=>{var r=n(3629),o=n(152),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},5964:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},257:(e,t,n)=>{var r=n(5525),o=function(){var e=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();e.exports=function(e){return!!o&&o in e}},2936:e=>{var t=Object.prototype;e.exports=function(e){var n=e&&e.constructor;return e===("function"==typeof n&&n.prototype||t)}},5072:(e,t,n)=>{var r=n(8092);e.exports=function(e){return e===e&&!r(e)}},3894:e=>{e.exports=function(){this.__data__=[],this.size=0}},8699:(e,t,n)=>{var r=n(7112),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():o.call(t,n,1),--this.size,!0)}},4957:(e,t,n)=>{var r=n(7112);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},7184:(e,t,n)=>{var r=n(7112);e.exports=function(e){return r(this.__data__,e)>-1}},7109:(e,t,n)=>{var r=n(7112);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},4086:(e,t,n)=>{var r=n(9676),o=n(8384),a=n(5797);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},9255:(e,t,n)=>{var r=n(2799);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},9186:(e,t,n)=>{var r=n(2799);e.exports=function(e){return r(this,e).get(e)}},3423:(e,t,n)=>{var r=n(2799);e.exports=function(e){return r(this,e).has(e)}},3739:(e,t,n)=>{var r=n(2799);e.exports=function(e,t){var n=r(this,e),o=n.size;return n.set(e,t),this.size+=n.size==o?0:1,this}},234:e=>{e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},284:e=>{e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},4634:(e,t,n)=>{var r=n(9151);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},9620:(e,t,n)=>{var r=n(8136)(Object,"create");e.exports=r},8836:(e,t,n)=>{var r=n(2709)(Object.keys,Object);e.exports=r},4221:e=>{e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},9494:(e,t,n)=>{e=n.nmd(e);var r=n(1032),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,i=a&&a.exports===o&&r.process,l=function(){try{var e=a&&a.require&&a.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(t){}}();e.exports=l},3581:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},2709:e=>{e.exports=function(e,t){return function(n){return e(t(n))}}},4262:(e,t,n)=>{var r=n(3665),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var a=arguments,i=-1,l=o(a.length-t,0),s=Array(l);++i{var r=n(1032),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},5906:e=>{e.exports=function(e,t){if(("constructor"!==t||"function"!==typeof e[t])&&"__proto__"!=t)return e[t]}},5774:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},1596:e=>{e.exports=function(e){return this.__data__.has(e)}},2230:e=>{e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},9156:(e,t,n)=>{var r=n(7532),o=n(3197)(r);e.exports=o},3197:e=>{var t=Date.now;e.exports=function(e){var n=0,r=0;return function(){var o=t(),a=16-(o-r);if(r=o,a>0){if(++n>=800)return arguments[0]}else n=0;return e.apply(void 0,arguments)}}},511:(e,t,n)=>{var r=n(8384);e.exports=function(){this.__data__=new r,this.size=0}},835:e=>{e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},707:e=>{e.exports=function(e){return this.__data__.get(e)}},8832:e=>{e.exports=function(e){return this.__data__.has(e)}},5077:(e,t,n)=>{var r=n(8384),o=n(5797),a=n(8059);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(i)}return n.set(e,t),this.size=n.size,this}},7167:e=>{e.exports=function(e,t,n){for(var r=n-1,o=e.length;++r{var r=n(405),o=n(7302),a=n(3007);e.exports=function(e){return o(e)?a(e):r(e)}},170:(e,t,n)=>{var r=n(4634),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(o,(function(e,n,r,o){t.push(r?o.replace(a,"$1"):n||e)})),t}));e.exports=i},9793:(e,t,n)=>{var r=n(152);e.exports=function(e){if("string"==typeof e||r(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t}},7907:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(n){}try{return e+""}catch(n){}}return""}},6050:e=>{var t=/\s/;e.exports=function(e){for(var n=e.length;n--&&t.test(e.charAt(n)););return n}},3007:e=>{var t="[\\ud800-\\udfff]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",r="\\ud83c[\\udffb-\\udfff]",o="[^\\ud800-\\udfff]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",i="[\\ud800-\\udbff][\\udc00-\\udfff]",l="(?:"+n+"|"+r+")"+"?",s="[\\ufe0e\\ufe0f]?",u=s+l+("(?:\\u200d(?:"+[o,a,i].join("|")+")"+s+l+")*"),c="(?:"+[o+n+"?",n,a,i,t].join("|")+")",f=RegExp(r+"(?="+r+")|"+c+u,"g");e.exports=function(e){for(var t=f.lastIndex=0;f.test(e);)++t;return t}},8787:(e,t,n)=>{var r=n(1905);e.exports=function(e){return r(e,4)}},8121:(e,t,n)=>{var r=n(1905);e.exports=function(e){return r(e,5)}},1547:e=>{e.exports=function(e){return function(){return e}}},8573:(e,t,n)=>{var r=n(8092),o=n(72),a=n(2582),i=Math.max,l=Math.min;e.exports=function(e,t,n){var s,u,c,f,d,p,h=0,v=!1,g=!1,m=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function y(t){var n=s,r=u;return s=u=void 0,h=t,f=e.apply(r,n)}function b(e){return h=e,d=setTimeout(w,t),v?y(e):f}function x(e){var n=e-p;return void 0===p||n>=t||n<0||g&&e-h>=c}function w(){var e=o();if(x(e))return E(e);d=setTimeout(w,function(e){var n=t-(e-p);return g?l(n,c-(e-h)):n}(e))}function E(e){return d=void 0,m&&s?y(e):(s=u=void 0,f)}function k(){var e=o(),n=x(e);if(s=arguments,u=this,p=e,n){if(void 0===d)return b(p);if(g)return clearTimeout(d),d=setTimeout(w,t),y(p)}return void 0===d&&(d=setTimeout(w,t)),f}return t=a(t)||0,r(n)&&(v=!!n.leading,c=(g="maxWait"in n)?i(a(n.maxWait)||0,t):c,m="trailing"in n?!!n.trailing:m),k.cancel=function(){void 0!==d&&clearTimeout(d),h=0,s=p=u=d=void 0},k.flush=function(){return void 0===d?f:E(o())},k}},6933:(e,t,n)=>{var r=n(8794),o=n(9231),a=n(3195),i=n(3961),l=Object.prototype,s=l.hasOwnProperty,u=r((function(e,t){e=Object(e);var n=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&a(t[0],t[1],u)&&(r=1);++n{e.exports=n(6514)},9231:e=>{e.exports=function(e,t){return e===t||e!==e&&t!==t}},86:(e,t,n)=>{var r=n(4903),o=n(7523),a=n(6025),i=n(3629);e.exports=function(e,t){return(i(e)?r:o)(e,a(t,3))}},1211:(e,t,n)=>{var r=n(5481)(n(1475));e.exports=r},1475:(e,t,n)=>{var r=n(2045),o=n(6025),a=n(9753),i=Math.max;e.exports=function(e,t,n){var l=null==e?0:e.length;if(!l)return-1;var s=null==n?0:a(n);return s<0&&(s=i(l+s,0)),r(e,o(t,3),s)}},5506:(e,t,n)=>{var r=n(5182);e.exports=function(e){return(null==e?0:e.length)?r(e,1):[]}},6514:(e,t,n)=>{var r=n(4550),o=n(7927),a=n(3410),i=n(3629);e.exports=function(e,t){return(i(e)?r:o)(e,a(t))}},9144:(e,t,n)=>{var r=n(5099),o=n(3410),a=n(3961);e.exports=function(e,t){return null==e?e:r(e,o(t),a)}},6181:(e,t,n)=>{var r=n(8667);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},7805:(e,t,n)=>{var r=n(7852),o=n(6417);e.exports=function(e,t){return null!=e&&o(e,t,r)}},5658:(e,t,n)=>{var r=n(529),o=n(6417);e.exports=function(e,t){return null!=e&&o(e,t,r)}},2100:e=>{e.exports=function(e){return e}},4963:(e,t,n)=>{var r=n(4906),o=n(3141),a=Object.prototype,i=a.hasOwnProperty,l=a.propertyIsEnumerable,s=r(function(){return arguments}())?r:function(e){return o(e)&&i.call(e,"callee")&&!l.call(e,"callee")};e.exports=s},3629:e=>{var t=Array.isArray;e.exports=t},1473:(e,t,n)=>{var r=n(4786),o=n(4635);e.exports=function(e){return null!=e&&o(e.length)&&!r(e)}},6279:(e,t,n)=>{var r=n(1473),o=n(3141);e.exports=function(e){return o(e)&&r(e)}},5174:(e,t,n)=>{e=n.nmd(e);var r=n(7009),o=n(9488),a=t&&!t.nodeType&&t,i=a&&e&&!e.nodeType&&e,l=i&&i.exports===a?r.Buffer:void 0,s=(l?l.isBuffer:void 0)||o;e.exports=s},6364:(e,t,n)=>{var r=n(3654),o=n(8383),a=n(4963),i=n(3629),l=n(1473),s=n(5174),u=n(2936),c=n(9102),f=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(l(e)&&(i(e)||"string"==typeof e||"function"==typeof e.splice||s(e)||c(e)||a(e)))return!e.length;var t=o(e);if("[object Map]"==t||"[object Set]"==t)return!e.size;if(u(e))return!r(e).length;for(var n in e)if(f.call(e,n))return!1;return!0}},8111:(e,t,n)=>{var r=n(1848);e.exports=function(e,t){return r(e,t)}},4786:(e,t,n)=>{var r=n(9066),o=n(8092);e.exports=function(e){if(!o(e))return!1;var t=r(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},4635:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},103:(e,t,n)=>{var r=n(3085),o=n(6194),a=n(9494),i=a&&a.isMap,l=i?o(i):r;e.exports=l},8092:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},3141:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3977:(e,t,n)=>{var r=n(9066),o=n(1137),a=n(3141),i=Function.prototype,l=Object.prototype,s=i.toString,u=l.hasOwnProperty,c=s.call(Object);e.exports=function(e){if(!a(e)||"[object Object]"!=r(e))return!1;var t=o(e);if(null===t)return!0;var n=u.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&s.call(n)==c}},6995:(e,t,n)=>{var r=n(8680),o=n(6194),a=n(9494),i=a&&a.isSet,l=i?o(i):r;e.exports=l},6769:(e,t,n)=>{var r=n(9066),o=n(3629),a=n(3141);e.exports=function(e){return"string"==typeof e||!o(e)&&a(e)&&"[object String]"==r(e)}},152:(e,t,n)=>{var r=n(9066),o=n(3141);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},9102:(e,t,n)=>{var r=n(8150),o=n(6194),a=n(9494),i=a&&a.isTypedArray,l=i?o(i):r;e.exports=l},2530:e=>{e.exports=function(e){return void 0===e}},2742:(e,t,n)=>{var r=n(7538),o=n(3654),a=n(1473);e.exports=function(e){return a(e)?r(e):o(e)}},3961:(e,t,n)=>{var r=n(7538),o=n(8664),a=n(1473);e.exports=function(e){return a(e)?r(e,!0):o(e)}},5727:e=>{e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},763:function(e,t,n){var r;e=n.nmd(e),function(){var o,a="Expected a function",i="__lodash_hash_undefined__",l="__lodash_placeholder__",s=16,u=32,c=64,f=128,d=256,p=1/0,h=9007199254740991,v=NaN,g=4294967295,m=[["ary",f],["bind",1],["bindKey",2],["curry",8],["curryRight",s],["flip",512],["partial",u],["partialRight",c],["rearg",d]],y="[object Arguments]",b="[object Array]",x="[object Boolean]",w="[object Date]",E="[object Error]",k="[object Function]",C="[object GeneratorFunction]",S="[object Map]",_="[object Number]",N="[object Object]",P="[object Promise]",O="[object RegExp]",T="[object Set]",M="[object String]",I="[object Symbol]",D="[object WeakMap]",R="[object ArrayBuffer]",A="[object DataView]",j="[object Float32Array]",L="[object Float64Array]",z="[object Int8Array]",F="[object Int16Array]",B="[object Int32Array]",V="[object Uint8Array]",K="[object Uint8ClampedArray]",H="[object Uint16Array]",W="[object Uint32Array]",q=/\b__p \+= '';/g,U=/\b(__p \+=) '' \+/g,Y=/(__e\(.*?\)|\b__t\)) \+\n'';/g,X=/&(?:amp|lt|gt|quot|#39);/g,$=/[&<>"']/g,G=RegExp(X.source),Q=RegExp($.source),Z=/<%-([\s\S]+?)%>/g,J=/<%([\s\S]+?)%>/g,ee=/<%=([\s\S]+?)%>/g,te=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ne=/^\w*$/,re=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,oe=/[\\^$.*+?()[\]{}|]/g,ae=RegExp(oe.source),ie=/^\s+/,le=/\s/,se=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ue=/\{\n\/\* \[wrapped with (.+)\] \*/,ce=/,? & /,fe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,de=/[()=,{}\[\]\/\s]/,pe=/\\(\\)?/g,he=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ve=/\w*$/,ge=/^[-+]0x[0-9a-f]+$/i,me=/^0b[01]+$/i,ye=/^\[object .+?Constructor\]$/,be=/^0o[0-7]+$/i,xe=/^(?:0|[1-9]\d*)$/,we=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ee=/($^)/,ke=/['\n\r\u2028\u2029\\]/g,Ce="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Se="\\u2700-\\u27bf",_e="a-z\\xdf-\\xf6\\xf8-\\xff",Ne="A-Z\\xc0-\\xd6\\xd8-\\xde",Pe="\\ufe0e\\ufe0f",Oe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Te="['\u2019]",Me="[\\ud800-\\udfff]",Ie="["+Oe+"]",De="["+Ce+"]",Re="\\d+",Ae="[\\u2700-\\u27bf]",je="["+_e+"]",Le="[^\\ud800-\\udfff"+Oe+Re+Se+_e+Ne+"]",ze="\\ud83c[\\udffb-\\udfff]",Fe="[^\\ud800-\\udfff]",Be="(?:\\ud83c[\\udde6-\\uddff]){2}",Ve="[\\ud800-\\udbff][\\udc00-\\udfff]",Ke="["+Ne+"]",He="(?:"+je+"|"+Le+")",We="(?:"+Ke+"|"+Le+")",qe="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Ue="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",Ye="(?:"+De+"|"+ze+")"+"?",Xe="[\\ufe0e\\ufe0f]?",$e=Xe+Ye+("(?:\\u200d(?:"+[Fe,Be,Ve].join("|")+")"+Xe+Ye+")*"),Ge="(?:"+[Ae,Be,Ve].join("|")+")"+$e,Qe="(?:"+[Fe+De+"?",De,Be,Ve,Me].join("|")+")",Ze=RegExp(Te,"g"),Je=RegExp(De,"g"),et=RegExp(ze+"(?="+ze+")|"+Qe+$e,"g"),tt=RegExp([Ke+"?"+je+"+"+qe+"(?="+[Ie,Ke,"$"].join("|")+")",We+"+"+Ue+"(?="+[Ie,Ke+He,"$"].join("|")+")",Ke+"?"+He+"+"+qe,Ke+"+"+Ue,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Re,Ge].join("|"),"g"),nt=RegExp("[\\u200d\\ud800-\\udfff"+Ce+Pe+"]"),rt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ot=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],at=-1,it={};it[j]=it[L]=it[z]=it[F]=it[B]=it[V]=it[K]=it[H]=it[W]=!0,it[y]=it[b]=it[R]=it[x]=it[A]=it[w]=it[E]=it[k]=it[S]=it[_]=it[N]=it[O]=it[T]=it[M]=it[D]=!1;var lt={};lt[y]=lt[b]=lt[R]=lt[A]=lt[x]=lt[w]=lt[j]=lt[L]=lt[z]=lt[F]=lt[B]=lt[S]=lt[_]=lt[N]=lt[O]=lt[T]=lt[M]=lt[I]=lt[V]=lt[K]=lt[H]=lt[W]=!0,lt[E]=lt[k]=lt[D]=!1;var st={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ut=parseFloat,ct=parseInt,ft="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,dt="object"==typeof self&&self&&self.Object===Object&&self,pt=ft||dt||Function("return this")(),ht=t&&!t.nodeType&&t,vt=ht&&e&&!e.nodeType&&e,gt=vt&&vt.exports===ht,mt=gt&&ft.process,yt=function(){try{var e=vt&&vt.require&&vt.require("util").types;return e||mt&&mt.binding&&mt.binding("util")}catch(t){}}(),bt=yt&&yt.isArrayBuffer,xt=yt&&yt.isDate,wt=yt&&yt.isMap,Et=yt&&yt.isRegExp,kt=yt&&yt.isSet,Ct=yt&&yt.isTypedArray;function St(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function _t(e,t,n,r){for(var o=-1,a=null==e?0:e.length;++o-1}function It(e,t,n){for(var r=-1,o=null==e?0:e.length;++r-1;);return n}function tn(e,t){for(var n=e.length;n--&&Vt(t,e[n],0)>-1;);return n}function nn(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&++r;return r}var rn=Ut({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),on=Ut({"&":"&","<":"<",">":">",'"':""","'":"'"});function an(e){return"\\"+st[e]}function ln(e){return nt.test(e)}function sn(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}function un(e,t){return function(n){return e(t(n))}}function cn(e,t){for(var n=-1,r=e.length,o=0,a=[];++n",""":'"',"'":"'"});var mn=function e(t){var n=(t=null==t?pt:mn.defaults(pt.Object(),t,mn.pick(pt,ot))).Array,r=t.Date,le=t.Error,Ce=t.Function,Se=t.Math,_e=t.Object,Ne=t.RegExp,Pe=t.String,Oe=t.TypeError,Te=n.prototype,Me=Ce.prototype,Ie=_e.prototype,De=t["__core-js_shared__"],Re=Me.toString,Ae=Ie.hasOwnProperty,je=0,Le=function(){var e=/[^.]+$/.exec(De&&De.keys&&De.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),ze=Ie.toString,Fe=Re.call(_e),Be=pt._,Ve=Ne("^"+Re.call(Ae).replace(oe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ke=gt?t.Buffer:o,He=t.Symbol,We=t.Uint8Array,qe=Ke?Ke.allocUnsafe:o,Ue=un(_e.getPrototypeOf,_e),Ye=_e.create,Xe=Ie.propertyIsEnumerable,$e=Te.splice,Ge=He?He.isConcatSpreadable:o,Qe=He?He.iterator:o,et=He?He.toStringTag:o,nt=function(){try{var e=pa(_e,"defineProperty");return e({},"",{}),e}catch(t){}}(),st=t.clearTimeout!==pt.clearTimeout&&t.clearTimeout,ft=r&&r.now!==pt.Date.now&&r.now,dt=t.setTimeout!==pt.setTimeout&&t.setTimeout,ht=Se.ceil,vt=Se.floor,mt=_e.getOwnPropertySymbols,yt=Ke?Ke.isBuffer:o,zt=t.isFinite,Ut=Te.join,yn=un(_e.keys,_e),bn=Se.max,xn=Se.min,wn=r.now,En=t.parseInt,kn=Se.random,Cn=Te.reverse,Sn=pa(t,"DataView"),_n=pa(t,"Map"),Nn=pa(t,"Promise"),Pn=pa(t,"Set"),On=pa(t,"WeakMap"),Tn=pa(_e,"create"),Mn=On&&new On,In={},Dn=Ba(Sn),Rn=Ba(_n),An=Ba(Nn),jn=Ba(Pn),Ln=Ba(On),zn=He?He.prototype:o,Fn=zn?zn.valueOf:o,Bn=zn?zn.toString:o;function Vn(e){if(rl(e)&&!Ui(e)&&!(e instanceof qn)){if(e instanceof Wn)return e;if(Ae.call(e,"__wrapped__"))return Va(e)}return new Wn(e)}var Kn=function(){function e(){}return function(t){if(!nl(t))return{};if(Ye)return Ye(t);e.prototype=t;var n=new e;return e.prototype=o,n}}();function Hn(){}function Wn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function qn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=g,this.__views__=[]}function Un(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function ur(e,t,n,r,a,i){var l,s=1&t,u=2&t,c=4&t;if(n&&(l=a?n(e,r,a,i):n(e)),l!==o)return l;if(!nl(e))return e;var f=Ui(e);if(f){if(l=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Ae.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!s)return Mo(e,l)}else{var d=ga(e),p=d==k||d==C;if(Gi(e))return So(e,s);if(d==N||d==y||p&&!a){if(l=u||p?{}:ya(e),!s)return u?function(e,t){return Io(e,va(e),t)}(e,function(e,t){return e&&Io(t,Rl(t),e)}(l,e)):function(e,t){return Io(e,ha(e),t)}(e,ar(l,e))}else{if(!lt[d])return a?e:{};l=function(e,t,n){var r=e.constructor;switch(t){case R:return _o(e);case x:case w:return new r(+e);case A:return function(e,t){var n=t?_o(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case j:case L:case z:case F:case B:case V:case K:case H:case W:return No(e,n);case S:return new r;case _:case M:return new r(e);case O:return function(e){var t=new e.constructor(e.source,ve.exec(e));return t.lastIndex=e.lastIndex,t}(e);case T:return new r;case I:return o=e,Fn?_e(Fn.call(o)):{}}var o}(e,d,s)}}i||(i=new Gn);var h=i.get(e);if(h)return h;i.set(e,l),sl(e)?e.forEach((function(r){l.add(ur(r,t,n,r,e,i))})):ol(e)&&e.forEach((function(r,o){l.set(o,ur(r,t,n,o,e,i))}));var v=f?o:(c?u?ia:aa:u?Rl:Dl)(e);return Nt(v||e,(function(r,o){v&&(r=e[o=r]),nr(l,o,ur(r,t,n,o,e,i))})),l}function cr(e,t,n){var r=n.length;if(null==e)return!r;for(e=_e(e);r--;){var a=n[r],i=t[a],l=e[a];if(l===o&&!(a in e)||!i(l))return!1}return!0}function fr(e,t,n){if("function"!=typeof e)throw new Oe(a);return Da((function(){e.apply(o,n)}),t)}function dr(e,t,n,r){var o=-1,a=Mt,i=!0,l=e.length,s=[],u=t.length;if(!l)return s;n&&(t=Dt(t,Qt(n))),r?(a=It,i=!1):t.length>=200&&(a=Jt,i=!1,t=new $n(t));e:for(;++o-1},Yn.prototype.set=function(e,t){var n=this.__data__,r=rr(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Xn.prototype.clear=function(){this.size=0,this.__data__={hash:new Un,map:new(_n||Yn),string:new Un}},Xn.prototype.delete=function(e){var t=fa(this,e).delete(e);return this.size-=t?1:0,t},Xn.prototype.get=function(e){return fa(this,e).get(e)},Xn.prototype.has=function(e){return fa(this,e).has(e)},Xn.prototype.set=function(e,t){var n=fa(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},$n.prototype.add=$n.prototype.push=function(e){return this.__data__.set(e,i),this},$n.prototype.has=function(e){return this.__data__.has(e)},Gn.prototype.clear=function(){this.__data__=new Yn,this.size=0},Gn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Gn.prototype.get=function(e){return this.__data__.get(e)},Gn.prototype.has=function(e){return this.__data__.has(e)},Gn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Yn){var r=n.__data__;if(!_n||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Xn(r)}return n.set(e,t),this.size=n.size,this};var pr=Ao(wr),hr=Ao(Er,!0);function vr(e,t){var n=!0;return pr(e,(function(e,r,o){return n=!!t(e,r,o)})),n}function gr(e,t,n){for(var r=-1,a=e.length;++r0&&n(l)?t>1?yr(l,t-1,n,r,o):Rt(o,l):r||(o[o.length]=l)}return o}var br=jo(),xr=jo(!0);function wr(e,t){return e&&br(e,t,Dl)}function Er(e,t){return e&&xr(e,t,Dl)}function kr(e,t){return Tt(t,(function(t){return Ji(e[t])}))}function Cr(e,t){for(var n=0,r=(t=wo(t,e)).length;null!=e&&nt}function Pr(e,t){return null!=e&&Ae.call(e,t)}function Or(e,t){return null!=e&&t in _e(e)}function Tr(e,t,r){for(var a=r?It:Mt,i=e[0].length,l=e.length,s=l,u=n(l),c=1/0,f=[];s--;){var d=e[s];s&&t&&(d=Dt(d,Qt(t))),c=xn(d.length,c),u[s]=!r&&(t||i>=120&&d.length>=120)?new $n(s&&d):o}d=e[0];var p=-1,h=u[0];e:for(;++p=l?s:s*("desc"==n[r]?-1:1)}return e.index-t.index}(e,t,n)}))}function Ur(e,t,n){for(var r=-1,o=t.length,a={};++r-1;)l!==e&&$e.call(l,s,1),$e.call(e,s,1);return e}function Xr(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==a){var a=o;xa(o)?$e.call(e,o,1):po(e,o)}}return e}function $r(e,t){return e+vt(kn()*(t-e+1))}function Gr(e,t){var n="";if(!e||t<1||t>h)return n;do{t%2&&(n+=e),(t=vt(t/2))&&(e+=e)}while(t);return n}function Qr(e,t){return Ra(Pa(e,t,as),e+"")}function Zr(e){return Zn(Kl(e))}function Jr(e,t){var n=Kl(e);return La(n,sr(t,0,n.length))}function eo(e,t,n,r){if(!nl(e))return e;for(var a=-1,i=(t=wo(t,e)).length,l=i-1,s=e;null!=s&&++aa?0:a+t),(r=r>a?a:r)<0&&(r+=a),a=t>r?0:r-t>>>0,t>>>=0;for(var i=n(a);++o>>1,i=e[a];null!==i&&!cl(i)&&(n?i<=t:i=200){var u=t?null:Qo(e);if(u)return fn(u);i=!1,o=Jt,s=new $n}else s=t?[]:l;e:for(;++r=r?e:oo(e,t,n)}var Co=st||function(e){return pt.clearTimeout(e)};function So(e,t){if(t)return e.slice();var n=e.length,r=qe?qe(n):new e.constructor(n);return e.copy(r),r}function _o(e){var t=new e.constructor(e.byteLength);return new We(t).set(new We(e)),t}function No(e,t){var n=t?_o(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function Po(e,t){if(e!==t){var n=e!==o,r=null===e,a=e===e,i=cl(e),l=t!==o,s=null===t,u=t===t,c=cl(t);if(!s&&!c&&!i&&e>t||i&&l&&u&&!s&&!c||r&&l&&u||!n&&u||!a)return 1;if(!r&&!i&&!c&&e1?n[a-1]:o,l=a>2?n[2]:o;for(i=e.length>3&&"function"==typeof i?(a--,i):o,l&&wa(n[0],n[1],l)&&(i=a<3?o:i,a=1),t=_e(t);++r-1?a[i?t[l]:l]:o}}function Vo(e){return oa((function(t){var n=t.length,r=n,i=Wn.prototype.thru;for(e&&t.reverse();r--;){var l=t[r];if("function"!=typeof l)throw new Oe(a);if(i&&!s&&"wrapper"==sa(l))var s=new Wn([],!0)}for(r=s?r:n;++r1&&b.reverse(),p&&cs))return!1;var c=i.get(e),f=i.get(t);if(c&&f)return c==t&&f==e;var d=-1,p=!0,h=2&n?new $n:o;for(i.set(e,t),i.set(t,e);++d-1&&e%1==0&&e1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(se,"{\n/* [wrapped with "+t+"] */\n")}(r,function(e,t){return Nt(m,(function(n){var r="_."+n[0];t&n[1]&&!Mt(e,r)&&e.push(r)})),e.sort()}(function(e){var t=e.match(ue);return t?t[1].split(ce):[]}(r),n)))}function ja(e){var t=0,n=0;return function(){var r=wn(),a=16-(r-n);if(n=r,a>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(o,arguments)}}function La(e,t){var n=-1,r=e.length,a=r-1;for(t=t===o?r:t;++n1?e[t-1]:o;return n="function"==typeof n?(e.pop(),n):o,li(e,n)}));function hi(e){var t=Vn(e);return t.__chain__=!0,t}function vi(e,t){return t(e)}var gi=oa((function(e){var t=e.length,n=t?e[0]:0,r=this.__wrapped__,a=function(t){return lr(t,e)};return!(t>1||this.__actions__.length)&&r instanceof qn&&xa(n)?((r=r.slice(n,+n+(t?1:0))).__actions__.push({func:vi,args:[a],thisArg:o}),new Wn(r,this.__chain__).thru((function(e){return t&&!e.length&&e.push(o),e}))):this.thru(a)}));var mi=Do((function(e,t,n){Ae.call(e,n)?++e[n]:ir(e,n,1)}));var yi=Bo(qa),bi=Bo(Ua);function xi(e,t){return(Ui(e)?Nt:pr)(e,ca(t,3))}function wi(e,t){return(Ui(e)?Pt:hr)(e,ca(t,3))}var Ei=Do((function(e,t,n){Ae.call(e,n)?e[n].push(t):ir(e,n,[t])}));var ki=Qr((function(e,t,r){var o=-1,a="function"==typeof t,i=Xi(e)?n(e.length):[];return pr(e,(function(e){i[++o]=a?St(t,e,r):Mr(e,t,r)})),i})),Ci=Do((function(e,t,n){ir(e,n,t)}));function Si(e,t){return(Ui(e)?Dt:Br)(e,ca(t,3))}var _i=Do((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var Ni=Qr((function(e,t){if(null==e)return[];var n=t.length;return n>1&&wa(e,t[0],t[1])?t=[]:n>2&&wa(t[0],t[1],t[2])&&(t=[t[0]]),qr(e,yr(t,1),[])})),Pi=ft||function(){return pt.Date.now()};function Oi(e,t,n){return t=n?o:t,t=e&&null==t?e.length:t,Jo(e,f,o,o,o,o,t)}function Ti(e,t){var n;if("function"!=typeof t)throw new Oe(a);return e=gl(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=o),n}}var Mi=Qr((function(e,t,n){var r=1;if(n.length){var o=cn(n,ua(Mi));r|=u}return Jo(e,r,t,n,o)})),Ii=Qr((function(e,t,n){var r=3;if(n.length){var o=cn(n,ua(Ii));r|=u}return Jo(t,r,e,n,o)}));function Di(e,t,n){var r,i,l,s,u,c,f=0,d=!1,p=!1,h=!0;if("function"!=typeof e)throw new Oe(a);function v(t){var n=r,a=i;return r=i=o,f=t,s=e.apply(a,n)}function g(e){return f=e,u=Da(y,t),d?v(e):s}function m(e){var n=e-c;return c===o||n>=t||n<0||p&&e-f>=l}function y(){var e=Pi();if(m(e))return b(e);u=Da(y,function(e){var n=t-(e-c);return p?xn(n,l-(e-f)):n}(e))}function b(e){return u=o,h&&r?v(e):(r=i=o,s)}function x(){var e=Pi(),n=m(e);if(r=arguments,i=this,c=e,n){if(u===o)return g(c);if(p)return Co(u),u=Da(y,t),v(c)}return u===o&&(u=Da(y,t)),s}return t=yl(t)||0,nl(n)&&(d=!!n.leading,l=(p="maxWait"in n)?bn(yl(n.maxWait)||0,t):l,h="trailing"in n?!!n.trailing:h),x.cancel=function(){u!==o&&Co(u),f=0,r=c=i=u=o},x.flush=function(){return u===o?s:b(Pi())},x}var Ri=Qr((function(e,t){return fr(e,1,t)})),Ai=Qr((function(e,t,n){return fr(e,yl(t)||0,n)}));function ji(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new Oe(a);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(ji.Cache||Xn),n}function Li(e){if("function"!=typeof e)throw new Oe(a);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}ji.Cache=Xn;var zi=Eo((function(e,t){var n=(t=1==t.length&&Ui(t[0])?Dt(t[0],Qt(ca())):Dt(yr(t,1),Qt(ca()))).length;return Qr((function(r){for(var o=-1,a=xn(r.length,n);++o=t})),qi=Ir(function(){return arguments}())?Ir:function(e){return rl(e)&&Ae.call(e,"callee")&&!Xe.call(e,"callee")},Ui=n.isArray,Yi=bt?Qt(bt):function(e){return rl(e)&&_r(e)==R};function Xi(e){return null!=e&&tl(e.length)&&!Ji(e)}function $i(e){return rl(e)&&Xi(e)}var Gi=yt||ys,Qi=xt?Qt(xt):function(e){return rl(e)&&_r(e)==w};function Zi(e){if(!rl(e))return!1;var t=_r(e);return t==E||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!il(e)}function Ji(e){if(!nl(e))return!1;var t=_r(e);return t==k||t==C||"[object AsyncFunction]"==t||"[object Proxy]"==t}function el(e){return"number"==typeof e&&e==gl(e)}function tl(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=h}function nl(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function rl(e){return null!=e&&"object"==typeof e}var ol=wt?Qt(wt):function(e){return rl(e)&&ga(e)==S};function al(e){return"number"==typeof e||rl(e)&&_r(e)==_}function il(e){if(!rl(e)||_r(e)!=N)return!1;var t=Ue(e);if(null===t)return!0;var n=Ae.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Re.call(n)==Fe}var ll=Et?Qt(Et):function(e){return rl(e)&&_r(e)==O};var sl=kt?Qt(kt):function(e){return rl(e)&&ga(e)==T};function ul(e){return"string"==typeof e||!Ui(e)&&rl(e)&&_r(e)==M}function cl(e){return"symbol"==typeof e||rl(e)&&_r(e)==I}var fl=Ct?Qt(Ct):function(e){return rl(e)&&tl(e.length)&&!!it[_r(e)]};var dl=Xo(Fr),pl=Xo((function(e,t){return e<=t}));function hl(e){if(!e)return[];if(Xi(e))return ul(e)?hn(e):Mo(e);if(Qe&&e[Qe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Qe]());var t=ga(e);return(t==S?sn:t==T?fn:Kl)(e)}function vl(e){return e?(e=yl(e))===p||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}function gl(e){var t=vl(e),n=t%1;return t===t?n?t-n:t:0}function ml(e){return e?sr(gl(e),0,g):0}function yl(e){if("number"==typeof e)return e;if(cl(e))return v;if(nl(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=nl(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Gt(e);var n=me.test(e);return n||be.test(e)?ct(e.slice(2),n?2:8):ge.test(e)?v:+e}function bl(e){return Io(e,Rl(e))}function xl(e){return null==e?"":co(e)}var wl=Ro((function(e,t){if(Sa(t)||Xi(t))Io(t,Dl(t),e);else for(var n in t)Ae.call(t,n)&&nr(e,n,t[n])})),El=Ro((function(e,t){Io(t,Rl(t),e)})),kl=Ro((function(e,t,n,r){Io(t,Rl(t),e,r)})),Cl=Ro((function(e,t,n,r){Io(t,Dl(t),e,r)})),Sl=oa(lr);var _l=Qr((function(e,t){e=_e(e);var n=-1,r=t.length,a=r>2?t[2]:o;for(a&&wa(t[0],t[1],a)&&(r=1);++n1),t})),Io(e,ia(e),n),r&&(n=ur(n,7,na));for(var o=t.length;o--;)po(n,t[o]);return n}));var zl=oa((function(e,t){return null==e?{}:function(e,t){return Ur(e,t,(function(t,n){return Ol(e,n)}))}(e,t)}));function Fl(e,t){if(null==e)return{};var n=Dt(ia(e),(function(e){return[e]}));return t=ca(t),Ur(e,n,(function(e,n){return t(e,n[0])}))}var Bl=Zo(Dl),Vl=Zo(Rl);function Kl(e){return null==e?[]:Zt(e,Dl(e))}var Hl=zo((function(e,t,n){return t=t.toLowerCase(),e+(n?Wl(t):t)}));function Wl(e){return Zl(xl(e).toLowerCase())}function ql(e){return(e=xl(e))&&e.replace(we,rn).replace(Je,"")}var Ul=zo((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Yl=zo((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Xl=Lo("toLowerCase");var $l=zo((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Gl=zo((function(e,t,n){return e+(n?" ":"")+Zl(t)}));var Ql=zo((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Zl=Lo("toUpperCase");function Jl(e,t,n){return e=xl(e),(t=n?o:t)===o?function(e){return rt.test(e)}(e)?function(e){return e.match(tt)||[]}(e):function(e){return e.match(fe)||[]}(e):e.match(t)||[]}var es=Qr((function(e,t){try{return St(e,o,t)}catch(n){return Zi(n)?n:new le(n)}})),ts=oa((function(e,t){return Nt(t,(function(t){t=Fa(t),ir(e,t,Mi(e[t],e))})),e}));function ns(e){return function(){return e}}var rs=Vo(),os=Vo(!0);function as(e){return e}function is(e){return jr("function"==typeof e?e:ur(e,1))}var ls=Qr((function(e,t){return function(n){return Mr(n,e,t)}})),ss=Qr((function(e,t){return function(n){return Mr(e,n,t)}}));function us(e,t,n){var r=Dl(t),o=kr(t,r);null!=n||nl(t)&&(o.length||!r.length)||(n=t,t=e,e=this,o=kr(t,Dl(t)));var a=!(nl(n)&&"chain"in n)||!!n.chain,i=Ji(e);return Nt(o,(function(n){var r=t[n];e[n]=r,i&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__),o=n.__actions__=Mo(this.__actions__);return o.push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,Rt([this.value()],arguments))})})),e}function cs(){}var fs=qo(Dt),ds=qo(Ot),ps=qo(Lt);function hs(e){return Ea(e)?qt(Fa(e)):function(e){return function(t){return Cr(t,e)}}(e)}var vs=Yo(),gs=Yo(!0);function ms(){return[]}function ys(){return!1}var bs=Wo((function(e,t){return e+t}),0),xs=Go("ceil"),ws=Wo((function(e,t){return e/t}),1),Es=Go("floor");var ks=Wo((function(e,t){return e*t}),1),Cs=Go("round"),Ss=Wo((function(e,t){return e-t}),0);return Vn.after=function(e,t){if("function"!=typeof t)throw new Oe(a);return e=gl(e),function(){if(--e<1)return t.apply(this,arguments)}},Vn.ary=Oi,Vn.assign=wl,Vn.assignIn=El,Vn.assignInWith=kl,Vn.assignWith=Cl,Vn.at=Sl,Vn.before=Ti,Vn.bind=Mi,Vn.bindAll=ts,Vn.bindKey=Ii,Vn.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Ui(e)?e:[e]},Vn.chain=hi,Vn.chunk=function(e,t,r){t=(r?wa(e,t,r):t===o)?1:bn(gl(t),0);var a=null==e?0:e.length;if(!a||t<1)return[];for(var i=0,l=0,s=n(ht(a/t));ia?0:a+n),(r=r===o||r>a?a:gl(r))<0&&(r+=a),r=n>r?0:ml(r);n>>0)?(e=xl(e))&&("string"==typeof t||null!=t&&!ll(t))&&!(t=co(t))&&ln(e)?ko(hn(e),0,n):e.split(t,n):[]},Vn.spread=function(e,t){if("function"!=typeof e)throw new Oe(a);return t=null==t?0:bn(gl(t),0),Qr((function(n){var r=n[t],o=ko(n,0,t);return r&&Rt(o,r),St(e,this,o)}))},Vn.tail=function(e){var t=null==e?0:e.length;return t?oo(e,1,t):[]},Vn.take=function(e,t,n){return e&&e.length?oo(e,0,(t=n||t===o?1:gl(t))<0?0:t):[]},Vn.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?oo(e,(t=r-(t=n||t===o?1:gl(t)))<0?0:t,r):[]},Vn.takeRightWhile=function(e,t){return e&&e.length?vo(e,ca(t,3),!1,!0):[]},Vn.takeWhile=function(e,t){return e&&e.length?vo(e,ca(t,3)):[]},Vn.tap=function(e,t){return t(e),e},Vn.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new Oe(a);return nl(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),Di(e,t,{leading:r,maxWait:t,trailing:o})},Vn.thru=vi,Vn.toArray=hl,Vn.toPairs=Bl,Vn.toPairsIn=Vl,Vn.toPath=function(e){return Ui(e)?Dt(e,Fa):cl(e)?[e]:Mo(za(xl(e)))},Vn.toPlainObject=bl,Vn.transform=function(e,t,n){var r=Ui(e),o=r||Gi(e)||fl(e);if(t=ca(t,4),null==n){var a=e&&e.constructor;n=o?r?new a:[]:nl(e)&&Ji(a)?Kn(Ue(e)):{}}return(o?Nt:wr)(e,(function(e,r,o){return t(n,e,r,o)})),n},Vn.unary=function(e){return Oi(e,1)},Vn.union=ri,Vn.unionBy=oi,Vn.unionWith=ai,Vn.uniq=function(e){return e&&e.length?fo(e):[]},Vn.uniqBy=function(e,t){return e&&e.length?fo(e,ca(t,2)):[]},Vn.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?fo(e,o,t):[]},Vn.unset=function(e,t){return null==e||po(e,t)},Vn.unzip=ii,Vn.unzipWith=li,Vn.update=function(e,t,n){return null==e?e:ho(e,t,xo(n))},Vn.updateWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:ho(e,t,xo(n),r)},Vn.values=Kl,Vn.valuesIn=function(e){return null==e?[]:Zt(e,Rl(e))},Vn.without=si,Vn.words=Jl,Vn.wrap=function(e,t){return Fi(xo(t),e)},Vn.xor=ui,Vn.xorBy=ci,Vn.xorWith=fi,Vn.zip=di,Vn.zipObject=function(e,t){return yo(e||[],t||[],nr)},Vn.zipObjectDeep=function(e,t){return yo(e||[],t||[],eo)},Vn.zipWith=pi,Vn.entries=Bl,Vn.entriesIn=Vl,Vn.extend=El,Vn.extendWith=kl,us(Vn,Vn),Vn.add=bs,Vn.attempt=es,Vn.camelCase=Hl,Vn.capitalize=Wl,Vn.ceil=xs,Vn.clamp=function(e,t,n){return n===o&&(n=t,t=o),n!==o&&(n=(n=yl(n))===n?n:0),t!==o&&(t=(t=yl(t))===t?t:0),sr(yl(e),t,n)},Vn.clone=function(e){return ur(e,4)},Vn.cloneDeep=function(e){return ur(e,5)},Vn.cloneDeepWith=function(e,t){return ur(e,5,t="function"==typeof t?t:o)},Vn.cloneWith=function(e,t){return ur(e,4,t="function"==typeof t?t:o)},Vn.conformsTo=function(e,t){return null==t||cr(e,t,Dl(t))},Vn.deburr=ql,Vn.defaultTo=function(e,t){return null==e||e!==e?t:e},Vn.divide=ws,Vn.endsWith=function(e,t,n){e=xl(e),t=co(t);var r=e.length,a=n=n===o?r:sr(gl(n),0,r);return(n-=t.length)>=0&&e.slice(n,a)==t},Vn.eq=Ki,Vn.escape=function(e){return(e=xl(e))&&Q.test(e)?e.replace($,on):e},Vn.escapeRegExp=function(e){return(e=xl(e))&&ae.test(e)?e.replace(oe,"\\$&"):e},Vn.every=function(e,t,n){var r=Ui(e)?Ot:vr;return n&&wa(e,t,n)&&(t=o),r(e,ca(t,3))},Vn.find=yi,Vn.findIndex=qa,Vn.findKey=function(e,t){return Ft(e,ca(t,3),wr)},Vn.findLast=bi,Vn.findLastIndex=Ua,Vn.findLastKey=function(e,t){return Ft(e,ca(t,3),Er)},Vn.floor=Es,Vn.forEach=xi,Vn.forEachRight=wi,Vn.forIn=function(e,t){return null==e?e:br(e,ca(t,3),Rl)},Vn.forInRight=function(e,t){return null==e?e:xr(e,ca(t,3),Rl)},Vn.forOwn=function(e,t){return e&&wr(e,ca(t,3))},Vn.forOwnRight=function(e,t){return e&&Er(e,ca(t,3))},Vn.get=Pl,Vn.gt=Hi,Vn.gte=Wi,Vn.has=function(e,t){return null!=e&&ma(e,t,Pr)},Vn.hasIn=Ol,Vn.head=Xa,Vn.identity=as,Vn.includes=function(e,t,n,r){e=Xi(e)?e:Kl(e),n=n&&!r?gl(n):0;var o=e.length;return n<0&&(n=bn(o+n,0)),ul(e)?n<=o&&e.indexOf(t,n)>-1:!!o&&Vt(e,t,n)>-1},Vn.indexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:gl(n);return o<0&&(o=bn(r+o,0)),Vt(e,t,o)},Vn.inRange=function(e,t,n){return t=vl(t),n===o?(n=t,t=0):n=vl(n),function(e,t,n){return e>=xn(t,n)&&e=-9007199254740991&&e<=h},Vn.isSet=sl,Vn.isString=ul,Vn.isSymbol=cl,Vn.isTypedArray=fl,Vn.isUndefined=function(e){return e===o},Vn.isWeakMap=function(e){return rl(e)&&ga(e)==D},Vn.isWeakSet=function(e){return rl(e)&&"[object WeakSet]"==_r(e)},Vn.join=function(e,t){return null==e?"":Ut.call(e,t)},Vn.kebabCase=Ul,Vn.last=Za,Vn.lastIndexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var a=r;return n!==o&&(a=(a=gl(n))<0?bn(r+a,0):xn(a,r-1)),t===t?function(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}(e,t,a):Bt(e,Ht,a,!0)},Vn.lowerCase=Yl,Vn.lowerFirst=Xl,Vn.lt=dl,Vn.lte=pl,Vn.max=function(e){return e&&e.length?gr(e,as,Nr):o},Vn.maxBy=function(e,t){return e&&e.length?gr(e,ca(t,2),Nr):o},Vn.mean=function(e){return Wt(e,as)},Vn.meanBy=function(e,t){return Wt(e,ca(t,2))},Vn.min=function(e){return e&&e.length?gr(e,as,Fr):o},Vn.minBy=function(e,t){return e&&e.length?gr(e,ca(t,2),Fr):o},Vn.stubArray=ms,Vn.stubFalse=ys,Vn.stubObject=function(){return{}},Vn.stubString=function(){return""},Vn.stubTrue=function(){return!0},Vn.multiply=ks,Vn.nth=function(e,t){return e&&e.length?Wr(e,gl(t)):o},Vn.noConflict=function(){return pt._===this&&(pt._=Be),this},Vn.noop=cs,Vn.now=Pi,Vn.pad=function(e,t,n){e=xl(e);var r=(t=gl(t))?pn(e):0;if(!t||r>=t)return e;var o=(t-r)/2;return Uo(vt(o),n)+e+Uo(ht(o),n)},Vn.padEnd=function(e,t,n){e=xl(e);var r=(t=gl(t))?pn(e):0;return t&&rt){var r=e;e=t,t=r}if(n||e%1||t%1){var a=kn();return xn(e+a*(t-e+ut("1e-"+((a+"").length-1))),t)}return $r(e,t)},Vn.reduce=function(e,t,n){var r=Ui(e)?At:Yt,o=arguments.length<3;return r(e,ca(t,4),n,o,pr)},Vn.reduceRight=function(e,t,n){var r=Ui(e)?jt:Yt,o=arguments.length<3;return r(e,ca(t,4),n,o,hr)},Vn.repeat=function(e,t,n){return t=(n?wa(e,t,n):t===o)?1:gl(t),Gr(xl(e),t)},Vn.replace=function(){var e=arguments,t=xl(e[0]);return e.length<3?t:t.replace(e[1],e[2])},Vn.result=function(e,t,n){var r=-1,a=(t=wo(t,e)).length;for(a||(a=1,e=o);++rh)return[];var n=g,r=xn(e,g);t=ca(t),e-=g;for(var o=$t(r,t);++n=i)return e;var s=n-pn(r);if(s<1)return r;var u=l?ko(l,0,s).join(""):e.slice(0,s);if(a===o)return u+r;if(l&&(s+=u.length-s),ll(a)){if(e.slice(s).search(a)){var c,f=u;for(a.global||(a=Ne(a.source,xl(ve.exec(a))+"g")),a.lastIndex=0;c=a.exec(f);)var d=c.index;u=u.slice(0,d===o?s:d)}}else if(e.indexOf(co(a),s)!=s){var p=u.lastIndexOf(a);p>-1&&(u=u.slice(0,p))}return u+r},Vn.unescape=function(e){return(e=xl(e))&&G.test(e)?e.replace(X,gn):e},Vn.uniqueId=function(e){var t=++je;return xl(e)+t},Vn.upperCase=Ql,Vn.upperFirst=Zl,Vn.each=xi,Vn.eachRight=wi,Vn.first=Xa,us(Vn,function(){var e={};return wr(Vn,(function(t,n){Ae.call(Vn.prototype,n)||(e[n]=t)})),e}(),{chain:!1}),Vn.VERSION="4.17.21",Nt(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){Vn[e].placeholder=Vn})),Nt(["drop","take"],(function(e,t){qn.prototype[e]=function(n){n=n===o?1:bn(gl(n),0);var r=this.__filtered__&&!t?new qn(this):this.clone();return r.__filtered__?r.__takeCount__=xn(n,r.__takeCount__):r.__views__.push({size:xn(n,g),type:e+(r.__dir__<0?"Right":"")}),r},qn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),Nt(["filter","map","takeWhile"],(function(e,t){var n=t+1,r=1==n||3==n;qn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:ca(e,3),type:n}),t.__filtered__=t.__filtered__||r,t}})),Nt(["head","last"],(function(e,t){var n="take"+(t?"Right":"");qn.prototype[e]=function(){return this[n](1).value()[0]}})),Nt(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");qn.prototype[e]=function(){return this.__filtered__?new qn(this):this[n](1)}})),qn.prototype.compact=function(){return this.filter(as)},qn.prototype.find=function(e){return this.filter(e).head()},qn.prototype.findLast=function(e){return this.reverse().find(e)},qn.prototype.invokeMap=Qr((function(e,t){return"function"==typeof e?new qn(this):this.map((function(n){return Mr(n,e,t)}))})),qn.prototype.reject=function(e){return this.filter(Li(ca(e)))},qn.prototype.slice=function(e,t){e=gl(e);var n=this;return n.__filtered__&&(e>0||t<0)?new qn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==o&&(n=(t=gl(t))<0?n.dropRight(-t):n.take(t-e)),n)},qn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},qn.prototype.toArray=function(){return this.take(g)},wr(qn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),a=Vn[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);a&&(Vn.prototype[t]=function(){var t=this.__wrapped__,l=r?[1]:arguments,s=t instanceof qn,u=l[0],c=s||Ui(t),f=function(e){var t=a.apply(Vn,Rt([e],l));return r&&d?t[0]:t};c&&n&&"function"==typeof u&&1!=u.length&&(s=c=!1);var d=this.__chain__,p=!!this.__actions__.length,h=i&&!d,v=s&&!p;if(!i&&c){t=v?t:new qn(this);var g=e.apply(t,l);return g.__actions__.push({func:vi,args:[f],thisArg:o}),new Wn(g,d)}return h&&v?e.apply(this,l):(g=this.thru(f),h?r?g.value()[0]:g.value():g)})})),Nt(["pop","push","shift","sort","splice","unshift"],(function(e){var t=Te[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);Vn.prototype[e]=function(){var e=arguments;if(r&&!this.__chain__){var o=this.value();return t.apply(Ui(o)?o:[],e)}return this[n]((function(n){return t.apply(Ui(n)?n:[],e)}))}})),wr(qn.prototype,(function(e,t){var n=Vn[t];if(n){var r=n.name+"";Ae.call(In,r)||(In[r]=[]),In[r].push({name:t,func:n})}})),In[Ko(o,2).name]=[{name:"wrapper",func:o}],qn.prototype.clone=function(){var e=new qn(this.__wrapped__);return e.__actions__=Mo(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=Mo(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=Mo(this.__views__),e},qn.prototype.reverse=function(){if(this.__filtered__){var e=new qn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},qn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Ui(e),r=t<0,o=n?e.length:0,a=function(e,t,n){var r=-1,o=n.length;for(;++r=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},Vn.prototype.plant=function(e){for(var t,n=this;n instanceof Hn;){var r=Va(n);r.__index__=0,r.__values__=o,t?a.__wrapped__=r:t=r;var a=r;n=n.__wrapped__}return a.__wrapped__=e,t},Vn.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof qn){var t=e;return this.__actions__.length&&(t=new qn(this)),(t=t.reverse()).__actions__.push({func:vi,args:[ni],thisArg:o}),new Wn(t,this.__chain__)}return this.thru(ni)},Vn.prototype.toJSON=Vn.prototype.valueOf=Vn.prototype.value=function(){return go(this.__wrapped__,this.__actions__)},Vn.prototype.first=Vn.prototype.head,Qe&&(Vn.prototype[Qe]=function(){return this}),Vn}();pt._=mn,(r=function(){return mn}.call(t,n,t,e))===o||(e.exports=r)}.call(this)},2034:(e,t,n)=>{var r=n(8950),o=n(6025),a=n(3849),i=n(3629);e.exports=function(e,t){return(i(e)?r:a)(e,o(t,3))}},7702:(e,t,n)=>{var r=n(2526),o=n(5358),a=n(6025);e.exports=function(e,t){var n={};return t=a(t,3),o(e,(function(e,o,a){r(n,o,t(e,o,a))})),n}},9627:(e,t,n)=>{var r=n(3079),o=n(1954),a=n(2100);e.exports=function(e){return e&&e.length?r(e,a,o):void 0}},9151:(e,t,n)=>{var r=n(8059);function o(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(o.Cache||r),n}o.Cache=r,e.exports=o},9286:(e,t,n)=>{var r=n(4173),o=n(9934)((function(e,t,n){r(e,t,n)}));e.exports=o},6452:(e,t,n)=>{var r=n(3079),o=n(2580),a=n(2100);e.exports=function(e){return e&&e.length?r(e,a,o):void 0}},3638:(e,t,n)=>{var r=n(3079),o=n(6025),a=n(2580);e.exports=function(e,t){return e&&e.length?r(e,o(t,2),a):void 0}},9694:e=>{e.exports=function(){}},72:(e,t,n)=>{var r=n(7009);e.exports=function(){return r.Date.now()}},6460:(e,t,n)=>{var r=n(4980),o=n(7038)((function(e,t){return null==e?{}:r(e,t)}));e.exports=o},38:(e,t,n)=>{var r=n(9586),o=n(4084),a=n(5823),i=n(9793);e.exports=function(e){return a(e)?r(i(e)):o(e)}},6222:(e,t,n)=>{var r=n(6381)();e.exports=r},5080:(e,t,n)=>{var r=n(2095),o=n(7927),a=n(6025),i=n(750),l=n(3629);e.exports=function(e,t,n){var s=l(e)?r:i,u=arguments.length<3;return s(e,a(t,4),n,u,o)}},4485:(e,t,n)=>{var r=n(379);e.exports=function(e,t,n){return null==e?e:r(e,t,n)}},9467:(e,t,n)=>{var r=n(3654),o=n(8383),a=n(1473),i=n(6769),l=n(4651);e.exports=function(e){if(null==e)return 0;if(a(e))return i(e)?l(e):e.length;var t=o(e);return"[object Map]"==t||"[object Set]"==t?e.size:r(e).length}},4286:(e,t,n)=>{var r=n(5182),o=n(3226),a=n(8794),i=n(3195),l=a((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=l},8174:e=>{e.exports=function(){return[]}},9488:e=>{e.exports=function(){return!1}},1495:(e,t,n)=>{var r=n(2582),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}},9753:(e,t,n)=>{var r=n(1495);e.exports=function(e){var t=r(e),n=t%1;return t===t?n?t-n:t:0}},2582:(e,t,n)=>{var r=n(821),o=n(8092),a=n(152),i=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,s=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(a(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var n=l.test(e);return n||s.test(e)?u(e.slice(2),n?2:8):i.test(e)?NaN:+e}},168:(e,t,n)=>{var r=n(8950),o=n(291),a=n(3629),i=n(152),l=n(170),s=n(9793),u=n(3518);e.exports=function(e){return a(e)?r(e,s):i(e)?[e]:o(l(u(e)))}},6576:(e,t,n)=>{var r=n(4503),o=n(3961);e.exports=function(e){return r(e,o(e))}},3518:(e,t,n)=>{var r=n(2446);e.exports=function(e){return null==e?"":r(e)}},5653:(e,t,n)=>{var r=n(4550),o=n(5763),a=n(5358),i=n(6025),l=n(1137),s=n(3629),u=n(5174),c=n(4786),f=n(8092),d=n(9102);e.exports=function(e,t,n){var p=s(e),h=p||u(e)||d(e);if(t=i(t,4),null==n){var v=e&&e.constructor;n=h?p?new v:[]:f(e)&&c(v)?o(l(e)):{}}return(h?r:a)(e,(function(e,r,o){return t(n,e,r,o)})),n}},6310:(e,t,n)=>{var r=n(5182),o=n(8794),a=n(9602),i=n(6279),l=o((function(e){return a(r(e,1,i,!0))}));e.exports=l},804:(e,t,n)=>{var r=n(3518),o=0;e.exports=function(e){var t=++o;return r(e)+t}},2063:(e,t,n)=>{var r=n(8019),o=n(2742);e.exports=function(e){return null==e?[]:r(e,o(e))}},4827:(e,t,n)=>{var r=n(8463),o=n(2971);e.exports=function(e,t){return o(e||[],t||[],r)}},888:(e,t,n)=>{"use strict";var r=n(9047);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},2007:(e,t,n)=>{e.exports=n(888)()},9047:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},3298:(e,t,n)=>{var r,o,a,i;window,e.exports=(r=n(2791),o=n(4164),a=n(2007),i=n(2351),function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=r({}),a=function(e,t){return null==e||null==t};t.hashDiff=function(e,t){return a(e,t)||e.hash()!==t.hash()},t.shallowObjDiff=function(e,t){if(a(e,t)&&(null!=e||null!=t))return!0;if(e===t)return!1;if((void 0===e?"undefined":r(e))!==o||(void 0===t?"undefined":r(t))!==o)return e!==t;var n=Object.keys(e),i=Object.keys(t),l=function(n){return e[n]!==t[n]};return n.length!==i.length||!(!n.some(l)&&!i.some(l))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.get=function(e,t){return null!=e?e[t]:null},t.toJson=function(e){return e},t.forEach=function(e,t){return e.forEach(t)}},function(e,t,n){"use strict";e.exports=n(3).default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n0&&e.remove(s),l.length>0&&e.add(l),u.forEach((function(t){var n=t.ele1,a=t.ele2;return c(e,n,a,r,o,i)}))},c=function(e,t,n,r,o,a){var i=o(o(n,"data"),"id"),l=e.getElementById(i),s={};["data","position","selected","selectable","locked","grabbable","classes"].forEach((function(e){var i=o(n,e);a(i,o(t,e))&&(s[e]=r(i))}));var u=o(n,"scratch");a(u,o(t,"scratch"))&&l.scratch(r(u)),Object.keys(s).length>0&&l.json(s)}}]))},4463:(e,t,n)=>{"use strict";var r=n(2791),o=n(5296);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
\n ")}}]),function(e){if(kt.has(e))return;const t=e.container();if(!t)return;const n=new MutationObserver((t=>{var n;t.some((e=>e.addedNodes.length>0))&&Nt(e,null!==(n=Mt.get(e))&&void 0!==n?n:null)}));n.observe(t,{childList:!0,subtree:!0}),kt.set(e,n),e.one("destroy",(()=>{n.disconnect(),kt.delete(e)}))}(e),e.one("render",(()=>{e.nodes().forEach((t=>U(e,t,1)))})))}const pn=function(e){let{stageFilter:t=null,runSteps:n=null,height:a="100%",rankDir:i="TB",refreshIntervalMs:l=0,pipelineId:c,graphRefreshToken:d=0}=e;const u=(0,r.s0)(),[p,f]=(0,o.useState)(!1),[h,g]=(0,o.useState)(!0),m=(0,o.useRef)(!0),[v,y]=(0,o.useState)(),[x,b]=(0,o.useState)(null),[E,C]=(0,o.useState)((()=>{const e=ln(sn(t));return e?new Set(e.expandedGroups):new Set})),[M,B]=(0,o.useState)(null),[N,R]=(0,o.useState)(null!==c&&void 0!==c?c:null),[z,F]=(0,o.useState)(null),[O,_]=(0,o.useState)(null),W=(0,o.useMemo)((()=>{if("undefined"===typeof window)return 900;const e=getComputedStyle(document.documentElement).getPropertyValue("--dp-ui-scale"),t=parseFloat(e)||.8;return Math.round(window.innerWidth/t*.5)}),[]),{width:D,dragging:X,onHandleMouseDown:G}=(0,L.C)({initial:360,min:260,max:W,storageKey:"dp.graphInspectorWidth",edge:"left"}),Y=(0,o.useRef)(ln(sn(t))),q=(0,o.useRef)(!1),Z=(0,o.useRef)(!0),P=(0,o.useRef)(!0),j=(0,o.useRef)(!1),K=(0,o.useRef)(null),H=(0,o.useRef)(null),U=(0,o.useRef)(null),J=(0,o.useRef)(!1),V=(0,o.useRef)(N);V.current=N;const Q=(0,o.useMemo)((()=>{const e=new Map;return null===n||void 0===n||n.forEach((t=>e.set(t.step_name,t.status))),e.size?e:void 0}),[n]),$=(0,o.useMemo)((()=>sn(t)),[t]),ee=(0,o.useRef)(Q);ee.current=Q;const te=(0,o.useMemo)((()=>{if(!M)return new Map;const{nodes:e}=(0,A.u)(M,E);return e}),[M,E]),ne=(0,o.useCallback)((e=>{const t=Y.current;if(!t||q.current||e.destroyed())return;q.current=!0,t.userInteracted&&0===t.expandedGroups.length&&(e.zoom(t.zoom),e.pan(t.pan));const n=t.selectedNodeIds.length>0?t.selectedNodeIds:t.inspectorNodeId?[t.inspectorNodeId]:[];if(n.length>0&&Ot(e,n),t.inspectorNodeId){const n=e.getElementById(t.inspectorNodeId);if(n.empty()){const e=te.get(t.inspectorNodeId);e&&_({nodeId:t.inspectorNodeId,data:e})}else _({nodeId:t.inspectorNodeId,data:n.data()})}}),[te]),oe=(0,o.useRef)(F),re=(0,o.useRef)(_);oe.current=F,re.current=_,(0,o.useEffect)((()=>{c?R(c):rn.Bi.getCapabilities().then((e=>{var t;return R(null!==(t=e.pipeline_id)&&void 0!==t?t:null)})).catch((()=>R(null)))}),[c]);const ae=(0,o.useCallback)((()=>{!function(e,t){try{sessionStorage.setItem(an(e.graphUrl),JSON.stringify(e))}catch(n){}}(function(e,t,n,o,r){var a;if(!o||o.destroyed()){var i;const o=n?[n.nodeId]:[];return{graphUrl:e,expandedGroups:Array.from(t),selectedNodeIds:o,inspectorNodeId:null!==(i=null===n||void 0===n?void 0:n.nodeId)&&void 0!==i?i:null,zoom:1,pan:{x:0,y:0},userInteracted:r}}const l=o.pan(),s=Ft(o);return{graphUrl:e,expandedGroups:Array.from(t),selectedNodeIds:s.length>0?s:n?[n.nodeId]:[],inspectorNodeId:null!==(a=null===n||void 0===n?void 0:n.nodeId)&&void 0!==a?a:null,zoom:o.zoom(),pan:{x:l.x,y:l.y},userInteracted:r}}($,E,O,v,j.current))}),[$,E,O,v,t]),ie=(0,o.useCallback)((e=>{v&&(U.current=e,C((t=>{const n=new Set(t);return n.has(e)?(n.delete(e),J.current=!1):(n.add(e),J.current=!0),n})))}),[v]),le=(0,o.useCallback)((e=>{ae();const t=V.current;if(!t)return void b({type:"warning",message:"Pipeline ID not available"});const n=e.data("type"),o=e.data("name"),r="/pipelines/".concat(encodeURIComponent(t));"group"===n||"group-expanded"===n?u("".concat(r,"/meta-steps/").concat(encodeURIComponent(o))):"table"===n?u("".concat(r,"/tables/").concat(encodeURIComponent(o))):"transform"===n&&u("".concat(r,"/transforms/").concat(encodeURIComponent(o)))}),[u,ae]),se=(0,o.useRef)(le),ce=(0,o.useRef)(ie),de=(0,o.useRef)(null);se.current=le,ce.current=ie,(0,o.useEffect)((()=>{var e;const t=Z.current;Z.current=!1;const n=t?ln($):null;Y.current=n,q.current=!1,H.current=null;const o=Boolean(null===n||void 0===n||null===(e=n.expandedGroups)||void 0===e?void 0:e.length);P.current=!n||(o||!n.userInteracted),j.current=!(!n||o)&&n.userInteracted,C(n?new Set(n.expandedGroups):new Set),m.current=!0,U.current=null,g(!0)}),[$]),(0,o.useEffect)((()=>{if(!M)return;const e="".concat($,"::").concat(null!==t&&void 0!==t?t:"");if(H.current!==e)if(H.current=e,Y.current){const e=Y.current;if(!q.current){const t=e.expandedGroups.length>0;P.current=t||!e.userInteracted}}else C(new Set),P.current=!0}),[M,$,t]),(0,o.useEffect)((()=>{let e=!1;async function t(){m.current&&f(!0);try{const t=await(0,on.SC)($);if(!t.ok)throw new Error("Graph request failed: ".concat(t.status));const n=await t.json();if(e)return;K.current=$,B(n)}catch(t){e||(v&&v.elements().remove(),b({type:"error",message:(0,on.iC)(t)}))}finally{e||(f(!1),m.current=!1,g(!1))}}if(t(),!l)return()=>{e=!0};const n=setInterval(t,l);return()=>{e=!0,clearInterval(n)}}),[$,l,v,d]),(0,o.useEffect)((()=>{v&&M&&!p&&K.current===$&&(lt(v,M,E,{mode:P.current?"fit":"preserve",rankDir:i,anchorGroup:U.current,expanding:J.current,onLayoutComplete:()=>{!function(e){e.destroyed()||e.nodes().forEach((e=>{e.trigger("position")}))}(v),function(e,t){if(null===t||void 0===t||!t.size)return e.edges().removeClass("failed"),void It(e);e.batch((()=>{e.edges().forEach((e=>{const n=e.target().data("name"),o=n?t.get(n):void 0,r="failed"===o||"error"===o;e.toggleClass("failed",r)}))})),It(e)}(v,ee.current),It(v),ne(v)}}),P.current=!1,U.current=null)}),[v,M,E,p,i,$,ne]),(0,o.useEffect)((()=>()=>{ae()}),[ae]),(0,o.useEffect)((()=>{v&&!v.destroyed()&&un(v)}),[v]),(0,o.useEffect)((()=>{if(!v||v.destroyed())return;const e=v.container();if(!e||"undefined"===typeof ResizeObserver)return;let t=0,n=e.clientWidth,o=e.clientHeight;const r=new ResizeObserver((()=>{cancelAnimationFrame(t),t=requestAnimationFrame((()=>{if(v.destroyed())return;const t=e.clientWidth,r=e.clientHeight;Math.abs(t-n)<1&&Math.abs(r-o)<1||(n=t,o=r,v.resize(),It(v),!j.current&&v.nodes().nonempty()&&v.fit(void 0,60))}))}));return r.observe(e),()=>{cancelAnimationFrame(t),r.disconnect()}}),[v]),(0,o.useEffect)((()=>{if(v&&!v.destroyed())return Pt(v,{onOpenInspector:e=>{re.current({nodeId:e.id(),data:e.data()}),oe.current(null)},onCloseInspector:()=>re.current(null),onOpenKeyPopover:e=>oe.current(e),onCloseKeyPopover:()=>oe.current(null),onToggleGroup:e=>ce.current(e),onUserInteracted:()=>{j.current=!0},onContextTarget:e=>{de.current=e}})}),[v]),(0,o.useEffect)((()=>{if(v&&!v.destroyed())return v.contextMenus({menuItems:[{id:"open-details",content:"Open details page\u2026",selector:"node",onClickFunction:()=>{const e=de.current;e&&"function"===typeof e.data&&se.current(e)}},{id:"expand-steps",content:"Expand into sub-steps",selector:'node[type = "group"]',onClickFunction:()=>{const e=de.current;"group"===(null===e||void 0===e?void 0:e.data("type"))&&ce.current(e.data("name"))}},{id:"collapse-steps",content:"Collapse into single step",selector:'node[type = "group-expanded"]',onClickFunction:()=>{const e=de.current;"group-expanded"===(null===e||void 0===e?void 0:e.data("type"))&&ce.current(e.data("name"))}}]}),()=>{try{v.destroyed()||(v.contextMenus("destroy"),cn.delete(v))}catch(e){}}}),[v]),(0,o.useEffect)((()=>{const e=e=>{"Escape"===e.key&&(z?F(null):O&&_(null))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)}),[z,O]),(0,o.useEffect)((()=>{if(!z)return;const e=e=>{var t,n;const o=e.target;null!==o&&void 0!==o&&null!==(t=o.closest)&&void 0!==t&&t.call(o,".node-key-popover")||null!==o&&void 0!==o&&null!==(n=o.closest)&&void 0!==n&&n.call(o,"[data-key-overflow='true']")||F(null)};return document.addEventListener("mousedown",e,!0),()=>document.removeEventListener("mousedown",e,!0)}),[z]);const ue=(0,o.useCallback)((()=>{if(!v||v.destroyed())return;j.current=!0;const e=Math.min(6,1.25*v.zoom());v.zoom(e)}),[v]),pe=(0,o.useCallback)((()=>{if(!v||v.destroyed())return;j.current=!0;const e=Math.max(Xt,v.zoom()/1.25);v.zoom(e)}),[v]),fe=(0,o.useCallback)((()=>{v&&!v.destroyed()&&(j.current=!0,v.zoom(1),v.center())}),[v]),he=(0,o.useCallback)((()=>{v&&!v.destroyed()&&(j.current=!1,v.resize(),v.fit(void 0,48))}),[v]),ge=(0,o.useCallback)((e=>{const t=te.get(e);if(!v||v.destroyed())return void(t&&(_({nodeId:e,data:t}),F(null)));const n=v.getElementById(e);if(!n.empty()){if("group-expanded"!==n.data("type"))return Ot(v,[n.id()]),_({nodeId:n.id(),data:n.data()}),void F(null)}t&&(_({nodeId:e,data:t}),F(null),n.empty()||Tt(v))}),[v,te]),me="100%"===a||"100vh"===a;return(0,S.jsxs)("div",{className:"pipeline-graph-shell",style:me?{flex:"1 1 auto",minHeight:0,height:"auto"}:{height:a},children:[(0,S.jsxs)("div",{className:"pipeline-graph-embedded",style:{position:"relative"},children:[x&&(0,S.jsx)(tn.Z,{message:x.message,type:x.type,closable:!0,afterClose:()=>b(null)}),h&&p&&(0,S.jsx)(nn.Z,{className:"spin",spinning:!0}),(0,S.jsxs)("div",{className:"graph-toolbar graph-toolbar-floating",children:[(0,S.jsx)("button",{type:"button",className:"graph-toolbar-button",onClick:pe,title:"Zoom out",children:"\u2212"}),(0,S.jsx)("button",{type:"button",className:"graph-toolbar-button",onClick:ue,title:"Zoom in",children:"+"}),(0,S.jsx)("button",{type:"button",className:"graph-toolbar-segment",onClick:he,title:"Fit graph",children:"Fit"}),(0,S.jsx)("button",{type:"button",className:"graph-toolbar-segment",onClick:fe,title:"Reset zoom to 100%",children:"100%"}),(0,S.jsx)("button",{type:"button",className:"graph-toolbar-button graph-toolbar-icon",title:"Graph settings","aria-label":"Graph settings",dangerouslySetInnerHTML:{__html:w.Q4}})]}),(0,S.jsx)(s(),{stylesheet:T,cy:y,autoungrabify:!0,maxZoom:6,minZoom:Xt,wheelSensitivity:0,elements:[],className:"cy-container cy-container-embedded"}),z&&(0,S.jsx)(I,{state:z,onClose:()=>F(null)})]}),(0,S.jsx)(k,{inspector:O,graphNodesById:te,runStatusByStep:Q,width:D,dragging:X,onHandleMouseDown:G,onClose:()=>_(null),onNavigateToNode:ge,onOpenDetails:O?()=>{const e=null===v||void 0===v?void 0:v.getElementById(O.nodeId);e&&!e.empty()&&le(e)}:void 0})]})}}}]); +//# sourceMappingURL=246.8f83295d.chunk.js.map \ No newline at end of file diff --git a/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/246.8f83295d.chunk.js.map b/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/246.8f83295d.chunk.js.map new file mode 100644 index 000000000..7e26005e5 --- /dev/null +++ b/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/246.8f83295d.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/246.8f83295d.chunk.js","mappings":"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","sources":["../../datapipe-ui/src/features/cy/graphNodeLayout.ts","../../datapipe-ui/src/features/cy/KeyListPopover.tsx","../../datapipe-ui/src/features/cy/NodeInspectorPanel.tsx","../../datapipe-ui/src/features/cy/graphColors.ts","../../datapipe-ui/src/features/cy/stylesheet.ts","../../datapipe-ui/src/features/cy/animationConstants.ts","../../datapipe-ui/src/features/cy/htmlLabelOpacity.ts","../../datapipe-ui/src/features/cy/edgeTransition.ts","../../datapipe-ui/src/features/cy/incrementalLayout.ts","../../datapipe-ui/src/features/cy/syncCyGraph.ts","../../datapipe-ui/src/features/cy/internalEdgeOverlay.ts","../../datapipe-ui/src/features/cy/graphVisualState.ts","../../datapipe-ui/src/features/cy/graphInteractions.ts","../../datapipe-ui/src/features/cy/htmlNodeLabels.ts","../../datapipe-ui/src/features/cy/graphSessionState.ts","../../datapipe-ui/src/features/cy/index.tsx"],"sourcesContent":["export const TABLE_NAME_MAX_LEN = 64;\n\nexport const NODE_MAX_LINES = 3;\n\n// Card geometry.\n// - Tables (orange) and transforms (green) share one size so the graph reads\n// as a clean grid.\n// - Collapsed groups (blue) are slightly larger to signal they contain steps.\n// - Height fits title + subtitle + TPK/PK row + Labels row without clipping.\nconst NODE_WIDTH = 420;\nconst NODE_HEIGHT = 156;\nconst GROUP_WIDTH = 450;\nconst GROUP_HEIGHT = 168;\nconst COMPACT_HEIGHT = 72;\n\n// Mirrors `.node-content`: 16px side padding + 28px icon + 12px column gap.\nconst CARD_TEXT_GUTTER_PX = 72;\n// Average glyph width for 13px/800 snake_case in Inter (measured ~6.5–6.8px).\nconst CHAR_WIDTH_PX = 6.6;\nconst LINE_FILL_RATIO = 0.9;\n\nfunction charsPerLine(cardWidth: number): number {\n const textPx = Math.max(80, cardWidth - CARD_TEXT_GUTTER_PX);\n return Math.max(12, Math.floor((textPx * LINE_FILL_RATIO) / CHAR_WIDTH_PX));\n}\n\nexport const graphNodeDimensions = {\n table: { width: NODE_WIDTH, height: NODE_HEIGHT, heightTwoRows: NODE_HEIGHT },\n transform: { width: NODE_WIDTH, height: NODE_HEIGHT, heightTwoRows: NODE_HEIGHT },\n groupCollapsed: { width: GROUP_WIDTH, height: GROUP_HEIGHT, heightTwoRows: GROUP_HEIGHT },\n compactTable: { width: 280, height: COMPACT_HEIGHT },\n compactTransform: { width: 280, height: COMPACT_HEIGHT },\n compactGroup: { width: 300, height: COMPACT_HEIGHT },\n horizontalGap: 58,\n verticalGap: 68,\n} as const;\n\nexport function displayNodeName(name: string, maxLen = 26): string {\n if (name.length <= maxLen) return name;\n return `${name.slice(0, maxLen - 1)}…`;\n}\n\nfunction splitTokens(name: string): string[] {\n const parts = name.split(\"_\");\n return parts\n .map((part, index) => (index < parts.length - 1 ? `${part}_` : part))\n .filter((token) => token.length > 0);\n}\n\nexport type WrappedName = { lines: string[]; maxLen: number; truncated: boolean };\n\nexport function wrapName(name: string, maxChars: number, maxLines = NODE_MAX_LINES): WrappedName {\n const tokens = splitTokens(name);\n const lines: string[] = [];\n let current = \"\";\n\n const flushHard = (chunk: string): string => {\n let rest = chunk;\n while (rest.length > maxChars) {\n lines.push(rest.slice(0, maxChars));\n rest = rest.slice(maxChars);\n }\n return rest;\n };\n\n tokens.forEach((token) => {\n if (token.length > maxChars) {\n if (current) {\n lines.push(current);\n current = \"\";\n }\n current = flushHard(token);\n return;\n }\n if (current && current.length + token.length > maxChars) {\n lines.push(current);\n current = token;\n } else {\n current += token;\n }\n });\n if (current) lines.push(current);\n\n let truncated = false;\n if (lines.length > maxLines) {\n lines.length = maxLines;\n truncated = true;\n const last = lines[maxLines - 1];\n lines[maxLines - 1] = `${last.length > maxChars - 1 ? last.slice(0, maxChars - 1) : last}…`;\n }\n\n const maxLen = lines.reduce((acc, line) => Math.max(acc, line.length), 1);\n return { lines, maxLen, truncated };\n}\n\nexport type NodeSize = { w: number; h: number; lines: string[] };\n\nexport function stepNodeSize(name: string, compact: boolean, _tpk: string[] = []): NodeSize {\n const dim = compact ? graphNodeDimensions.compactTransform : graphNodeDimensions.transform;\n const { lines } = wrapName(name, charsPerLine(dim.width));\n return { w: dim.width, h: dim.height, lines };\n}\n\nexport function tableNodeSize(name: string, _indexes: string[] = [], compact: boolean): NodeSize {\n const trimmed = name.slice(0, TABLE_NAME_MAX_LEN);\n const dim = compact ? graphNodeDimensions.compactTable : graphNodeDimensions.table;\n const { lines } = wrapName(trimmed, charsPerLine(dim.width));\n return { w: dim.width, h: dim.height, lines };\n}\n\nexport const GROUP_MIN_WIDTH = graphNodeDimensions.groupCollapsed.width;\nexport const GROUP_MAX_WIDTH = graphNodeDimensions.groupCollapsed.width;\nexport const GROUP_MIN_HEIGHT = graphNodeDimensions.groupCollapsed.height;\nexport const GROUP_MAX_HEIGHT = graphNodeDimensions.groupCollapsed.height;\n\nexport function groupBoxSize(name: string, _childCount: number, _tpk: string[] = []): NodeSize {\n const dim = graphNodeDimensions.groupCollapsed;\n const { lines } = wrapName(name, charsPerLine(dim.width), 2);\n return {\n w: dim.width,\n h: dim.height,\n lines,\n };\n}\n","import React from \"react\";\nimport type { KeyKind } from \"./nodeKeyChips\";\n\nexport type KeyPopoverState = {\n nodeId: string;\n kind: KeyKind;\n keys: string[];\n anchor: { x: number; y: number };\n};\n\ntype KeyListPopoverProps = {\n state: KeyPopoverState;\n onClose: () => void;\n};\n\nexport function KeyListPopover({ state, onClose }: KeyListPopoverProps) {\n const title =\n state.kind === \"pk\"\n ? `Primary keys · ${state.keys.length}`\n : state.kind === \"tpk\"\n ? `Transform Primary Keys · ${state.keys.length}`\n : `Labels · ${state.keys.length}`;\n\n return (\n \n
\n {title}\n \n
\n\n
\n {state.keys.map((key) => (\n \n {key}\n \n ))}\n
\n \n );\n}\n","import React from \"react\";\nimport Cytoscape from \"cytoscape\";\nimport { GraphNodeDetailBody } from \"./GraphNodeDetailContent\";\n\nexport type InspectorState = {\n nodeId: string;\n data: Cytoscape.NodeDataDefinition;\n} | null;\n\ntype NodeInspectorPanelProps = {\n inspector: InspectorState;\n graphNodesById: Map;\n runStatusByStep?: Map;\n width: number;\n dragging?: boolean;\n onHandleMouseDown: (event: React.MouseEvent) => void;\n onClose: () => void;\n onNavigateToNode?: (nodeId: string) => void;\n onOpenDetails?: () => void;\n};\n\nfunction InspectorEmptyState() {\n return (\n
\n
No node selected
\n
\n Click a table, transform or group in the graph to see its details here.\n
\n
\n );\n}\n\nexport function NodeInspectorPanel({\n inspector,\n graphNodesById,\n runStatusByStep,\n width,\n dragging,\n onHandleMouseDown,\n onClose,\n onNavigateToNode,\n onOpenDetails,\n}: NodeInspectorPanelProps) {\n return (\n \n \n
\n {!inspector ? (\n \n ) : (\n \n )}\n
\n \n );\n}\n","/** Operator Light — semantic graph palette (mirrors CSS variables in operatorLight.css). */\nexport const graphColors = {\n canvas: { bg: \"#FBFDFF\", dot: \"#DCE7F5\" },\n table: {\n bg: \"#FFF3E5\",\n bg2: \"#FFE5C7\",\n border: \"#FF7A1A\",\n icon: \"#FF6B00\",\n text: \"#3E2407\",\n },\n transform: {\n bg: \"#EFFFF3\",\n bg2: \"#DCF8E5\",\n border: \"#16A34A\",\n icon: \"#0FA83D\",\n text: \"#083B18\",\n },\n group: {\n bg: \"#EDF5FF\",\n bg2: \"#DBEAFE\",\n border: \"#1677FF\",\n icon: \"#1677FF\",\n text: \"#074899\",\n expandedBg: \"rgba(237, 245, 255, 0.48)\",\n expandedBorder: \"rgba(22, 119, 255, 0.72)\",\n },\n} as const;\n\nexport const edgeColors = {\n default: \"#52677F\",\n active: \"#1677FF\",\n /** Neighbor highlight when a node is selected (muted teal, softer than selection). */\n related: \"#5BA8A0\",\n error: \"#D92D20\",\n} as const;\n","import Cytoscape from \"cytoscape\";\nimport { edgeColors, graphColors } from \"./graphColors\";\nimport { getTransformPrimaryKeys } from \"./nodeKeyChips\";\nimport { groupBoxSize, stepNodeSize, tableNodeSize } from \"./graphNodeLayout\";\n\nfunction nodeName(node: Cytoscape.NodeSingular): string {\n return (node.data(\"name\") as string) || (node.data(\"label\") as string) || \"\";\n}\n\nfunction nodeWidth(node: Cytoscape.NodeSingular): number {\n const name = nodeName(node);\n if (node.data(\"type\") === \"group\") {\n return (node.data(\"boxW\") as number) ?? groupBoxSize(name, node.data(\"child_count\") ?? 1, getTransformPrimaryKeys(node.data())).w;\n }\n if (node.data(\"type\") === \"table\") {\n return tableNodeSize(name, node.data(\"indexes\") || [], false).w;\n }\n return stepNodeSize(name, false, getTransformPrimaryKeys(node.data())).w;\n}\n\nfunction nodeHeight(node: Cytoscape.NodeSingular): number {\n const name = nodeName(node);\n if (node.data(\"type\") === \"group\") {\n return (node.data(\"boxH\") as number) ?? groupBoxSize(name, node.data(\"child_count\") ?? 1, getTransformPrimaryKeys(node.data())).h;\n }\n if (node.data(\"type\") === \"table\") {\n return tableNodeSize(name, node.data(\"indexes\") || [], false).h;\n }\n return stepNodeSize(name, false, getTransformPrimaryKeys(node.data())).h;\n}\n\n/** Pipeline next-step hop (transform/group → transform/group) — dashed. */\nfunction isSequentialEdge(edge: Cytoscape.EdgeSingular): boolean {\n return Boolean(edge.data(\"sequential\"));\n}\n\nexport const stylesheet: Cytoscape.Stylesheet[] = [\n {\n selector: \"node\",\n style: {\n shape: \"round-rectangle\",\n width: nodeWidth,\n height: nodeHeight,\n \"background-opacity\": 0,\n \"border-width\": 0,\n \"overlay-opacity\": 0,\n \"z-index\": 10,\n ghost: \"no\",\n },\n },\n {\n selector: \":active\",\n style: {\n \"overlay-opacity\": 0,\n },\n },\n {\n selector: 'node[type = \"group\"]',\n style: {\n width: (node: Cytoscape.NodeSingular) =>\n (node.data(\"boxW\") as number) ?? groupBoxSize(nodeName(node), node.data(\"child_count\") ?? 1).w,\n height: (node: Cytoscape.NodeSingular) =>\n (node.data(\"boxH\") as number) ?? groupBoxSize(nodeName(node), node.data(\"child_count\") ?? 1).h,\n },\n },\n {\n selector: 'node[type = \"group-expanded\"]',\n style: {\n shape: \"round-rectangle\",\n backgroundColor: graphColors.group.expandedBg,\n \"background-opacity\": 1,\n \"border-width\": 2,\n \"border-color\": graphColors.group.expandedBorder,\n \"border-style\": \"dashed\",\n width: (node: Cytoscape.NodeSingular) =>\n (node.data(\"boxW\") as number) ??\n groupBoxSize(nodeName(node), node.data(\"child_count\") ?? 1).w,\n height: (node: Cytoscape.NodeSingular) =>\n (node.data(\"boxH\") as number) ??\n groupBoxSize(nodeName(node), node.data(\"child_count\") ?? 1).h,\n label: (node: Cytoscape.NodeSingular) =>\n (node.data(\"frameLabel\") as string) || nodeName(node),\n \"text-valign\": \"top\",\n \"text-halign\": \"center\",\n \"text-wrap\": \"wrap\",\n \"text-max-width\": \"600px\",\n \"font-size\": 13,\n \"font-weight\": 800,\n color: graphColors.group.text,\n \"text-margin-y\": -12,\n \"z-index\": 0,\n ghost: \"no\",\n // Decorative frame only: must not steal pointer hits, otherwise LMB-drag\n // inside the blue area cannot pan the camera. Inner step/table HTML\n // labels still receive clicks; empty-frame gestures are handled in\n // graphInteractions via hit-testing.\n events: \"no\",\n } as Cytoscape.Css.Node,\n },\n {\n selector: \"node.focused\",\n style: {\n \"z-index\": 50,\n },\n },\n {\n selector: \"node.related\",\n style: {\n \"background-color\": edgeColors.related,\n \"background-opacity\": 0.04,\n \"border-width\": 2,\n \"border-color\": edgeColors.related,\n \"overlay-opacity\": 0,\n \"z-index\": 35,\n },\n },\n {\n selector: \"node.dimmed\",\n style: {\n opacity: 0.35,\n },\n },\n {\n // Selection chrome is app-owned (see graphSelection.ts) and painted via\n // HTML label classes / `node.focused` — cytoscape's native `:selected`\n // state is never set, but this rule stays as a belt-and-suspenders no-op.\n selector: \"node:selected\",\n style: {},\n },\n {\n selector: \"edge[internalMeta]\",\n style: {\n opacity: 0,\n \"z-index\": 0,\n events: \"no\",\n },\n },\n {\n selector: \"edge\",\n style: {\n \"curve-style\": \"taxi\",\n \"taxi-direction\": \"vertical\",\n \"taxi-turn\": \"50%\",\n \"taxi-turn-min-distance\": 22,\n width: 2.15,\n \"line-color\": edgeColors.default,\n \"target-arrow-color\": edgeColors.default,\n \"target-arrow-shape\": \"triangle\",\n \"arrow-scale\": 1.08,\n \"line-style\": (edge: Cytoscape.EdgeSingular) =>\n isSequentialEdge(edge) ? \"dashed\" : \"solid\",\n opacity: 0.78,\n \"z-index\": 1,\n },\n },\n {\n selector: \"edge.focused\",\n style: {\n width: 3.2,\n opacity: 1,\n \"line-color\": edgeColors.active,\n \"target-arrow-color\": edgeColors.active,\n \"z-index\": 20,\n },\n },\n {\n selector: \"edge.related\",\n style: {\n width: 2.6,\n opacity: 0.9,\n \"line-color\": edgeColors.related,\n \"target-arrow-color\": edgeColors.related,\n \"z-index\": 20,\n },\n },\n {\n selector: \"edge.muted\",\n style: {\n opacity: 0.12,\n },\n },\n {\n selector: \"edge.failed\",\n style: {\n width: 2.8,\n opacity: 1,\n \"line-color\": edgeColors.error,\n \"target-arrow-color\": edgeColors.error,\n \"z-index\": 25,\n },\n },\n];\n","export const ANIMATION_MS = 420;\nexport const ANIMATION_EASING = \"ease-in-out-cubic\";\n\n/** Collapse crossfade: inner steps fade out while collapsed group card fades in. */\nexport const COLLAPSE_INNER_FADE_MS = 300;\nexport const COLLAPSE_GROUP_FADE_MS = 380;\nexport const COLLAPSE_GROUP_FADE_DELAY = 100;\n","import Cytoscape from \"cytoscape\";\nimport { ANIMATION_MS } from \"./animationConstants\";\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;\n}\n\nconst opacityStore = new WeakMap>();\nconst syncInitStore = new WeakMap();\nconst activeRafStore = new WeakMap>();\n\nfunction getOpacityStore(cy: Cytoscape.Core): Map {\n let store = opacityStore.get(cy);\n if (!store) {\n store = new Map();\n opacityStore.set(cy, store);\n }\n return store;\n}\n\nfunction trackRaf(cy: Cytoscape.Core, id: number): void {\n let set = activeRafStore.get(cy);\n if (!set) {\n set = new Set();\n activeRafStore.set(cy, set);\n }\n set.add(id);\n}\n\nexport function initHtmlLabelOpacitySync(cy: Cytoscape.Core): void {\n if (syncInitStore.has(cy)) return;\n syncInitStore.set(cy, true);\n getOpacityStore(cy);\n\n cy.on(\"render\", () => {\n if (cy.destroyed()) return;\n const store = opacityStore.get(cy);\n cy.nodes().forEach((node) => {\n if (!nodeUsesHtmlLabel(node as Cytoscape.NodeSingular)) return;\n const nodeId = node.id();\n const opacity =\n store?.get(nodeId) ??\n (node.data(\"htmlLabelOpacity\") as number | undefined);\n if (typeof opacity !== \"number\") return;\n const labelEl = getNodeHtmlLabelEl(cy, nodeId);\n if (labelEl) {\n labelEl.style.opacity = String(opacity);\n }\n });\n });\n}\n\nexport function stopHtmlOpacityAnimations(cy: Cytoscape.Core): void {\n const rafs = activeRafStore.get(cy);\n if (rafs) {\n rafs.forEach((id) => cancelAnimationFrame(id));\n rafs.clear();\n }\n}\n\nexport function getNodeHtmlLabelEl(cy: Cytoscape.Core, nodeId: string): HTMLElement | null {\n const container = cy.container();\n if (!container) return null;\n return container.querySelector(`[data-cy-node-id=\"${CSS.escape(nodeId)}\"]`);\n}\n\n/** Transform/table/group labels are HTML; group-expanded uses native cytoscape drawing. */\nexport function nodeUsesHtmlLabel(node: Cytoscape.NodeSingular): boolean {\n const type = node.data(\"type\") as string;\n return type === \"transform\" || type === \"table\" || type === \"group\";\n}\n\nexport function ensureGroupExpandedVisible(node: Cytoscape.NodeSingular): void {\n if (node.data(\"type\") !== \"group-expanded\") return;\n node.removeStyle(\"opacity\");\n node.style(\"opacity\", 1);\n}\n\nexport function setNodeVisualOpacity(\n cy: Cytoscape.Core,\n node: Cytoscape.NodeSingular,\n opacity: number,\n): void {\n getOpacityStore(cy).set(node.id(), opacity);\n node.data(\"htmlLabelOpacity\", opacity);\n\n if (nodeUsesHtmlLabel(node)) {\n const labelEl = getNodeHtmlLabelEl(cy, node.id());\n if (labelEl) {\n labelEl.style.opacity = String(opacity);\n }\n // Canvas node is transparent for html-labeled types; keep it invisible.\n node.style(\"opacity\", 0);\n return;\n }\n node.style(\"opacity\", opacity);\n}\n\nexport function animateNodeVisualOpacity(\n cy: Cytoscape.Core,\n nodeId: string,\n fromOpacity: number,\n toOpacity: number,\n duration = ANIMATION_MS,\n onComplete?: () => void,\n delay = 0,\n): void {\n const node = cy.getElementById(nodeId);\n if (node.empty()) {\n onComplete?.();\n return;\n }\n\n const nodeEl = node as Cytoscape.NodeSingular;\n const usesHtml = nodeUsesHtmlLabel(nodeEl);\n const startAt = performance.now() + delay;\n\n const tick = (now: number) => {\n if (now < startAt) {\n trackRaf(cy, requestAnimationFrame(tick));\n return;\n }\n\n const t = Math.min(1, (now - startAt) / duration);\n const eased = easeInOutCubic(t);\n const opacity = fromOpacity + (toOpacity - fromOpacity) * eased;\n\n if (usesHtml) {\n const labelEl = getNodeHtmlLabelEl(cy, nodeId);\n if (labelEl) {\n labelEl.style.opacity = String(opacity);\n }\n getOpacityStore(cy).set(nodeId, opacity);\n nodeEl.data(\"htmlLabelOpacity\", opacity);\n nodeEl.style(\"opacity\", 0);\n } else {\n nodeEl.style(\"opacity\", opacity);\n getOpacityStore(cy).set(nodeId, opacity);\n }\n\n if (t < 1) {\n trackRaf(cy, requestAnimationFrame(tick));\n } else {\n setNodeVisualOpacity(cy, nodeEl, toOpacity);\n onComplete?.();\n }\n };\n\n trackRaf(cy, requestAnimationFrame(tick));\n}\n","import Cytoscape from \"cytoscape\";\nimport { ANIMATION_EASING, ANIMATION_MS } from \"./animationConstants\";\n\ntype CyElementLike = { data: Record };\n\nexport function makeEdgeKey(source: string, target: string): string {\n return `${source}->${target}`;\n}\n\nexport function parseEdgeKey(key: string): { source: string; target: string } {\n const idx = key.indexOf(\"->\");\n return { source: key.slice(0, idx), target: key.slice(idx + 2) };\n}\n\nexport function findEdgeByKey(cy: Cytoscape.Core, key: string): Cytoscape.EdgeSingular | null {\n const { source, target } = parseEdgeKey(key);\n const found = cy.edges().filter(\n (edge) => edge.source().id() === source && edge.target().id() === target,\n );\n if (found.empty()) return null;\n return found.first() as Cytoscape.EdgeSingular;\n}\n\nexport type EdgeDiff = {\n toAdd: string[];\n toRemove: string[];\n};\n\nexport function computeEdgeDiff(cy: Cytoscape.Core, target: CyElementLike[]): EdgeDiff {\n const targetEdgeKeys = new Set(\n target\n .filter((el) => el.data.source && el.data.target)\n .map((el) => makeEdgeKey(el.data.source as string, el.data.target as string)),\n );\n const currentKeys = new Set();\n cy.edges().forEach((edge) => {\n currentKeys.add(makeEdgeKey(edge.source().id(), edge.target().id()));\n });\n\n const toAdd = Array.from(targetEdgeKeys).filter((key) => !currentKeys.has(key));\n const toRemove = Array.from(currentKeys).filter((key) => !targetEdgeKeys.has(key));\n return { toAdd, toRemove };\n}\n\nexport function addEdgesFromTarget(\n cy: Cytoscape.Core,\n target: CyElementLike[],\n keys: Set,\n opacity = 1,\n): void {\n if (!keys.size) return;\n cy.batch(() => {\n target\n .filter((el) => el.data.source && el.data.target)\n .forEach((el) => {\n const key = makeEdgeKey(el.data.source as string, el.data.target as string);\n if (!keys.has(key) || findEdgeByKey(cy, key)) return;\n cy.add(el);\n const edge = findEdgeByKey(cy, key);\n if (edge) {\n edge.style(\"opacity\", opacity);\n }\n });\n });\n}\n\nexport function resetEdgeOpacities(cy: Cytoscape.Core): void {\n cy.edges().forEach((edge) => {\n (edge as Cytoscape.EdgeSingular).removeStyle(\"opacity\");\n });\n}\n\nexport function animateEdgeOpacityTransitions(\n cy: Cytoscape.Core,\n fadeIn: Set,\n fadeOut: Set,\n onEdgeComplete: () => void,\n duration = ANIMATION_MS,\n easing = ANIMATION_EASING,\n): void {\n fadeOut.forEach((key) => {\n const edge = findEdgeByKey(cy, key);\n if (!edge) {\n onEdgeComplete();\n return;\n }\n edge.animate(\n { style: { opacity: 0 } },\n {\n duration,\n easing: easing as Cytoscape.Css.TransitionTimingFunction,\n complete: () => {\n edge.remove();\n onEdgeComplete();\n },\n },\n );\n });\n\n fadeIn.forEach((key) => {\n const edge = findEdgeByKey(cy, key);\n if (!edge) {\n onEdgeComplete();\n return;\n }\n edge.style(\"opacity\", 0);\n edge.animate(\n { style: { opacity: 1 } },\n {\n duration,\n easing: easing as Cytoscape.Css.TransitionTimingFunction,\n complete: () => {\n edge.removeStyle(\"opacity\");\n onEdgeComplete();\n },\n },\n );\n });\n}\n","import Cytoscape from \"cytoscape\";\nimport {\n groupBoxSize,\n stepNodeSize,\n tableNodeSize,\n} from \"./graphNodeLayout\";\nimport { getTransformPrimaryKeys } from \"./nodeKeyChips\";\nimport {\n animateNodeVisualOpacity,\n ensureGroupExpandedVisible,\n nodeUsesHtmlLabel,\n setNodeVisualOpacity,\n stopHtmlOpacityAnimations,\n} from \"./htmlLabelOpacity\";\nimport { ANIMATION_EASING, ANIMATION_MS } from \"./animationConstants\";\nimport { animateEdgeOpacityTransitions, resetEdgeOpacities } from \"./edgeTransition\";\n\nexport type BBox = { x: number; y: number; w: number; h: number };\n\nexport type LayoutEdge = {\n source: string;\n target: string;\n sequential?: boolean;\n synthetic?: boolean;\n};\n\nexport type MeasuredNode = {\n id: string;\n type: string;\n name: string;\n w: number;\n h: number;\n parent?: string;\n metaGroup?: string;\n child_count?: number;\n indexes?: string[];\n pipelineIndex?: number;\n pipelineOrderKey?: string;\n};\n\nexport type LayoutEntry = {\n bbox: BBox;\n node: MeasuredNode;\n visible: boolean;\n};\n\nexport type GraphLayout = Map;\n\nconst GROUP_PADDING = { top: 56, bottom: 44, left: 44, right: 44 };\nconst RANK_SEP = 48;\nconst NODE_SEP = 48;\nfunction bboxFromCenter(cx: number, cy: number, w: number, h: number): BBox {\n return { x: cx - w / 2, y: cy - h / 2, w, h };\n}\n\nfunction bboxCenter(bbox: BBox): { x: number; y: number } {\n return { x: bbox.x + bbox.w / 2, y: bbox.y + bbox.h / 2 };\n}\n\nfunction topCenter(bbox: BBox): { x: number; y: number } {\n return { x: bbox.x + bbox.w / 2, y: bbox.y };\n}\n\nfunction placeByTopCenter(anchor: { x: number; y: number }, size: { w: number; h: number }): BBox {\n return { x: anchor.x - size.w / 2, y: anchor.y, w: size.w, h: size.h };\n}\n\nfunction bboxesOverlap(a: BBox, b: BBox): boolean {\n return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;\n}\n\nexport function measureNode(data: Cytoscape.NodeDataDefinition): MeasuredNode {\n const id = (data.id as string) || (data.name as string);\n const name = (data.name as string) || id;\n // Inner (metaGroup) nodes use the same card size as top-level nodes so\n // expanded groups read like the rest of the graph.\n const type = data.type as string;\n\n if (type === \"group\") {\n const tpk = getTransformPrimaryKeys(data);\n const size = groupBoxSize(name, (data.child_count as number) ?? 1, tpk);\n return {\n id,\n type,\n name,\n w: size.w,\n h: size.h,\n child_count: data.child_count as number,\n pipelineIndex: data.pipelineIndex as number | undefined,\n pipelineOrderKey: data.pipelineOrderKey as string | undefined,\n };\n }\n if (type === \"group-expanded\") {\n const tpk = getTransformPrimaryKeys(data);\n const w = (data.boxW as number) ?? groupBoxSize(name, (data.child_count as number) ?? 1, tpk).w;\n const h = (data.boxH as number) ?? groupBoxSize(name, (data.child_count as number) ?? 1, tpk).h;\n return {\n id,\n type,\n name,\n w,\n h,\n child_count: data.child_count as number,\n pipelineIndex: data.pipelineIndex as number | undefined,\n pipelineOrderKey: data.pipelineOrderKey as string | undefined,\n };\n }\n if (type === \"table\") {\n const size = tableNodeSize(name, (data.indexes as string[]) || [], false);\n return {\n id,\n type,\n name,\n w: size.w,\n h: size.h,\n parent: data.parent as string | undefined,\n metaGroup: data.metaGroup as string | undefined,\n indexes: data.indexes as string[] | undefined,\n pipelineIndex: data.pipelineIndex as number | undefined,\n pipelineOrderKey: data.pipelineOrderKey as string | undefined,\n };\n }\n const tpk = getTransformPrimaryKeys(data);\n const size = stepNodeSize(name, false, tpk);\n return {\n id,\n type,\n name,\n w: size.w,\n h: size.h,\n parent: data.parent as string | undefined,\n metaGroup: data.metaGroup as string | undefined,\n pipelineIndex: data.pipelineIndex as number | undefined,\n pipelineOrderKey: data.pipelineOrderKey as string | undefined,\n };\n}\n\nfunction sortIds(ids: string[]): string[] {\n return [...ids].sort((a, b) => a.localeCompare(b));\n}\n\nfunction comparePipelineOrder(\n a: string,\n b: string,\n nodes: Map,\n): number {\n const na = nodes.get(a);\n const nb = nodes.get(b);\n\n const oa = na?.pipelineOrderKey;\n const ob = nb?.pipelineOrderKey;\n if (oa && ob && oa !== ob) {\n return oa.localeCompare(ob);\n }\n\n const ia = na?.pipelineIndex;\n const ib = nb?.pipelineIndex;\n if (ia != null && ib != null && ia !== ib) {\n return ia - ib;\n }\n\n return a.localeCompare(b);\n}\n\nfunction sortRankIds(ids: string[], nodes: Map): string[] {\n return [...ids].sort((a, b) => comparePipelineOrder(a, b, nodes));\n}\n\n/** Count crossings between two consecutive ordered layers (straight-line bipartite). */\nexport function countBipartiteCrossings(\n upper: string[],\n lower: string[],\n edges: LayoutEdge[],\n): number {\n const upperIndex = new Map(upper.map((id, index) => [id, index]));\n const lowerIndex = new Map(lower.map((id, index) => [id, index]));\n const pairs: Array<{ u: number; v: number }> = [];\n edges.forEach(({ source, target }) => {\n const u = upperIndex.get(source);\n const v = lowerIndex.get(target);\n if (u != null && v != null) {\n pairs.push({ u, v });\n return;\n }\n const uRev = upperIndex.get(target);\n const vRev = lowerIndex.get(source);\n if (uRev != null && vRev != null) pairs.push({ u: uRev, v: vRev });\n });\n let crossings = 0;\n for (let i = 0; i < pairs.length; i += 1) {\n for (let j = i + 1; j < pairs.length; j += 1) {\n const a = pairs[i];\n const b = pairs[j];\n if ((a.u - b.u) * (a.v - b.v) < 0) crossings += 1;\n }\n }\n return crossings;\n}\n\n/** Normalized lateral position of a node in its own layer (0..1). */\nfunction layerNormalizedPos(\n id: string,\n nodeRank: Map,\n ordered: Map,\n): number | null {\n const rank = nodeRank.get(id);\n if (rank == null) return null;\n const layer = ordered.get(rank);\n if (!layer?.length) return null;\n const index = layer.indexOf(id);\n if (index < 0) return null;\n return layer.length === 1 ? 0.5 : index / (layer.length - 1);\n}\n\n/**\n * Crossings on the cut between two consecutive ranks, including long-span edges\n * (e.g. sequential dashed hops) that jump over intermediate layers.\n */\nexport function countLayerCutCrossings(\n ordered: Map,\n nodeRank: Map,\n upperRank: number,\n lowerRank: number,\n edges: LayoutEdge[],\n): number {\n const pairs: Array<{ u: number; v: number }> = [];\n edges.forEach(({ source, target }) => {\n let src = source;\n let tgt = target;\n let rs = nodeRank.get(src);\n let rt = nodeRank.get(tgt);\n if (rs == null || rt == null || rs === rt) return;\n if (rs > rt) {\n src = target;\n tgt = source;\n const tmp = rs;\n rs = rt;\n rt = tmp;\n }\n // Edge crosses this cut if it starts at/above upper and ends at/below lower.\n if (rs > upperRank || rt < lowerRank) return;\n const u = layerNormalizedPos(src, nodeRank, ordered);\n const v = layerNormalizedPos(tgt, nodeRank, ordered);\n if (u == null || v == null) return;\n pairs.push({ u, v });\n });\n\n let crossings = 0;\n for (let i = 0; i < pairs.length; i += 1) {\n for (let j = i + 1; j < pairs.length; j += 1) {\n const a = pairs[i];\n const b = pairs[j];\n if ((a.u - b.u) * (a.v - b.v) < 0) crossings += 1;\n }\n }\n return crossings;\n}\n\nfunction buildNodeRankMap(ordered: Map): Map {\n const nodeRank = new Map();\n ordered.forEach((ids, rank) => {\n ids.forEach((id) => nodeRank.set(id, rank));\n });\n return nodeRank;\n}\n\n/**\n * Neighbors for barycenter: adjacent-layer edges plus long-span ends on the\n * far side (so sequential dashed hops pull endpoints into uncrossed lanes).\n */\nfunction layerNeighborPositions(\n layer: string[],\n layerRank: number,\n toward: \"above\" | \"below\",\n nodeRank: Map,\n ordered: Map,\n edges: LayoutEdge[],\n): Map {\n const layerSet = new Set(layer);\n const positions = new Map();\n layer.forEach((id) => positions.set(id, []));\n\n edges.forEach(({ source, target }) => {\n const tryPush = (from: string, to: string) => {\n if (!layerSet.has(from)) return;\n const toRank = nodeRank.get(to);\n if (toRank == null) return;\n if (toward === \"above\" && !(toRank < layerRank)) return;\n if (toward === \"below\" && !(toRank > layerRank)) return;\n const pos = layerNormalizedPos(to, nodeRank, ordered);\n if (pos == null) return;\n positions.get(from)?.push(pos);\n };\n tryPush(source, target);\n tryPush(target, source);\n });\n\n return positions;\n}\n\nfunction orderByFarBarycenter(\n layer: string[],\n neighborPositions: Map,\n nodes: Map,\n): string[] {\n const scored = layer.map((id, index) => {\n const positions = neighborPositions.get(id) ?? [];\n const bary =\n positions.length > 0\n ? positions.reduce((sum, pos) => sum + pos, 0) / positions.length\n : index;\n return { id, bary, index };\n });\n scored.sort((a, b) => {\n if (a.bary !== b.bary) return a.bary - b.bary;\n const byPipe = comparePipelineOrder(a.id, b.id, nodes);\n if (byPipe !== 0) return byPipe;\n return a.index - b.index;\n });\n return scored.map((entry) => entry.id);\n}\n\n/** Adjacent transposition pass — swap neighbors if that cuts crossings. */\nfunction transposeLayerPair(\n ordered: Map,\n nodeRank: Map,\n upperRank: number,\n lowerRank: number,\n edges: LayoutEdge[],\n fixUpper: boolean,\n): { upper: string[]; lower: string[]; improved: boolean } {\n let improved = false;\n const nextUpper = [...(ordered.get(upperRank) ?? [])];\n const nextLower = [...(ordered.get(lowerRank) ?? [])];\n const movable = fixUpper ? nextLower : nextUpper;\n const scratch = new Map(ordered);\n scratch.set(upperRank, nextUpper);\n scratch.set(lowerRank, nextLower);\n\n let swapped = true;\n while (swapped) {\n swapped = false;\n for (let i = 0; i < movable.length - 1; i += 1) {\n const before = countLayerCutCrossings(\n scratch,\n nodeRank,\n upperRank,\n lowerRank,\n edges,\n );\n const tmp = movable[i];\n movable[i] = movable[i + 1];\n movable[i + 1] = tmp;\n const after = countLayerCutCrossings(\n scratch,\n nodeRank,\n upperRank,\n lowerRank,\n edges,\n );\n if (after < before) {\n swapped = true;\n improved = true;\n } else {\n movable[i + 1] = movable[i];\n movable[i] = tmp;\n }\n }\n }\n return { upper: nextUpper, lower: nextLower, improved };\n}\n\n/**\n * Sugiyama-style crossing minimization: barycenter sweeps + transpose, seeded by\n * pipeline order. Keeps existing rank assignment; only reorders within layers.\n * Long-span edges (sequential dashed hops) count on every cut they cross so they\n * avoid colliding with solid mid-layer routes.\n */\nexport function minimizeLayerCrossings(\n ranks: Map,\n edges: LayoutEdge[],\n nodes: Map,\n maxIters = 24,\n): Map {\n const rankKeys = Array.from(ranks.keys()).sort((a, b) => a - b);\n if (rankKeys.length < 2) return ranks;\n\n const ordered = new Map();\n rankKeys.forEach((r) => ordered.set(r, sortRankIds(ranks.get(r) ?? [], nodes)));\n const nodeRank = buildNodeRankMap(ordered);\n\n const totalCrossings = () => {\n let total = 0;\n for (let i = 0; i < rankKeys.length - 1; i += 1) {\n total += countLayerCutCrossings(\n ordered,\n nodeRank,\n rankKeys[i],\n rankKeys[i + 1],\n edges,\n );\n }\n return total;\n };\n\n let best = new Map(Array.from(ordered.entries()).map(([k, v]) => [k, [...v]]));\n let bestScore = totalCrossings();\n let prevScore = bestScore;\n\n for (let iter = 0; iter < maxIters; iter += 1) {\n // Downward sweep: order layer i+1 from everything above (incl. long spans).\n for (let i = 0; i < rankKeys.length - 1; i += 1) {\n const lowerKey = rankKeys[i + 1];\n const lower = ordered.get(lowerKey) ?? [];\n const neighborPos = layerNeighborPositions(\n lower,\n lowerKey,\n \"above\",\n nodeRank,\n ordered,\n edges,\n );\n ordered.set(lowerKey, orderByFarBarycenter(lower, neighborPos, nodes));\n }\n\n // Upward sweep: order layer i from everything below.\n for (let i = rankKeys.length - 1; i > 0; i -= 1) {\n const upperKey = rankKeys[i - 1];\n const upper = ordered.get(upperKey) ?? [];\n const neighborPos = layerNeighborPositions(\n upper,\n upperKey,\n \"below\",\n nodeRank,\n ordered,\n edges,\n );\n ordered.set(upperKey, orderByFarBarycenter(upper, neighborPos, nodes));\n }\n\n // Local transpose refinement on each consecutive pair.\n for (let i = 0; i < rankKeys.length - 1; i += 1) {\n const upperKey = rankKeys[i];\n const lowerKey = rankKeys[i + 1];\n const down = transposeLayerPair(\n ordered,\n nodeRank,\n upperKey,\n lowerKey,\n edges,\n true,\n );\n ordered.set(upperKey, down.upper);\n ordered.set(lowerKey, down.lower);\n const up = transposeLayerPair(\n ordered,\n nodeRank,\n upperKey,\n lowerKey,\n edges,\n false,\n );\n ordered.set(upperKey, up.upper);\n ordered.set(lowerKey, up.lower);\n }\n\n const score = totalCrossings();\n if (score < bestScore) {\n bestScore = score;\n best = new Map(Array.from(ordered.entries()).map(([k, v]) => [k, [...v]]));\n }\n if (score >= prevScore) break;\n prevScore = score;\n }\n\n return best;\n}\n\nfunction densifyRanks(rank: Map): Map {\n const sorted = Array.from(new Set(rank.values())).sort((a, b) => a - b);\n const remap = new Map(sorted.map((value, index) => [value, index]));\n const next = new Map();\n rank.forEach((value, id) => {\n next.set(id, remap.get(value) ?? value);\n });\n return next;\n}\n\nfunction hasPath(\n graph: Map>,\n from: string,\n to: string,\n visited: Set = new Set(),\n): boolean {\n if (from === to) return true;\n if (visited.has(from)) return false;\n visited.add(from);\n const nexts = Array.from(graph.get(from) ?? []);\n for (let i = 0; i < nexts.length; i += 1) {\n if (hasPath(graph, nexts[i], to, visited)) return true;\n }\n return false;\n}\n\nfunction edgePipelinePriority(edge: LayoutEdge, nodes: Map): number {\n const srcIdx = nodes.get(edge.source)?.pipelineIndex ?? 9999;\n const tgtIdx = nodes.get(edge.target)?.pipelineIndex ?? 9999;\n return srcIdx <= tgtIdx ? 0 : 1;\n}\n\n/** Edges used only for vertical rank — cycle-closing edges are dropped. */\nexport function makeAcyclicRankEdges(\n edges: LayoutEdge[],\n nodes: Map,\n): LayoutEdge[] {\n const sorted = [...edges].sort(\n (a, b) => edgePipelinePriority(a, nodes) - edgePipelinePriority(b, nodes),\n );\n const result: LayoutEdge[] = [];\n const graph = new Map>();\n\n sorted.forEach((edge) => {\n if (!nodes.has(edge.source) || !nodes.has(edge.target)) return;\n if (hasPath(graph, edge.target, edge.source)) return;\n result.push(edge);\n if (!graph.has(edge.source)) graph.set(edge.source, new Set());\n graph.get(edge.source)?.add(edge.target);\n });\n return result;\n}\n\nfunction longestPathRanks(\n nodes: Map,\n edges: LayoutEdge[],\n): Map {\n const ids = sortIds(Array.from(nodes.keys()));\n const rank = new Map();\n ids.forEach((id) => rank.set(id, 0));\n let changed = true;\n let guard = 0;\n while (changed && guard < ids.length + 1) {\n changed = false;\n guard += 1;\n for (const { source, target } of edges) {\n if (!nodes.has(source) || !nodes.has(target)) continue;\n const nextRank = (rank.get(source) ?? 0) + 1;\n if (nextRank > (rank.get(target) ?? 0)) {\n rank.set(target, nextRank);\n changed = true;\n }\n }\n }\n return rank;\n}\n\nexport function buildRankEdges(\n nodes: Map,\n renderEdges: LayoutEdge[],\n): LayoutEdge[] {\n // Sequential/synthetic next-step hops stay out of rank assignment (they are\n // visual “pipeline order” overlays). Crossing minimization still sees them\n // — including as long spans across intermediate layers.\n const rankCandidates = renderEdges.filter((edge) => !edge.sequential && !edge.synthetic);\n return makeAcyclicRankEdges(rankCandidates, nodes);\n}\n\nfunction computeRanks(\n nodes: Map,\n renderEdges: LayoutEdge[],\n rankEdges?: LayoutEdge[],\n): Map {\n const edgesForRank = rankEdges ?? buildRankEdges(nodes, renderEdges);\n return densifyRanks(longestPathRanks(nodes, edgesForRank));\n}\n\n/**\n * Deterministic layered layout (top-to-bottom or left-to-right).\n * Vertical rank from dependency depth; within-layer order uses Sugiyama-style\n * barycenter crossing minimization (seeded by pipeline order).\n */\nexport function layoutLayeredDag(\n nodes: Map,\n edges: LayoutEdge[],\n rankDir: \"TB\" | \"LR\" = \"TB\",\n rankEdges?: LayoutEdge[],\n): Map {\n const ids = sortIds(Array.from(nodes.keys()));\n if (!ids.length) return new Map();\n\n const rank = computeRanks(nodes, edges, rankEdges);\n\n const ranks = new Map();\n ids.forEach((id) => {\n const r = rank.get(id) ?? 0;\n if (!ranks.has(r)) ranks.set(r, []);\n ranks.get(r)?.push(id);\n });\n // Use all render edges for crossing reduction (incl. long spans between\n // adjacent layers after densify); rankEdges only drive layer assignment.\n const orderedRanks = minimizeLayerCrossings(ranks, edges, nodes);\n\n const positions = new Map();\n const sortedRankKeys = Array.from(orderedRanks.keys()).sort((a, b) => a - b);\n\n if (rankDir === \"TB\") {\n let yCursor = 0;\n sortedRankKeys.forEach((r) => {\n const rankIds = orderedRanks.get(r) ?? [];\n const widths = rankIds.map((id) => nodes.get(id)?.w ?? 0);\n const totalWidth =\n widths.reduce((sum, w) => sum + w, 0) + NODE_SEP * Math.max(0, rankIds.length - 1);\n let xCursor = -totalWidth / 2;\n rankIds.forEach((id, index) => {\n const node = nodes.get(id);\n if (!node) return;\n const cx = xCursor + node.w / 2;\n const cy = yCursor + node.h / 2;\n positions.set(id, bboxFromCenter(cx, cy, node.w, node.h));\n xCursor += node.w + (index < rankIds.length - 1 ? NODE_SEP : 0);\n });\n const rankHeight = Math.max(...rankIds.map((id) => nodes.get(id)?.h ?? 0), 0);\n yCursor += rankHeight + RANK_SEP;\n });\n } else {\n let xCursor = 0;\n sortedRankKeys.forEach((r) => {\n const rankIds = orderedRanks.get(r) ?? [];\n const heights = rankIds.map((id) => nodes.get(id)?.h ?? 0);\n const totalHeight =\n heights.reduce((sum, h) => sum + h, 0) + NODE_SEP * Math.max(0, rankIds.length - 1);\n let yCursor = -totalHeight / 2;\n rankIds.forEach((id, index) => {\n const node = nodes.get(id);\n if (!node) return;\n const cx = xCursor + node.w / 2;\n const cy = yCursor + node.h / 2;\n positions.set(id, bboxFromCenter(cx, cy, node.w, node.h));\n yCursor += node.h + (index < rankIds.length - 1 ? NODE_SEP : 0);\n });\n const rankWidth = Math.max(...rankIds.map((id) => nodes.get(id)?.w ?? 0), 0);\n xCursor += rankWidth + RANK_SEP;\n });\n }\n\n return positions;\n}\n\nfunction innerGraphBBox(positions: Map): BBox {\n let x1 = Infinity;\n let y1 = Infinity;\n let x2 = -Infinity;\n let y2 = -Infinity;\n positions.forEach((bbox) => {\n x1 = Math.min(x1, bbox.x);\n y1 = Math.min(y1, bbox.y);\n x2 = Math.max(x2, bbox.x + bbox.w);\n y2 = Math.max(y2, bbox.y + bbox.h);\n });\n if (!Number.isFinite(x1)) return { x: 0, y: 0, w: 0, h: 0 };\n return { x: x1, y: y1, w: x2 - x1, h: y2 - y1 };\n}\n\nfunction layoutVerticalStack(\n children: Map,\n orderedIds: string[],\n): Map {\n const positions = new Map();\n const order = orderedIds.filter((id) => children.has(id));\n if (!order.length) return positions;\n\n let yCursor = 0;\n let maxW = 0;\n order.forEach((id) => {\n maxW = Math.max(maxW, children.get(id)?.w ?? 0);\n });\n\n order.forEach((id) => {\n const node = children.get(id);\n if (!node) return;\n const cx = maxW / 2;\n const cy = yCursor + node.h / 2;\n positions.set(id, bboxFromCenter(cx, cy, node.w, node.h));\n yCursor += node.h + RANK_SEP;\n });\n return positions;\n}\n\nexport function layoutInnerGraph(\n children: Map,\n edges: LayoutEdge[],\n pipelineOrder: string[] = [],\n): { positions: Map; contentBBox: BBox } {\n const hasInternalEdges = edges.some(\n ({ source, target }) => children.has(source) && children.has(target),\n );\n const rankEdges = hasInternalEdges ? buildRankEdges(children, edges) : edges;\n const positions = hasInternalEdges\n ? layoutLayeredDag(children, edges, \"TB\", rankEdges)\n : layoutVerticalStack(children, pipelineOrder.length ? pipelineOrder : sortIds(Array.from(children.keys())));\n return { positions, contentBBox: innerGraphBBox(positions) };\n}\n\nfunction normalizeLayout(layout: GraphLayout, margin = 80): void {\n let minX = Infinity;\n let minY = Infinity;\n layout.forEach((entry) => {\n if (!entry.visible) return;\n minX = Math.min(minX, entry.bbox.x);\n minY = Math.min(minY, entry.bbox.y);\n });\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return;\n const shiftX = margin - minX;\n const shiftY = margin - minY;\n if (shiftX === 0 && shiftY === 0) return;\n layout.forEach((entry) => {\n if (!entry.visible) return;\n entry.bbox.x += shiftX;\n entry.bbox.y += shiftY;\n });\n}\n\nexport function cloneLayout(layout: GraphLayout): GraphLayout {\n const next = new Map();\n layout.forEach((entry, id) => {\n next.set(id, {\n bbox: { ...entry.bbox },\n node: { ...entry.node },\n visible: entry.visible,\n });\n });\n return next;\n}\n\nfunction getGroupMembers(\n nodes: Map,\n groupId: string,\n): Set {\n const members = new Set();\n nodes.forEach((data, id) => {\n if (data.metaGroup === groupId) members.add(id);\n });\n return members;\n}\n\nfunction edgesToList(edges: Iterable): LayoutEdge[] {\n return Array.from(edges).map((edge) => ({\n source: edge.source as string,\n target: edge.target as string,\n sequential: edge.sequential as boolean | undefined,\n synthetic: edge.synthetic as boolean | undefined,\n }));\n}\n\nfunction getBoundaryNodes(\n members: Set,\n edges: Iterable,\n): Set {\n const boundary = new Set();\n for (const edge of Array.from(edges)) {\n const source = edge.source as string;\n const target = edge.target as string;\n const sourceIn = members.has(source);\n const targetIn = members.has(target);\n if (sourceIn !== targetIn) {\n if (sourceIn) boundary.add(source);\n if (targetIn) boundary.add(target);\n }\n }\n return boundary;\n}\n\ntype LayoutMoveUnit = {\n members: Array<{ entry: LayoutEntry; origX: number; origY: number }>;\n originX: number;\n originY: number;\n width: number;\n height: number;\n};\n\n/**\n * Group a blue frame with its inner nodes so expand/collapse shifts them as one\n * rigid body. Without this, row-repacking treats each child as its own node and\n * they drift out of the frame when another group expands above/beside them.\n */\nfunction collectLayoutMoveUnits(layout: GraphLayout, exclude: Set): LayoutMoveUnit[] {\n const claimed = new Set();\n const units: LayoutMoveUnit[] = [];\n\n layout.forEach((entry, id) => {\n if (exclude.has(id) || !entry.visible) return;\n if (entry.node.type !== \"group-expanded\") return;\n\n const members: LayoutMoveUnit[\"members\"] = [\n { entry, origX: entry.bbox.x, origY: entry.bbox.y },\n ];\n claimed.add(id);\n\n layout.forEach((childEntry, childId) => {\n if (exclude.has(childId) || !childEntry.visible) return;\n if (childEntry.node.metaGroup !== id) return;\n members.push({\n entry: childEntry,\n origX: childEntry.bbox.x,\n origY: childEntry.bbox.y,\n });\n claimed.add(childId);\n });\n\n let x1 = Infinity;\n let y1 = Infinity;\n let x2 = -Infinity;\n let y2 = -Infinity;\n members.forEach((m) => {\n x1 = Math.min(x1, m.origX);\n y1 = Math.min(y1, m.origY);\n x2 = Math.max(x2, m.origX + m.entry.bbox.w);\n y2 = Math.max(y2, m.origY + m.entry.bbox.h);\n });\n\n units.push({\n members,\n originX: x1,\n originY: y1,\n width: x2 - x1,\n height: y2 - y1,\n });\n });\n\n layout.forEach((entry, id) => {\n if (exclude.has(id) || !entry.visible || claimed.has(id)) return;\n units.push({\n members: [{ entry, origX: entry.bbox.x, origY: entry.bbox.y }],\n originX: entry.bbox.x,\n originY: entry.bbox.y,\n width: entry.bbox.w,\n height: entry.bbox.h,\n });\n });\n\n return units;\n}\n\nfunction translateUnit(unit: LayoutMoveUnit, dx: number, dy: number): void {\n if (dx === 0 && dy === 0) return;\n unit.members.forEach((m) => {\n m.entry.bbox.x = m.origX + dx;\n m.entry.bbox.y = m.origY + dy;\n });\n}\n\nfunction reassignExternalRowsOnExpand(\n layout: GraphLayout,\n oldGroupBBox: BBox,\n newGroupBBox: BBox,\n exclude: Set,\n): void {\n const startY = newGroupBBox.y + newGroupBBox.h + NODE_SEP;\n\n const units = collectLayoutMoveUnits(layout, exclude)\n .filter((unit) => unit.originY >= oldGroupBBox.y)\n .sort((a, b) => a.originY - b.originY || a.originX - b.originX);\n\n if (!units.length) return;\n\n const rows: LayoutMoveUnit[][] = [];\n units.forEach((unit) => {\n const row = rows.find((r) => Math.abs(r[0].originY - unit.originY) <= 32);\n if (row) row.push(unit);\n else rows.push([unit]);\n });\n rows.sort((a, b) => a[0].originY - b[0].originY);\n\n let yCursor = startY;\n rows.forEach((row) => {\n row.sort((a, b) => a.originX - b.originX);\n const rowHeight = Math.max(...row.map((u) => u.height));\n row.forEach((unit) => {\n translateUnit(unit, 0, yCursor - unit.originY);\n });\n yCursor += rowHeight + RANK_SEP;\n });\n\n // Resolve horizontal crowding within each new row (units stay rigid).\n rows.forEach((row) => {\n for (let i = 1; i < row.length; i += 1) {\n const prev = row[i - 1];\n const curr = row[i];\n const prevRight = Math.max(\n ...prev.members.map((m) => m.entry.bbox.x + m.entry.bbox.w),\n );\n const currLeft = Math.min(...curr.members.map((m) => m.entry.bbox.x));\n const minLeft = prevRight + NODE_SEP;\n if (currLeft < minLeft) {\n const dx = minLeft - currLeft;\n curr.members.forEach((m) => {\n m.entry.bbox.x += dx;\n });\n }\n }\n });\n}\n\n/**\n * Upfront layout for expand/collapse: top-center anchor stays fixed; external nodes\n * at/ below the group top move by the group size delta. On expand, rows below the\n * blue frame are repacked from the pre-expand row structure. Expanded groups move\n * as rigid clusters (frame + inners) so multi-expand stays coherent.\n */\nfunction computeExternalPositionsAfterGroupResize(\n layout: GraphLayout,\n oldGroupBBox: BBox,\n newGroupBBox: BBox,\n exclude: Set,\n rankDir: \"TB\" | \"LR\",\n): void {\n if (rankDir === \"TB\") {\n const deltaH = newGroupBBox.h - oldGroupBBox.h;\n if (deltaH === 0) return;\n\n if (deltaH > 0) {\n reassignExternalRowsOnExpand(layout, oldGroupBBox, newGroupBBox, exclude);\n return;\n }\n\n // Collapse fallback (when pre-expand snapshot is unavailable).\n // Uniform delta keeps other expanded groups' internals aligned with their frame.\n collectLayoutMoveUnits(layout, exclude).forEach((unit) => {\n if (unit.originY >= newGroupBBox.y) {\n translateUnit(unit, 0, deltaH);\n }\n });\n return;\n }\n\n const deltaW = newGroupBBox.w - oldGroupBBox.w;\n if (deltaW === 0) return;\n\n const floorX = newGroupBBox.x + newGroupBBox.w + NODE_SEP;\n collectLayoutMoveUnits(layout, exclude).forEach((unit) => {\n if (unit.originX < oldGroupBBox.x) return;\n\n let dx = deltaW;\n const candidate: BBox = {\n x: unit.originX + dx,\n y: unit.originY,\n w: unit.width,\n h: unit.height,\n };\n if (deltaW > 0 && bboxesOverlap(candidate, newGroupBBox)) {\n dx = floorX - unit.originX;\n }\n translateUnit(unit, dx, 0);\n });\n}\n\nexport function ensureLayoutCoversNodes(\n layout: GraphLayout,\n nodes: Map,\n cy?: Cytoscape.Core,\n): void {\n nodes.forEach((data, id) => {\n if (layout.has(id)) return;\n if (data.metaGroup) return;\n if (data.type === \"group-expanded\") return;\n\n const measured = measureNode({ ...data, id });\n let bbox: BBox;\n if (cy) {\n const ele = cy.getElementById(id);\n if (!ele.empty()) {\n const center = (ele as Cytoscape.NodeSingular).position();\n bbox = bboxFromCenter(center.x, center.y, measured.w, measured.h);\n } else {\n bbox = bboxFromCenter(0, 0, measured.w, measured.h);\n }\n } else {\n bbox = bboxFromCenter(0, 0, measured.w, measured.h);\n }\n layout.set(id, { bbox, node: measured, visible: true });\n });\n}\n\nexport function expandGroupInLayout(\n layout: GraphLayout,\n groupId: string,\n nodes: Map,\n edges: Iterable,\n rankDir: \"TB\" | \"LR\",\n pipelineOrder: string[] = [],\n): GraphLayout {\n const next = cloneLayout(layout);\n const groupEntry = next.get(groupId);\n if (!groupEntry) return next;\n\n const members = getGroupMembers(nodes, groupId);\n const boundary = getBoundaryNodes(members, edges);\n const innerIds = sortIds(\n Array.from(members).filter((id) => {\n const data = nodes.get(id);\n return data && !(data.type === \"table\" && boundary.has(id));\n }),\n );\n\n const innerNodes = new Map();\n innerIds.forEach((id) => {\n const data = nodes.get(id);\n if (!data) return;\n innerNodes.set(id, measureNode({ ...data, id }));\n });\n\n const edgeList = edgesToList(edges);\n const innerEdges: LayoutEdge[] = edgeList.filter(\n ({ source, target }) => innerNodes.has(source) && innerNodes.has(target),\n );\n\n const { positions: innerPositions, contentBBox } = layoutInnerGraph(\n innerNodes,\n innerEdges,\n pipelineOrder.length ? pipelineOrder : innerIds,\n );\n const expandedSize = {\n w: contentBBox.w + GROUP_PADDING.left + GROUP_PADDING.right,\n h: contentBBox.h + GROUP_PADDING.top + GROUP_PADDING.bottom,\n };\n\n const anchor = topCenter(groupEntry.bbox);\n const oldBBox = { ...groupEntry.bbox };\n const groupBBox = placeByTopCenter(anchor, expandedSize);\n const innerOrigin = {\n x: groupBBox.x + GROUP_PADDING.left - contentBBox.x,\n y: groupBBox.y + GROUP_PADDING.top - contentBBox.y,\n };\n\n groupEntry.bbox = groupBBox;\n groupEntry.node = {\n ...groupEntry.node,\n type: \"group-expanded\",\n w: groupBBox.w,\n h: groupBBox.h,\n };\n groupEntry.visible = true;\n\n innerIds.forEach((id) => {\n const innerBBox = innerPositions.get(id);\n const measured = innerNodes.get(id);\n if (!innerBBox || !measured) return;\n next.set(id, {\n bbox: {\n x: innerOrigin.x + innerBBox.x,\n y: innerOrigin.y + innerBBox.y,\n w: innerBBox.w,\n h: innerBBox.h,\n },\n node: { ...measured, metaGroup: groupId },\n visible: true,\n });\n });\n\n const exclude = new Set([groupId, ...innerIds]);\n computeExternalPositionsAfterGroupResize(next, oldBBox, groupBBox, exclude, rankDir);\n return next;\n}\n\nexport function getInnerNodeIdsFromLayout(\n layout: GraphLayout,\n groupId: string,\n): Set {\n const ids = new Set();\n layout.forEach((entry, id) => {\n if (entry.node.metaGroup === groupId) ids.add(id);\n });\n return ids;\n}\n\nexport function collapseGroupInLayout(\n layout: GraphLayout,\n groupId: string,\n nodes: Map,\n edges: Iterable,\n rankDir: \"TB\" | \"LR\",\n layoutInnerIds?: Set,\n): GraphLayout {\n const next = cloneLayout(layout);\n const groupEntry = next.get(groupId);\n if (!groupEntry) return next;\n\n const oldBBox = { ...groupEntry.bbox };\n const members = layoutInnerIds ?? getGroupMembers(nodes, groupId);\n const data = nodes.get(groupId);\n const collapsed = measureNode({\n ...(data ?? { type: \"group\", name: groupId }),\n type: \"group\",\n name: groupId,\n child_count: data?.child_count ?? members.size,\n });\n\n const anchor = topCenter(oldBBox);\n const collapsedBBox = placeByTopCenter(anchor, { w: collapsed.w, h: collapsed.h });\n\n members.forEach((id) => next.delete(id));\n\n groupEntry.bbox = collapsedBBox;\n groupEntry.node = collapsed;\n groupEntry.visible = true;\n\n const exclude = new Set([groupId]);\n computeExternalPositionsAfterGroupResize(next, oldBBox, collapsedBBox, exclude, rankDir);\n return next;\n}\n\nexport function buildCollapsedLayout(\n nodes: Map,\n edges: Iterable,\n expanded: Set,\n rankDir: \"TB\" | \"LR\",\n pipelineOrders: Map = new Map(),\n): GraphLayout {\n const layout: GraphLayout = new Map();\n const edgeList = edgesToList(edges);\n const layoutNodes = new Map();\n nodes.forEach((data, id) => {\n if (data.parent || data.metaGroup) return;\n // reprocessData marks expanded metas as group-expanded. Seed them here as a\n // collapsed group footprint so expandGroupInLayout can find and grow them —\n // skipping left the blue frame stuck at default 450×168 with no boxW/boxH.\n if (data.type === \"group-expanded\") {\n layoutNodes.set(\n id,\n measureNode({\n ...data,\n id,\n type: \"group\",\n }),\n );\n return;\n }\n layoutNodes.set(id, measureNode({ ...data, id }));\n });\n\n const positions = layoutLayeredDag(layoutNodes, edgeList, rankDir, buildRankEdges(layoutNodes, edgeList));\n layoutNodes.forEach((node, id) => {\n const bbox = positions.get(id);\n if (!bbox) return;\n layout.set(id, { bbox, node, visible: true });\n });\n\n sortIds(Array.from(expanded))\n .filter((groupId) => layout.has(groupId))\n // Top-to-bottom (then left-to-right) so an upper expand never row-repacks\n // a group that was already expanded below it.\n .sort((a, b) => {\n const ea = layout.get(a);\n const eb = layout.get(b);\n if (!ea || !eb) return a.localeCompare(b);\n return ea.bbox.y - eb.bbox.y || ea.bbox.x - eb.bbox.x || a.localeCompare(b);\n })\n .forEach((groupId) => {\n const expandedLayout = expandGroupInLayout(\n layout,\n groupId,\n nodes,\n edges,\n rankDir,\n pipelineOrders.get(groupId) ?? [],\n );\n expandedLayout.forEach((entry, id) => layout.set(id, entry));\n });\n\n normalizeLayout(layout);\n return layout;\n}\n\nexport function syncLayoutFromCy(cy: Cytoscape.Core, layout: GraphLayout): GraphLayout {\n const synced = cloneLayout(layout);\n synced.forEach((entry, id) => {\n const ele = cy.getElementById(id);\n if (ele.empty()) return;\n const node = ele as Cytoscape.NodeSingular;\n const center = node.position();\n synced.set(id, {\n ...entry,\n bbox: bboxFromCenter(center.x, center.y, entry.bbox.w, entry.bbox.h),\n });\n });\n return synced;\n}\n\nexport function layoutToCenters(layout: GraphLayout): Map {\n const centers = new Map();\n layout.forEach((entry, id) => {\n if (!entry.visible) return;\n centers.set(id, bboxCenter(entry.bbox));\n });\n return centers;\n}\n\nexport function applyLayoutToCy(cy: Cytoscape.Core, layout: GraphLayout): void {\n cy.batch(() => {\n // Parent compound nodes first so child positions stay stable.\n const ordered = [\n ...Array.from(layout.entries()).filter(([, e]) => e.node.type === \"group-expanded\"),\n ...Array.from(layout.entries()).filter(([, e]) => e.node.type !== \"group-expanded\"),\n ];\n ordered.forEach(([id, entry]) => {\n if (!entry.visible) return;\n const ele = cy.getElementById(id);\n if (ele.empty()) return;\n const node = ele as Cytoscape.NodeSingular;\n const center = bboxCenter(entry.bbox);\n node.position(center);\n if (entry.node.type === \"group\" || entry.node.type === \"group-expanded\") {\n // Drop any leftover style bypass from an interrupted morph — width/height\n // are mapped from boxW/boxH; a stale bypass leaves the frame squashed.\n node.removeStyle(\"width\");\n node.removeStyle(\"height\");\n node.data({\n boxW: entry.bbox.w,\n boxH: entry.bbox.h,\n });\n }\n if (entry.node.type === \"group-expanded\") {\n ensureGroupExpandedVisible(node);\n }\n });\n });\n}\n\nconst morphRafStore = new WeakMap>();\nconst pendingMorphStore = new WeakMap<\n Cytoscape.Core,\n Map<\n string,\n {\n to: BBox;\n toCenter: { x: number; y: number };\n opacityTo?: number;\n onComplete?: () => void;\n }\n >\n>();\n\nfunction trackMorphRaf(cy: Cytoscape.Core, id: number): void {\n let set = morphRafStore.get(cy);\n if (!set) {\n set = new Set();\n morphRafStore.set(cy, set);\n }\n set.add(id);\n}\n\nfunction getPendingMorphs(cy: Cytoscape.Core) {\n let map = pendingMorphStore.get(cy);\n if (!map) {\n map = new Map();\n pendingMorphStore.set(cy, map);\n }\n return map;\n}\n\nfunction stopMorphAnimations(cy: Cytoscape.Core): void {\n const rafs = morphRafStore.get(cy);\n if (rafs) {\n rafs.forEach((id) => cancelAnimationFrame(id));\n rafs.clear();\n }\n // Jump unfinished morphs to their end state (mirrors cy.stop(true, true)).\n // Cancelling mid-morph without this leaves group-expanded stuck at the\n // collapsed 450×168 frame (the \"squashed blue node\" after expand/collapse).\n const pending = pendingMorphStore.get(cy);\n if (!pending?.size) return;\n pending.forEach((morph, nodeId) => {\n const ele = cy.getElementById(nodeId);\n if (!ele.empty()) {\n const node = ele as Cytoscape.NodeSingular;\n node.removeStyle(\"width\");\n node.removeStyle(\"height\");\n node.data({ boxW: morph.to.w, boxH: morph.to.h });\n node.position(morph.toCenter);\n if (typeof morph.opacityTo === \"number\") {\n node.style(\"opacity\", morph.opacityTo);\n }\n }\n morph.onComplete?.();\n });\n pending.clear();\n}\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;\n}\n\n/**\n * Animate group frame size via boxW/boxH data (stylesheet mappers), not style\n * width/height bypasses. Cytoscape's style-animate of width fights function-mapped\n * stylesheet rules and leaves expand stuck at the collapsed size.\n */\nfunction animateNodeBoxMorph(\n cy: Cytoscape.Core,\n node: Cytoscape.NodeSingular,\n from: BBox,\n to: BBox,\n fromCenter: { x: number; y: number },\n toCenter: { x: number; y: number },\n options: {\n duration?: number;\n opacityFrom?: number;\n opacityTo?: number;\n onComplete?: () => void;\n } = {},\n): void {\n const duration = options.duration ?? ANIMATION_MS;\n const start = performance.now();\n const fadeOpacity =\n typeof options.opacityFrom === \"number\" && typeof options.opacityTo === \"number\";\n const nodeId = node.id();\n const pending = getPendingMorphs(cy);\n\n node.removeStyle(\"width\");\n node.removeStyle(\"height\");\n node.position(fromCenter);\n node.data({ boxW: from.w, boxH: from.h });\n if (fadeOpacity) {\n node.style(\"opacity\", options.opacityFrom!);\n }\n\n pending.set(nodeId, {\n to,\n toCenter,\n opacityTo: fadeOpacity ? options.opacityTo : undefined,\n onComplete: options.onComplete,\n });\n\n const finish = () => {\n pending.delete(nodeId);\n if (cy.destroyed() || node.removed()) {\n options.onComplete?.();\n return;\n }\n node.removeStyle(\"width\");\n node.removeStyle(\"height\");\n node.data({ boxW: to.w, boxH: to.h });\n node.position(toCenter);\n if (fadeOpacity) {\n node.style(\"opacity\", options.opacityTo!);\n }\n options.onComplete?.();\n };\n\n const tick = (now: number) => {\n if (!pending.has(nodeId)) return; // stopped / jumped to end\n if (cy.destroyed() || node.removed()) {\n pending.delete(nodeId);\n options.onComplete?.();\n return;\n }\n const t = Math.min(1, (now - start) / duration);\n const e = easeInOutCubic(t);\n const w = from.w + (to.w - from.w) * e;\n const h = from.h + (to.h - from.h) * e;\n const x = fromCenter.x + (toCenter.x - fromCenter.x) * e;\n const y = fromCenter.y + (toCenter.y - fromCenter.y) * e;\n\n node.position({ x, y });\n node.removeStyle(\"width\");\n node.removeStyle(\"height\");\n node.data({ boxW: w, boxH: h });\n if (fadeOpacity) {\n const op = options.opacityFrom! + (options.opacityTo! - options.opacityFrom!) * e;\n node.style(\"opacity\", op);\n }\n\n if (t < 1) {\n trackMorphRaf(cy, requestAnimationFrame(tick));\n return;\n }\n finish();\n };\n\n trackMorphRaf(cy, requestAnimationFrame(tick));\n}\n\nexport function stopLayoutAnimations(cy: Cytoscape.Core): void {\n if (cy.destroyed()) return;\n stopHtmlOpacityAnimations(cy);\n stopMorphAnimations(cy);\n cy.stop(true, true);\n}\n\nexport type OpacityTiming = {\n delay?: number;\n duration?: number;\n};\n\nexport type LayoutTransitionOptions = {\n fadeIn?: Set;\n fadeOut?: Set;\n /** Animate width/height (e.g. group-expanded ↔ collapsed group). */\n morphBoxes?: Map;\n /** Edge keys (`source->target`) to crossfade during the transition. */\n edgeFadeIn?: Set;\n edgeFadeOut?: Set;\n fadeInTiming?: OpacityTiming | Map;\n fadeOutTiming?: OpacityTiming | Map;\n onComplete?: () => void;\n};\n\nfunction resolveOpacityTiming(\n id: string,\n timing?: OpacityTiming | Map,\n): OpacityTiming {\n if (!timing) return {};\n if (timing instanceof Map) return timing.get(id) ?? {};\n return timing;\n}\n\nexport function animateLayoutTransition(\n cy: Cytoscape.Core,\n fromCenters: Map,\n toLayout: GraphLayout,\n options?: LayoutTransitionOptions,\n): void {\n stopLayoutAnimations(cy);\n\n const toCenters = layoutToCenters(toLayout);\n const fadeIn = options?.fadeIn ?? new Set();\n const fadeOut = options?.fadeOut ?? new Set();\n const morphBoxes = options?.morphBoxes ?? new Map();\n\n fadeIn.forEach((id) => {\n const node = cy.getElementById(id);\n if (!node.empty()) {\n setNodeVisualOpacity(cy, node as Cytoscape.NodeSingular, 0);\n }\n });\n\n fadeOut.forEach((id) => {\n const node = cy.getElementById(id);\n if (node.empty()) return;\n const n = node as Cytoscape.NodeSingular;\n if (nodeUsesHtmlLabel(n)) {\n setNodeVisualOpacity(cy, n, 1);\n }\n });\n\n applyLayoutToCy(cy, toLayout);\n\n type AnimSpec = {\n id: string;\n target?: { x: number; y: number };\n fadeIn: boolean;\n fadeOut: boolean;\n move: boolean;\n morph?: { from: BBox; to: BBox };\n };\n\n const specs: AnimSpec[] = [];\n\n toCenters.forEach((target, id) => {\n const from = fromCenters.get(id);\n const isFadeIn = fadeIn.has(id);\n const isFadeOut = fadeOut.has(id);\n const morph = morphBoxes.get(id);\n const move = Boolean(from) || Boolean(morph);\n if (!move && !isFadeIn && !isFadeOut) {\n return;\n }\n specs.push({ id, target, fadeIn: isFadeIn, fadeOut: isFadeOut, move, morph });\n });\n\n morphBoxes.forEach((morph, id) => {\n if (specs.some((spec) => spec.id === id)) return;\n const target = toCenters.get(id);\n if (!target) return;\n specs.push({\n id,\n target,\n fadeIn: fadeIn.has(id),\n fadeOut: fadeOut.has(id),\n move: true,\n morph,\n });\n });\n\n fadeOut.forEach((id) => {\n if (toCenters.has(id)) return;\n specs.push({ id, fadeIn: false, fadeOut: true, move: false });\n });\n\n const edgeFadeIn = options?.edgeFadeIn ?? new Set();\n const edgeFadeOut = options?.edgeFadeOut ?? new Set();\n const totalWork = specs.length + edgeFadeIn.size + edgeFadeOut.size;\n\n if (!totalWork) {\n options?.onComplete?.();\n return;\n }\n\n let completed = 0;\n const finishOne = () => {\n completed += 1;\n if (completed >= totalWork) {\n cy.nodes().forEach((node) => {\n const n = node as Cytoscape.NodeSingular;\n if (n.data(\"type\") === \"group-expanded\") {\n ensureGroupExpandedVisible(n);\n } else if (nodeUsesHtmlLabel(n)) {\n // Only leave fadeOut nodes invisible when they are gone from the\n // target layout. Boundary input tables must stay visible after collapse\n // even if they were wrongly included in fadeOut during expand.\n const leaves = fadeOut.has(node.id()) && !toLayout.has(node.id());\n setNodeVisualOpacity(cy, n, leaves ? 0 : 1);\n }\n });\n resetEdgeOpacities(cy);\n options?.onComplete?.();\n }\n };\n\n animateEdgeOpacityTransitions(cy, edgeFadeIn, edgeFadeOut, finishOne);\n\n if (!specs.length) {\n return;\n }\n\n specs.forEach(({ id, target, fadeIn: isFadeIn, fadeOut: isFadeOut, move, morph }) => {\n const node = cy.getElementById(id);\n if (node.empty()) {\n finishOne();\n return;\n }\n\n const nodeEl = node as Cytoscape.NodeSingular;\n const from = fromCenters.get(id);\n\n if (morph && target) {\n const fromCenter = bboxCenter(morph.from);\n const isNativeGroupFrame = nodeEl.data(\"type\") === \"group-expanded\";\n nodeEl.position(fromCenter);\n nodeEl.removeStyle(\"width\");\n nodeEl.removeStyle(\"height\");\n nodeEl.data(\"boxW\", morph.from.w);\n nodeEl.data(\"boxH\", morph.from.h);\n if (isNativeGroupFrame) {\n ensureGroupExpandedVisible(nodeEl);\n }\n } else if (from) {\n nodeEl.position(from);\n } else if (target) {\n nodeEl.position(target);\n }\n\n const fromOpacity = isFadeIn ? 0 : 1;\n const toOpacity = isFadeOut ? 0 : 1;\n const isMorphingNativeGroup = Boolean(morph && nodeEl.data(\"type\") === \"group-expanded\");\n if (!isMorphingNativeGroup) {\n setNodeVisualOpacity(cy, nodeEl, fromOpacity);\n }\n\n let positionDone = !move || !target;\n let opacityDone = !isFadeIn && !isFadeOut;\n\n const maybeFinish = () => {\n if (positionDone && opacityDone) {\n finishOne();\n }\n };\n\n if (morph && target) {\n const shrinking = morph.to.w * morph.to.h < morph.from.w * morph.from.h;\n const isNativeGroupFrame = nodeEl.data(\"type\") === \"group-expanded\";\n animateNodeBoxMorph(\n cy,\n nodeEl,\n morph.from,\n morph.to,\n bboxCenter(morph.from),\n target,\n {\n duration: ANIMATION_MS,\n // Shrinking native frame fades out while the HTML collapsed card fades in.\n ...(shrinking && isNativeGroupFrame\n ? { opacityFrom: 1, opacityTo: 0 }\n : {}),\n onComplete: () => {\n if (shrinking && isNativeGroupFrame) {\n nodeEl.style(\"opacity\", 0);\n } else if (isNativeGroupFrame) {\n ensureGroupExpandedVisible(nodeEl);\n }\n positionDone = true;\n maybeFinish();\n },\n },\n );\n } else if (move && target) {\n nodeEl.animate(\n { position: target },\n {\n duration: ANIMATION_MS,\n easing: ANIMATION_EASING,\n complete: () => {\n positionDone = true;\n maybeFinish();\n },\n },\n );\n }\n\n if (isFadeIn || isFadeOut) {\n const timing = resolveOpacityTiming(\n id,\n isFadeIn ? options?.fadeInTiming : options?.fadeOutTiming,\n );\n animateNodeVisualOpacity(\n cy,\n id,\n fromOpacity,\n toOpacity,\n timing.duration ?? ANIMATION_MS,\n () => {\n opacityDone = true;\n maybeFinish();\n },\n timing.delay ?? 0,\n );\n } else if (move && !isMorphingNativeGroup) {\n setNodeVisualOpacity(cy, nodeEl, 1);\n }\n });\n}\n\nexport function fitGraphViewport(cy: Cytoscape.Core): void {\n cy.fit(cy.elements(), 60);\n const fitZoom = cy.zoom();\n cy.minZoom(Math.min(0.05, fitZoom * 0.3));\n cy.maxZoom(Math.max(2.5, fitZoom * 6));\n\n const READABLE_ZOOM = 0.4;\n if (fitZoom < READABLE_ZOOM) {\n const bb = cy.elements().boundingBox();\n cy.zoom(READABLE_ZOOM);\n cy.pan({\n x: cy.width() / 2 - READABLE_ZOOM * (bb.x1 + bb.w / 2),\n y: 90 - READABLE_ZOOM * bb.y1,\n });\n }\n}\n\nconst READABLE_ZOOM = 0.4;\nconst FIT_PADDING = 60;\n\n/** Bounding box (model coords) of all visible entries in a layout. */\nexport function layoutContentBBox(layout: GraphLayout): BBox | null {\n let x1 = Infinity;\n let y1 = Infinity;\n let x2 = -Infinity;\n let y2 = -Infinity;\n layout.forEach((entry) => {\n if (!entry.visible) return;\n x1 = Math.min(x1, entry.bbox.x);\n y1 = Math.min(y1, entry.bbox.y);\n x2 = Math.max(x2, entry.bbox.x + entry.bbox.w);\n y2 = Math.max(y2, entry.bbox.y + entry.bbox.h);\n });\n if (!Number.isFinite(x1)) return null;\n return { x: x1, y: y1, w: x2 - x1, h: y2 - y1 };\n}\n\nexport type Viewport = { zoom: number; pan: { x: number; y: number }; minZoom: number; maxZoom: number };\n\n/**\n * Target pan/zoom to fit `bb` (model coords) into the viewport, mirroring the\n * clamping and readable-zoom rules of `fitGraphViewport` but *without* mutating\n * the camera — so callers can animate toward it instead of snapping.\n */\nexport function fitViewportForBBox(cy: Cytoscape.Core, bb: BBox): Viewport | null {\n const W = cy.width();\n const H = cy.height();\n if (!bb.w || !bb.h || !W || !H) return null;\n\n const rawZoom = Math.min((W - 2 * FIT_PADDING) / bb.w, (H - 2 * FIT_PADDING) / bb.h);\n const minZoom = Math.min(0.05, rawZoom * 0.3);\n const maxZoom = Math.max(2.5, rawZoom * 6);\n let zoom = Math.max(minZoom, Math.min(maxZoom, rawZoom));\n\n let pan: { x: number; y: number };\n if (zoom < READABLE_ZOOM) {\n zoom = READABLE_ZOOM;\n pan = {\n x: W / 2 - READABLE_ZOOM * (bb.x + bb.w / 2),\n y: 90 - READABLE_ZOOM * bb.y,\n };\n } else {\n pan = {\n x: W / 2 - zoom * (bb.x + bb.w / 2),\n y: H / 2 - zoom * (bb.y + bb.h / 2),\n };\n }\n return { zoom, pan, minZoom, maxZoom };\n}\n\n/**\n * Smoothly pan/zoom the viewport to fit `layout`, running concurrently with a\n * node layout transition so the camera glides to the new frame instead of\n * snapping before the graph animates.\n */\nexport function animateFitViewport(\n cy: Cytoscape.Core,\n layout: GraphLayout,\n duration: number = ANIMATION_MS,\n): void {\n const bb = layoutContentBBox(layout);\n if (!bb) return;\n const target = fitViewportForBBox(cy, bb);\n if (!target) return;\n\n // Widen bounds first so the target zoom is always reachable by the tween.\n cy.minZoom(target.minZoom);\n cy.maxZoom(target.maxZoom);\n cy.animate(\n { zoom: target.zoom, pan: target.pan },\n { duration, easing: ANIMATION_EASING },\n );\n}\n\nexport { ANIMATION_MS, ANIMATION_EASING } from \"./animationConstants\";\nexport { GROUP_PADDING };\n","import Cytoscape from \"cytoscape\";\nimport { GraphData, MetaNode } from \"../../types\";\nimport {\n COLLAPSE_GROUP_FADE_DELAY,\n COLLAPSE_GROUP_FADE_MS,\n COLLAPSE_INNER_FADE_MS,\n} from \"./animationConstants\";\nimport {\n ANIMATION_MS,\n animateFitViewport,\n animateLayoutTransition,\n applyLayoutToCy,\n BBox,\n buildCollapsedLayout,\n cloneLayout,\n collapseGroupInLayout,\n expandGroupInLayout,\n fitGraphViewport,\n getInnerNodeIdsFromLayout,\n GraphLayout,\n stopLayoutAnimations,\n} from \"./incrementalLayout\";\nimport { setNodeVisualOpacity, ensureGroupExpandedVisible } from \"./htmlLabelOpacity\";\nimport {\n addEdgesFromTarget,\n computeEdgeDiff,\n makeEdgeKey,\n} from \"./edgeTransition\";\nimport { reprocessData } from \"./process\";\n\nexport type CyElement = Cytoscape.ElementDefinition;\n\nexport type SyncMode = \"fit\" | \"preserve\";\n\nexport type SyncOptions = {\n mode: SyncMode;\n rankDir?: \"TB\" | \"LR\";\n anchorGroup?: string | null;\n expanding?: boolean;\n onLayoutComplete?: () => void;\n};\n\nconst layoutStore = new WeakMap();\nconst layoutTimerStore = new WeakMap();\nconst preExpandStore = new WeakMap>();\nconst structureKeyStore = new WeakMap();\n\nfunction buildElements(data: GraphData, expanded: Set): CyElement[] {\n const { nodes, edges } = reprocessData(data, expanded);\n const elements: CyElement[] = Array.from(nodes.entries())\n .sort(([, a], [, b]) => {\n const aParent = a.type === \"group-expanded\" ? 0 : 1;\n const bParent = b.type === \"group-expanded\" ? 0 : 1;\n return aParent - bParent;\n })\n .map(([nodeId, options]) => ({\n // Selection is driven only by our DOM/gesture handlers. Keeping\n // nodes unselectable stops Cytoscape's native tap from racing\n // unselect↔select with those handlers (which flashes focus styles).\n selectable: false,\n grabbable: options.type !== \"group\" && options.type !== \"group-expanded\",\n data: {\n id: nodeId,\n label: options.name || nodeId,\n ...options,\n },\n }));\n edges.forEach((edge) => {\n elements.push({\n grabbable: false,\n data: edge,\n });\n });\n return elements;\n}\n\nfunction edgeKey(source: string, target: string): string {\n return makeEdgeKey(source, target);\n}\n\nfunction applyNodeDiff(cy: Cytoscape.Core, target: CyElement[], removeAbsent = true) {\n const targetNodes = target.filter((el) => el.data.id);\n const targetNodeIds = new Set(targetNodes.map((el) => el.data.id as string));\n\n cy.batch(() => {\n if (removeAbsent) {\n cy.nodes().forEach((node) => {\n if (!targetNodeIds.has(node.id())) {\n node.remove();\n }\n });\n }\n\n targetNodes.forEach((el) => {\n const id = el.data.id as string;\n const existing = cy.getElementById(id);\n if (existing.nonempty()) {\n const node = existing as unknown as Cytoscape.NodeSingular;\n const nextParent = (el.data.parent as string) ?? null;\n const currentParent = node.isChild() ? node.parent().first().id() : null;\n node.data(el.data);\n // Cytoscape data() merges; fields absent from the next payload (e.g. metaGroup\n // after collapse) would otherwise stick and break expand/collapse membership.\n if (!(\"metaGroup\" in el.data) && node.data(\"metaGroup\") != null) {\n node.removeData(\"metaGroup\");\n }\n if (!(\"frameLabel\" in el.data) && node.data(\"frameLabel\") != null) {\n node.removeData(\"frameLabel\");\n }\n // Always keep nodes unselectable so only app gestures select.\n if (node.selectable()) node.unselectify();\n if (nextParent !== currentParent) {\n node.move({ parent: nextParent });\n }\n } else {\n cy.add(el);\n }\n });\n });\n}\n\nfunction applyEdgeDiff(cy: Cytoscape.Core, target: CyElement[]) {\n const targetEdges = target.filter((el) => el.data.source && el.data.target);\n const targetEdgeKeys = new Set(\n targetEdges.map((el) => edgeKey(el.data.source as string, el.data.target as string)),\n );\n\n cy.batch(() => {\n cy.edges().forEach((edge) => {\n const key = edgeKey(edge.source().id(), edge.target().id());\n if (!targetEdgeKeys.has(key)) {\n edge.remove();\n }\n });\n\n targetEdges.forEach((el) => {\n const key = edgeKey(el.data.source as string, el.data.target as string);\n const found = cy.edges().filter(\n (edge) => edgeKey(edge.source().id(), edge.target().id()) === key,\n );\n if (found.empty()) {\n cy.add(el);\n }\n });\n });\n}\n\nfunction applyElementDiff(cy: Cytoscape.Core, target: CyElement[]) {\n applyNodeDiff(cy, target, true);\n applyEdgeDiff(cy, target);\n}\n\nfunction captureCenters(cy: Cytoscape.Core): Map {\n const centers = new Map();\n cy.nodes().forEach((node) => {\n centers.set(node.id(), { ...node.position() });\n });\n return centers;\n}\n\nfunction getMetaPipelineOrder(data: GraphData, groupId: string): string[] {\n const meta = data.pipeline.find(\n (pipe): pipe is MetaNode => pipe.type === \"meta\" && pipe.name === groupId,\n );\n if (!meta) return [];\n return meta.graph.pipeline.filter((step) => step.type !== \"meta\").map((step) => step.name);\n}\n\nfunction pipelineOrdersFor(data: GraphData, expanded: Set): Map {\n const orders = new Map();\n expanded.forEach((groupId) => {\n orders.set(groupId, getMetaPipelineOrder(data, groupId));\n });\n return orders;\n}\n\nfunction getInnerNodeIds(\n nodes: Map,\n groupId: string,\n): Set {\n const ids = new Set();\n nodes.forEach((data, id) => {\n if (data.metaGroup === groupId) ids.add(id);\n });\n return ids;\n}\n\nfunction savePreExpandLayout(cy: Cytoscape.Core, groupId: string, layout: GraphLayout): void {\n let groups = preExpandStore.get(cy);\n if (!groups) {\n groups = new Map();\n preExpandStore.set(cy, groups);\n }\n groups.set(groupId, cloneLayout(layout));\n}\n\nfunction takePreExpandLayout(cy: Cytoscape.Core, groupId: string): GraphLayout | undefined {\n const groups = preExpandStore.get(cy);\n const layout = groups?.get(groupId);\n groups?.delete(groupId);\n return layout;\n}\n\nfunction expandedGroupsInLayout(layout: GraphLayout): Set {\n const ids = new Set();\n layout.forEach((entry, id) => {\n if (entry.node.type === \"group-expanded\" && entry.visible) {\n ids.add(id);\n }\n });\n return ids;\n}\n\nfunction sameIdSet(a: Set, b: Set): boolean {\n if (a.size !== b.size) return false;\n for (const id of Array.from(a)) {\n if (!b.has(id)) return false;\n }\n return true;\n}\n\nfunction graphStructureKey(\n nodes: Map,\n edges: Iterable,\n expanded: Set,\n): string {\n const nodeIds = Array.from(nodes.keys()).sort();\n const edgeList = Array.from(edges)\n .map((edge) => `${edge.source as string}->${edge.target as string}`)\n .sort();\n const expandedIds = Array.from(expanded).sort();\n return JSON.stringify({ nodeIds, edgeList, expandedIds });\n}\n\nfunction clearLayoutTimer(cy: Cytoscape.Core): void {\n const prev = layoutTimerStore.get(cy);\n if (prev != null) {\n window.clearTimeout(prev);\n layoutTimerStore.delete(cy);\n }\n}\n\nfunction scheduleLayoutComplete(cy: Cytoscape.Core, options: SyncOptions): void {\n if (!options.onLayoutComplete) return;\n clearLayoutTimer(cy);\n const timer = window.setTimeout(() => {\n layoutTimerStore.delete(cy);\n if (!cy.destroyed()) {\n options.onLayoutComplete?.();\n }\n }, ANIMATION_MS + 40);\n layoutTimerStore.set(cy, timer);\n}\n\n/**\n * Sync graph elements and apply deterministic incremental layout.\n * Initial view uses layered DAG; expand/collapse only shifts the affected region.\n */\nexport function syncCyGraph(\n cy: Cytoscape.Core,\n data: GraphData,\n expanded: Set,\n options: SyncOptions,\n) {\n const rankDir = options.rankDir ?? \"TB\";\n const target = buildElements(data, expanded);\n const { nodes, edges } = reprocessData(data, expanded);\n const anchorGroup = options.anchorGroup ?? null;\n const previousLayout = layoutStore.get(cy);\n const fromCenters = captureCenters(cy);\n const currentStructureKey = graphStructureKey(nodes, edges, expanded);\n const previousStructureKey = structureKeyStore.get(cy);\n\n const pipelineOrders = pipelineOrdersFor(data, expanded);\n\n const isInitial = cy.nodes().empty() || !previousLayout;\n\n if (isInitial) {\n // First render (nothing on screen to animate from): place + fit instantly.\n stopLayoutAnimations(cy);\n clearLayoutTimer(cy);\n applyElementDiff(cy, target);\n const nextLayout = buildCollapsedLayout(nodes, edges, expanded, rankDir, pipelineOrders);\n applyLayoutToCy(cy, nextLayout);\n layoutStore.set(cy, nextLayout);\n structureKeyStore.set(cy, currentStructureKey);\n // Sync cached viewport dimensions before fitting: on first paint the flex\n // container may not have reached its final width yet, and a stale\n // cy.width() makes the centering pan land off to one side.\n cy.resize();\n fitGraphViewport(cy);\n options.onLayoutComplete?.();\n return;\n }\n\n if (options.mode === \"fit\") {\n // Stage/graph switch with an existing graph on screen: animate node\n // positions to the new layout while the camera pans/zooms to the new fit\n // *in parallel*. Previously we snapped the camera (fitGraphViewport) and\n // only then animated the graph, which read as a jarring two-step jump.\n stopLayoutAnimations(cy);\n clearLayoutTimer(cy);\n applyElementDiff(cy, target);\n const nextLayout = buildCollapsedLayout(nodes, edges, expanded, rankDir, pipelineOrders);\n layoutStore.set(cy, nextLayout);\n structureKeyStore.set(cy, currentStructureKey);\n\n // Nodes that only exist in the new graph fade in at their target spot.\n const fadeIn = new Set();\n nextLayout.forEach((entry, id) => {\n if (entry.visible && !fromCenters.has(id)) fadeIn.add(id);\n });\n\n animateLayoutTransition(cy, fromCenters, nextLayout, {\n fadeIn,\n onComplete: () => scheduleLayoutComplete(cy, options),\n });\n // Keep cached dimensions fresh so the fit target is centered on the real\n // (possibly just-resized) container width, not a stale one.\n cy.resize();\n // Start the viewport tween *after* animateLayoutTransition (its internal\n // cy.stop would otherwise cancel a camera animation started earlier).\n animateFitViewport(cy, nextLayout, ANIMATION_MS);\n return;\n }\n\n // Periodic refresh: update node data only, keep layout positions intact.\n if (\n !anchorGroup &&\n previousStructureKey === currentStructureKey &&\n options.mode === \"preserve\"\n ) {\n stopLayoutAnimations(cy);\n applyElementDiff(cy, target);\n options.onLayoutComplete?.();\n return;\n }\n\n if (anchorGroup && previousLayout.has(anchorGroup)) {\n stopLayoutAnimations(cy);\n clearLayoutTimer(cy);\n\n const workingLayout = cloneLayout(previousLayout);\n\n if (options.expanding) {\n savePreExpandLayout(cy, anchorGroup, workingLayout);\n const edgeDiff = computeEdgeDiff(cy, target);\n applyNodeDiff(cy, target, false);\n const expandedGroup = cy.getElementById(anchorGroup);\n if (!expandedGroup.empty()) {\n ensureGroupExpandedVisible(expandedGroup as Cytoscape.NodeSingular);\n }\n addEdgesFromTarget(cy, target, new Set(edgeDiff.toAdd), 0);\n const nextLayout = expandGroupInLayout(\n workingLayout,\n anchorGroup,\n nodes,\n edges,\n rankDir,\n pipelineOrders.get(anchorGroup) ?? [],\n );\n const innerIds = getInnerNodeIds(nodes, anchorGroup);\n layoutStore.set(cy, nextLayout);\n structureKeyStore.set(cy, currentStructureKey);\n const morphBoxes = new Map();\n const fromEntry = workingLayout.get(anchorGroup);\n const toEntry = nextLayout.get(anchorGroup);\n if (fromEntry && toEntry) {\n morphBoxes.set(anchorGroup, { from: fromEntry.bbox, to: toEntry.bbox });\n }\n animateLayoutTransition(cy, fromCenters, nextLayout, {\n fadeIn: innerIds,\n morphBoxes,\n edgeFadeIn: new Set(edgeDiff.toAdd),\n edgeFadeOut: new Set(edgeDiff.toRemove),\n onComplete: () => scheduleLayoutComplete(cy, options),\n });\n return;\n }\n\n const innerIds = getInnerNodeIdsFromLayout(previousLayout, anchorGroup);\n getInnerNodeIds(nodes, anchorGroup).forEach((id) => {\n if (previousLayout.get(id)?.node.metaGroup === anchorGroup) {\n innerIds.add(id);\n }\n });\n const restored = takePreExpandLayout(cy, anchorGroup);\n // Only restore a pre-expand snapshot when it already matches the remaining\n // expanded set. Expanding B after A makes A's snapshot stale (B missing).\n const restoredUsable =\n restored && sameIdSet(expandedGroupsInLayout(restored), expanded)\n ? restored\n : null;\n const collapsedLayout = restoredUsable\n ?? collapseGroupInLayout(\n workingLayout,\n anchorGroup,\n nodes,\n edges,\n rankDir,\n innerIds,\n );\n\n layoutStore.set(cy, collapsedLayout);\n structureKeyStore.set(cy, currentStructureKey);\n const edgeDiff = computeEdgeDiff(cy, target);\n addEdgesFromTarget(cy, target, new Set(edgeDiff.toAdd), 0);\n\n // Switch to collapsed HTML group immediately (opacity 0) so it can crossfade\n // with inner sub-steps instead of appearing after the blue frame disappears.\n applyNodeDiff(cy, target, false);\n const groupEle = cy.getElementById(anchorGroup);\n if (!groupEle.empty()) {\n const groupNode = groupEle as Cytoscape.NodeSingular;\n // Clear native-frame size bypasses left by expand morph before HTML morph.\n groupNode.removeStyle(\"width\");\n groupNode.removeStyle(\"height\");\n setNodeVisualOpacity(cy, groupNode, 0);\n groupNode.data(\n \"labelRefresh\",\n ((groupNode.data(\"labelRefresh\") as number) ?? 0) + 1,\n );\n }\n\n const morphBoxes = new Map();\n const fromEntry = previousLayout.get(anchorGroup);\n const toEntry = collapsedLayout.get(anchorGroup);\n if (fromEntry && toEntry) {\n morphBoxes.set(anchorGroup, { from: fromEntry.bbox, to: toEntry.bbox });\n }\n\n animateLayoutTransition(cy, fromCenters, collapsedLayout, {\n fadeOut: innerIds,\n fadeIn: new Set([anchorGroup]),\n fadeOutTiming: { duration: COLLAPSE_INNER_FADE_MS },\n fadeInTiming: { delay: COLLAPSE_GROUP_FADE_DELAY, duration: COLLAPSE_GROUP_FADE_MS },\n morphBoxes,\n edgeFadeIn: new Set(edgeDiff.toAdd),\n edgeFadeOut: new Set(edgeDiff.toRemove),\n onComplete: () => {\n applyElementDiff(cy, target);\n scheduleLayoutComplete(cy, options);\n },\n });\n return;\n }\n\n stopLayoutAnimations(cy);\n clearLayoutTimer(cy);\n applyElementDiff(cy, target);\n const nextLayout = buildCollapsedLayout(nodes, edges, expanded, rankDir, pipelineOrders);\n layoutStore.set(cy, nextLayout);\n structureKeyStore.set(cy, currentStructureKey);\n animateLayoutTransition(cy, fromCenters, nextLayout, {\n onComplete: () => scheduleLayoutComplete(cy, options),\n });\n}\n\nexport { buildElements };\n","import Cytoscape from \"cytoscape\";\nimport { edgeColors } from \"./graphColors\";\n\nconst overlayInitStore = new WeakMap();\nconst overlayLayerStore = new WeakMap();\n/** Path elements are kept and mutated in place, keyed by edge id — never wiped\n * and recreated on sync. Recreating them made the marker briefly fall back to\n * the browser default arrow (before `marker-end` re-attached), flashing orange. */\nconst overlayPathStore = new WeakMap>();\n\n/** Match cytoscape `arrow-scale: 1.08` triangle; userSpaceOnUse so stroke width doesn't inflate it. */\nconst ARROW_MARKER = {\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n /** Screen-pixel size; divided by zoom because the layer is CSS-scaled. */\n markerWidth: 7,\n markerHeight: 7,\n path: \"M 0 0 L 10 5 L 0 10 z\",\n} as const;\n\nconst ARROW_MARKERS: Array<{ id: string; fill: string }> = [\n { id: \"cy-internal-edge-arrow\", fill: edgeColors.default },\n { id: \"cy-internal-edge-arrow-related\", fill: edgeColors.related },\n { id: \"cy-internal-edge-arrow-focused\", fill: edgeColors.active },\n { id: \"cy-internal-edge-arrow-failed\", fill: edgeColors.error },\n];\n\nfunction setAttrIfChanged(element: Element, name: string, value: string): void {\n if (element.getAttribute(name) !== value) element.setAttribute(name, value);\n}\n\nfunction pathStoreFor(cy: Cytoscape.Core): Map {\n let store = overlayPathStore.get(cy);\n if (!store) {\n store = new Map();\n overlayPathStore.set(cy, store);\n }\n return store;\n}\n\nfunction taxiPathFromPoints(points: number[]): string {\n if (points.length < 4) return \"\";\n const segments: string[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) {\n const cmd = i === 0 ? \"M\" : \"L\";\n segments.push(`${cmd} ${points[i]} ${points[i + 1]}`);\n }\n return segments.join(\" \");\n}\n\n/** Path in *model* coordinates — camera pan/zoom is applied via CSS on the layer. */\nfunction edgePathD(edge: Cytoscape.EdgeSingular): string {\n const scratch = (edge as unknown as { _private?: { rscratch?: { allpts?: number[] } } })._private\n ?.rscratch;\n const allpts = scratch?.allpts;\n if (allpts && allpts.length >= 4) {\n const path = taxiPathFromPoints(allpts);\n if (path) return path;\n }\n\n const source = edge.source().position();\n const target = edge.target().position();\n const midY = (source.y + target.y) / 2;\n return `M ${source.x} ${source.y} L ${source.x} ${midY} L ${target.x} ${midY} L ${target.x} ${target.y}`;\n}\n\nfunction isSequentialEdge(edge: Cytoscape.EdgeSingular): boolean {\n return Boolean(edge.data(\"sequential\"));\n}\n\nfunction edgeStroke(edge: Cytoscape.EdgeSingular): string {\n if (edge.hasClass(\"failed\")) return edgeColors.error;\n if (edge.hasClass(\"related\")) return edgeColors.related;\n if (edge.hasClass(\"focused\")) return edgeColors.active;\n return edgeColors.default;\n}\n\nfunction edgeArrowMarker(edge: Cytoscape.EdgeSingular): string {\n if (edge.hasClass(\"failed\")) return \"url(#cy-internal-edge-arrow-failed)\";\n if (edge.hasClass(\"related\")) return \"url(#cy-internal-edge-arrow-related)\";\n if (edge.hasClass(\"focused\")) return \"url(#cy-internal-edge-arrow-focused)\";\n return \"url(#cy-internal-edge-arrow)\";\n}\n\nfunction edgeOpacity(edge: Cytoscape.EdgeSingular): number {\n if (edge.hasClass(\"muted\")) return 0.12;\n if (edge.hasClass(\"focused\") || edge.hasClass(\"failed\")) return 1;\n if (edge.hasClass(\"related\")) return 0.9;\n return 0.78;\n}\n\nfunction edgeWidth(edge: Cytoscape.EdgeSingular): number {\n if (edge.hasClass(\"focused\") || edge.hasClass(\"failed\")) return 3.2;\n if (edge.hasClass(\"related\")) return 2.6;\n return 2.15;\n}\n\n/** Model-space dash; scales with the CSS layer like cytoscape dashed edges. */\nfunction edgeDashArray(edge: Cytoscape.EdgeSingular): string | null {\n return isSequentialEdge(edge) ? \"10 7\" : null;\n}\n\nfunction updateOverlayCamera(cy: Cytoscape.Core, layer: HTMLDivElement, defs: SVGDefsElement): void {\n const pan = cy.pan();\n const zoom = Math.max(cy.zoom(), 1e-6);\n layer.style.transform = `translate(${pan.x}px,${pan.y}px) scale(${zoom})`;\n layer.style.transformOrigin = \"top left\";\n\n // Marker sizes are in layer (model) units; divide by zoom so they stay ~constant\n // on screen after the CSS scale.\n const mw = String(ARROW_MARKER.markerWidth / zoom);\n const mh = String(ARROW_MARKER.markerHeight / zoom);\n ARROW_MARKERS.forEach(({ id }) => {\n const marker = defs.querySelector(`#${id}`);\n if (!marker) return;\n setAttrIfChanged(marker, \"markerWidth\", mw);\n setAttrIfChanged(marker, \"markerHeight\", mh);\n });\n}\n\nfunction ensureOverlayRoot(cy: Cytoscape.Core): {\n layer: HTMLDivElement;\n svg: SVGSVGElement;\n defs: SVGDefsElement;\n} | null {\n const container = cy.container();\n if (!container) return null;\n\n const host = container.firstElementChild as HTMLElement | null;\n if (!host) return null;\n\n let layer = overlayLayerStore.get(cy) ?? null;\n if (!layer || !host.contains(layer)) {\n layer = host.querySelector(\".cy-internal-edges-layer\") as HTMLDivElement | null;\n if (!layer) {\n layer = document.createElement(\"div\");\n layer.className = \"cy-internal-edges-layer\";\n host.appendChild(layer);\n }\n overlayLayerStore.set(cy, layer);\n }\n\n let svg = layer.querySelector(\"svg.cy-internal-edges-svg\") as SVGSVGElement | null;\n if (!svg) {\n svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add(\"cy-internal-edges-svg\");\n layer.appendChild(svg);\n }\n\n let defs = svg.querySelector(\"defs\") as SVGDefsElement | null;\n if (!defs) {\n defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n svg.insertBefore(defs, svg.firstChild);\n }\n\n ARROW_MARKERS.forEach(({ id, fill }) => {\n let marker = defs!.querySelector(`#${id}`) as SVGMarkerElement | null;\n if (!marker) {\n marker = document.createElementNS(\"http://www.w3.org/2000/svg\", \"marker\");\n marker.setAttribute(\"id\", id);\n defs!.appendChild(marker);\n const arrowPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n marker.appendChild(arrowPath);\n }\n setAttrIfChanged(marker, \"viewBox\", ARROW_MARKER.viewBox);\n setAttrIfChanged(marker, \"refX\", ARROW_MARKER.refX);\n setAttrIfChanged(marker, \"refY\", ARROW_MARKER.refY);\n setAttrIfChanged(marker, \"markerUnits\", \"userSpaceOnUse\");\n setAttrIfChanged(marker, \"orient\", \"auto-start-reverse\");\n const arrowPath = marker.querySelector(\"path\");\n if (arrowPath) {\n setAttrIfChanged(arrowPath, \"d\", ARROW_MARKER.path);\n setAttrIfChanged(arrowPath, \"fill\", fill);\n }\n });\n\n return { layer, svg, defs };\n}\n\nfunction syncInternalEdgeOverlay(cy: Cytoscape.Core): void {\n if (cy.destroyed()) return;\n const root = ensureOverlayRoot(cy);\n if (!root) return;\n\n const { layer, svg, defs } = root;\n updateOverlayCamera(cy, layer, defs);\n\n const paths = pathStoreFor(cy);\n const seen = new Set();\n\n cy.edges(\"[internalMeta]\").forEach((edgeEle) => {\n const edge = edgeEle as Cytoscape.EdgeSingular;\n const id = edge.id();\n seen.add(id);\n\n let path = paths.get(id);\n if (!path) {\n path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke-linecap\", \"round\");\n path.setAttribute(\"stroke-linejoin\", \"round\");\n // Keep stroke thickness ~constant on screen while layer CSS-scales.\n path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n paths.set(id, path);\n svg.appendChild(path);\n }\n\n setAttrIfChanged(path, \"d\", edgePathD(edge));\n setAttrIfChanged(path, \"stroke\", edgeStroke(edge));\n setAttrIfChanged(path, \"stroke-width\", String(edgeWidth(edge)));\n setAttrIfChanged(path, \"opacity\", String(edgeOpacity(edge)));\n setAttrIfChanged(path, \"marker-end\", edgeArrowMarker(edge));\n const dash = edgeDashArray(edge);\n if (dash) {\n setAttrIfChanged(path, \"stroke-dasharray\", dash);\n } else if (path.hasAttribute(\"stroke-dasharray\")) {\n path.removeAttribute(\"stroke-dasharray\");\n }\n });\n\n paths.forEach((path, id) => {\n if (seen.has(id)) return;\n path.remove();\n paths.delete(id);\n });\n}\n\n/** Camera-only update — avoids rebuilding path `d` on every pan frame. */\nfunction syncOverlayCameraOnly(cy: Cytoscape.Core): void {\n if (cy.destroyed()) return;\n const root = ensureOverlayRoot(cy);\n if (!root) return;\n updateOverlayCamera(cy, root.layer, root.defs);\n}\n\nexport function initInternalEdgeOverlay(cy: Cytoscape.Core): void {\n if (overlayInitStore.has(cy)) return;\n overlayInitStore.set(cy, true);\n\n let pathFrame = 0;\n let cameraFrame = 0;\n\n const updatePaths = () => {\n cancelAnimationFrame(pathFrame);\n pathFrame = requestAnimationFrame(() => {\n if (cy.destroyed()) return;\n syncInternalEdgeOverlay(cy);\n });\n };\n\n const updateCamera = () => {\n cancelAnimationFrame(cameraFrame);\n cameraFrame = requestAnimationFrame(() => {\n if (cy.destroyed()) return;\n syncOverlayCameraOnly(cy);\n });\n };\n\n // Pan/zoom: move the layer like HTML labels (no path rebuild).\n cy.on(\"pan zoom\", updateCamera);\n // Geometry / membership refresh.\n cy.on(\"position add remove\", updatePaths);\n // First paint so taxi `allpts` exist; layout complete also calls refresh.\n cy.one(\"render\", updatePaths);\n cy.on(\"resize\", updateCamera);\n updatePaths();\n}\n\nexport function refreshInternalEdgeOverlay(cy: Cytoscape.Core): void {\n if (cy.destroyed() || !overlayInitStore.has(cy)) return;\n syncInternalEdgeOverlay(cy);\n}\n","import Cytoscape from \"cytoscape\";\nimport { getNodeHtmlLabelEl, nodeUsesHtmlLabel } from \"./htmlLabelOpacity\";\nimport { refreshInternalEdgeOverlay } from \"./internalEdgeOverlay\";\n\nexport type FocusPaint = {\n selectedIds: Set;\n highlightedIds: Set;\n edgeRelatedIds: Set;\n};\n\nconst selectedIdsByCy = new WeakMap>();\nconst focusPaintStore = new WeakMap();\nconst labelObserverStore = new WeakMap();\n\nfunction selectionStore(cy: Cytoscape.Core): Set {\n let set = selectedIdsByCy.get(cy);\n if (!set) {\n set = new Set();\n selectedIdsByCy.set(cy, set);\n }\n return set;\n}\n\nfunction setsEqual(a: Set, b: Set): boolean {\n return a.size === b.size && Array.from(a).every((id) => b.has(id));\n}\n\nfunction setHtmlFocusClasses(\n labelEl: HTMLElement,\n selected: boolean,\n related: boolean,\n dimmed: boolean,\n): void {\n labelEl.classList.toggle(\"is-focused\", selected);\n labelEl.classList.toggle(\"is-selected\", selected);\n labelEl.classList.toggle(\"is-related\", related);\n labelEl.classList.toggle(\"is-dimmed\", dimmed);\n}\n\nfunction paintHtmlLabels(cy: Cytoscape.Core, paint: FocusPaint | null): void {\n cy.nodes().forEach((node) => {\n if (!nodeUsesHtmlLabel(node as Cytoscape.NodeSingular)) return;\n const labelEl = getNodeHtmlLabelEl(cy, node.id());\n if (!labelEl) return;\n\n if (!paint) {\n setHtmlFocusClasses(labelEl, false, false, false);\n return;\n }\n\n const id = node.id();\n const selected = paint.selectedIds.has(id);\n const related = paint.highlightedIds.has(id) && !selected;\n const dimmed = !paint.highlightedIds.has(id);\n setHtmlFocusClasses(labelEl, selected, related, dimmed);\n });\n}\n\nfunction paintNativeNodesAndEdges(cy: Cytoscape.Core, paint: FocusPaint | null): void {\n cy.batch(() => {\n cy.edges().forEach((edge) => {\n const related = paint?.edgeRelatedIds.has(edge.id()) ?? false;\n const muted = paint != null && !related;\n edge.toggleClass(\"related\", related);\n edge.toggleClass(\"muted\", muted);\n edge.removeClass(\"focused\");\n });\n\n cy.nodes().forEach((node) => {\n if (nodeUsesHtmlLabel(node as Cytoscape.NodeSingular)) return;\n const id = node.id();\n const focused = paint?.selectedIds.has(id) ?? false;\n const related = paint != null && !focused && paint.highlightedIds.has(id);\n const dimmed = paint != null && !focused && !related;\n node.toggleClass(\"focused\", focused);\n node.toggleClass(\"related\", related);\n node.toggleClass(\"dimmed\", dimmed);\n });\n });\n}\n\nfunction computeFocusPaint(cy: Cytoscape.Core): FocusPaint | null {\n const selected = getSelectedNodes(cy);\n if (selected.empty()) return null;\n\n if (selected.length === 1) {\n const node = selected.first() as Cytoscape.NodeSingular;\n const connectedEdges = node.connectedEdges();\n const highlightedNodes = connectedEdges.connectedNodes().union(node);\n return {\n selectedIds: new Set([node.id()]),\n highlightedIds: new Set(highlightedNodes.map((n) => n.id())),\n edgeRelatedIds: new Set(connectedEdges.map((e) => e.id())),\n };\n }\n\n let highlightedEdges = cy.collection() as Cytoscape.EdgeCollection;\n let highlightedNodes = selected;\n selected.forEach((node) => {\n const connectedEdges = node.connectedEdges();\n highlightedEdges = highlightedEdges.union(connectedEdges) as Cytoscape.EdgeCollection;\n highlightedNodes = highlightedNodes.union(connectedEdges.connectedNodes());\n });\n\n return {\n selectedIds: new Set(selected.map((n) => n.id())),\n highlightedIds: new Set(highlightedNodes.map((n) => n.id())),\n edgeRelatedIds: new Set(highlightedEdges.map((e) => e.id())),\n };\n}\n\nfunction commitFocusPaint(cy: Cytoscape.Core, paint: FocusPaint | null): void {\n const prev = focusPaintStore.get(cy);\n if (\n paint &&\n prev &&\n setsEqual(prev.selectedIds, paint.selectedIds) &&\n setsEqual(prev.highlightedIds, paint.highlightedIds) &&\n setsEqual(prev.edgeRelatedIds, paint.edgeRelatedIds)\n ) {\n paintHtmlLabels(cy, paint);\n return;\n }\n\n focusPaintStore.set(cy, paint);\n paintNativeNodesAndEdges(cy, paint);\n paintHtmlLabels(cy, paint);\n refreshInternalEdgeOverlay(cy);\n}\n\n// --- Selection API ---\n\nexport function getSelectedNodeIds(cy: Cytoscape.Core): string[] {\n return Array.from(selectionStore(cy));\n}\n\nexport function isNodeSelected(cy: Cytoscape.Core, nodeId: string): boolean {\n return selectionStore(cy).has(nodeId);\n}\n\nexport function getSelectedNodes(cy: Cytoscape.Core): Cytoscape.NodeCollection {\n let collection = cy.collection() as Cytoscape.NodeCollection;\n selectionStore(cy).forEach((id) => {\n const node = cy.getElementById(id);\n if (!node.empty()) {\n collection = collection.union(node) as Cytoscape.NodeCollection;\n }\n });\n return collection;\n}\n\nexport function setSelectedNodeIds(cy: Cytoscape.Core, nodeIds: string[]): void {\n const next = new Set(\n nodeIds.filter((id) => {\n const node = cy.getElementById(id);\n return !node.empty();\n }),\n );\n selectedIdsByCy.set(cy, next);\n commitFocusPaint(cy, computeFocusPaint(cy));\n}\n\nexport function clearSelectedNodeIds(cy: Cytoscape.Core): void {\n selectedIdsByCy.set(cy, new Set());\n commitFocusPaint(cy, null);\n}\n\nexport function toggleSelectedNodeId(cy: Cytoscape.Core, nodeId: string): boolean {\n const set = selectionStore(cy);\n if (set.has(nodeId)) {\n set.delete(nodeId);\n commitFocusPaint(cy, computeFocusPaint(cy));\n return false;\n }\n set.add(nodeId);\n commitFocusPaint(cy, computeFocusPaint(cy));\n return true;\n}\n\n// --- Focus / visual sync ---\n\nexport function applyGraphVisualState(cy: Cytoscape.Core): void {\n commitFocusPaint(cy, computeFocusPaint(cy));\n}\n\nexport function clearGraphFocus(cy: Cytoscape.Core): void {\n commitFocusPaint(cy, null);\n}\n\nexport function syncHtmlLabelInteractionState(cy: Cytoscape.Core): void {\n paintHtmlLabels(cy, focusPaintStore.get(cy) ?? null);\n}\n\nexport function initHtmlLabelInteractionStateSync(cy: Cytoscape.Core): void {\n if (labelObserverStore.has(cy)) return;\n const container = cy.container();\n if (!container) return;\n\n const observer = new MutationObserver((mutations) => {\n if (!mutations.some((mutation) => mutation.addedNodes.length > 0)) return;\n paintHtmlLabels(cy, focusPaintStore.get(cy) ?? null);\n });\n observer.observe(container, { childList: true, subtree: true });\n labelObserverStore.set(cy, observer);\n cy.one(\"destroy\", () => {\n observer.disconnect();\n labelObserverStore.delete(cy);\n });\n}\n\nexport function applyFailedEdgeStyles(\n cy: Cytoscape.Core,\n runStatusByStep?: Map,\n): void {\n if (!runStatusByStep?.size) {\n cy.edges().removeClass(\"failed\");\n refreshInternalEdgeOverlay(cy);\n return;\n }\n\n cy.batch(() => {\n cy.edges().forEach((edge) => {\n const target = edge.target();\n const name = target.data(\"name\") as string | undefined;\n const status = name ? runStatusByStep.get(name) : undefined;\n const failed = status === \"failed\" || status === \"error\";\n edge.toggleClass(\"failed\", failed);\n });\n });\n refreshInternalEdgeOverlay(cy);\n}\n\n/** @deprecated Use applyGraphVisualState */\nexport function focusSelection(cy: Cytoscape.Core): void {\n applyGraphVisualState(cy);\n}\n\n/** @deprecated Use clearGraphFocus */\nexport function clearFocus(cy: Cytoscape.Core): void {\n clearGraphFocus(cy);\n}\n\n/** @deprecated Use applyGraphVisualState after setSelectedNodeIds */\nexport function focusNode(cy: Cytoscape.Core, node: Cytoscape.NodeSingular): void {\n setSelectedNodeIds(cy, [node.id()]);\n}\n","import Cytoscape from \"cytoscape\";\nimport type { KeyPopoverState } from \"./KeyListPopover\";\nimport { formatNodeLabels, getTransformPrimaryKeys } from \"./nodeKeyChips\";\nimport {\n applyGraphVisualState,\n clearGraphFocus,\n clearSelectedNodeIds,\n getSelectedNodeIds,\n isNodeSelected,\n setSelectedNodeIds,\n toggleSelectedNodeId,\n} from \"./graphVisualState\";\n\nconst BG_CLEAR_MOVE_PX = 5;\nconst NODE_PAN_MOVE_PX = 14;\nconst BG_CLEAR_MAX_MS = 280;\n\nconst MIN_ZOOM = 0.05;\nconst MAX_ZOOM = 6.0;\nconst WHEEL_ZOOM_SPEED = 3.3;\nconst FAST_WHEEL_ZOOM_SPEED = 6.9;\nconst WHEEL_DELTA_CLAMP = 36;\nconst WHEEL_ZOOM_COEFF = 0.0022;\n\nexport type GraphInteractionCallbacks = {\n onOpenInspector: (node: Cytoscape.NodeSingular) => void;\n onCloseInspector: () => void;\n onOpenKeyPopover: (state: KeyPopoverState) => void;\n onCloseKeyPopover: () => void;\n onToggleGroup: (groupName: string) => void;\n onUserInteracted: () => void;\n /** Last RMB target — used so menu actions don't rely on cytoscape-context-menus' scratch event. */\n onContextTarget?: (node: Cytoscape.NodeSingular) => void;\n};\n\nfunction canSelectNode(node: Cytoscape.NodeSingular): boolean {\n return (node.data(\"type\") as string) !== \"group-expanded\";\n}\n\nfunction modelPosFromClient(\n cy: Cytoscape.Core,\n container: HTMLElement,\n clientX: number,\n clientY: number,\n): { x: number; y: number; rendered: { x: number; y: number } } {\n const rect = container.getBoundingClientRect();\n const pan = cy.pan();\n const zoom = cy.zoom();\n const rendered = { x: clientX - rect.left, y: clientY - rect.top };\n return {\n x: (rendered.x - pan.x) / zoom,\n y: (rendered.y - pan.y) / zoom,\n rendered,\n };\n}\n\n/** Expanded blue frame containing a model-space point (events:no, so no native hits). */\nfunction findExpandedFrameAt(\n cy: Cytoscape.Core,\n x: number,\n y: number,\n): Cytoscape.NodeSingular | null {\n let frame: Cytoscape.NodeSingular | null = null;\n let bestArea = Infinity;\n cy.nodes('node[type = \"group-expanded\"]').forEach((ele) => {\n if (!ele.visible()) return;\n const node = ele as Cytoscape.NodeSingular;\n const bb = node.boundingBox({ includeLabels: false, includeOverlays: false });\n if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) return;\n // Prefer the tightest (nested) frame if several overlap.\n const area = bb.w * bb.h;\n if (area < bestArea) {\n bestArea = area;\n frame = node;\n }\n });\n return frame;\n}\n\n/** Content card under a point when the HTML label did not receive the event. */\nfunction findContentNodeAt(\n cy: Cytoscape.Core,\n x: number,\n y: number,\n): Cytoscape.NodeSingular | null {\n let hit: Cytoscape.NodeSingular | null = null;\n let bestArea = Infinity;\n cy.nodes().forEach((ele) => {\n if (!ele.visible()) return;\n const node = ele as Cytoscape.NodeSingular;\n const type = node.data(\"type\") as string;\n if (type === \"group-expanded\") return;\n const bb = node.boundingBox({ includeLabels: false, includeOverlays: false });\n if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) return;\n const area = bb.w * bb.h;\n if (area < bestArea) {\n bestArea = area;\n hit = node;\n }\n });\n return hit;\n}\n\n/**\n * Resolve the context-menu/dblclick target for a container pointer event.\n * HTML cards win; then a content node BB; empty expanded-frame chrome last.\n * Preferring the frame over content made RMB on a step/table inside an expanded\n * meta open the group menu (Open details no-op for group-expanded).\n */\nfunction resolvePointerTarget(\n cy: Cytoscape.Core,\n container: HTMLElement,\n event: MouseEvent,\n): Cytoscape.NodeSingular | null {\n const fromLabel = (() => {\n const label = (event.target as Element | null)?.closest?.(\"[data-cy-node-id]\");\n if (!label) return null;\n const nodeId = label.getAttribute(\"data-cy-node-id\");\n if (!nodeId) return null;\n const node = cy.getElementById(nodeId);\n if (node.empty()) return null;\n return node as Cytoscape.NodeSingular;\n })();\n if (fromLabel) return fromLabel;\n\n const pos = modelPosFromClient(cy, container, event.clientX, event.clientY);\n const content = findContentNodeAt(cy, pos.x, pos.y);\n if (content) return content;\n return findExpandedFrameAt(cy, pos.x, pos.y);\n}\n\nfunction isContextMenuTarget(target: EventTarget | null): boolean {\n return Boolean(\n (target as Element | null)?.closest?.(\n \".cy-context-menus-cxt-menu, .cy-context-menus-cxt-menuitem\",\n ),\n );\n}\n\n/**\n * Expanded frames use `events: no`, so native RMB ends as core `cxttap` on mouseup\n * when the cursor is over empty chrome (esp. the title padding band). That second\n * `cxttap` resets cytoscape-context-menus and hides the menu we opened via a\n * synthetic node emit. Mark the gesture as a cxt-drag so mouseup skips `cxttap`.\n */\nfunction suppressUpcomingNativeCxttap(cy: Cytoscape.Core): void {\n // cytoscape Core typings omit renderer(); it's the public accessor used elsewhere.\n const renderer = (\n cy as Cytoscape.Core & {\n renderer?: () => { hoverData?: { cxtDragged?: boolean } };\n }\n ).renderer?.();\n if (renderer?.hoverData) {\n renderer.hoverData.cxtDragged = true;\n }\n}\n\n/**\n * Attach all pointer / wheel / tap handlers for pipeline graph selection.\n * Returns a cleanup function.\n */\nexport function attachGraphInteractions(\n cy: Cytoscape.Core,\n callbacks: GraphInteractionCallbacks,\n): () => void {\n const container = cy.container();\n if (!container) return () => undefined;\n\n const chipScrollStore = new Map();\n const chipScrollKey = (nodeId: string, kind: string) => `${nodeId}::${kind}`;\n let ignoreChipScrollMemory = false;\n\n const findChipScroller = (nodeId: string, kind: string): HTMLElement | null =>\n container.querySelector(\n `.node-key-chips[data-cy-node-id=\"${CSS.escape(nodeId)}\"][data-key-kind=\"${kind}\"]`,\n );\n\n const rememberChipScroll = (el: HTMLElement) => {\n if (ignoreChipScrollMemory) return;\n const nodeId = el.getAttribute(\"data-cy-node-id\");\n const kind = el.getAttribute(\"data-key-kind\");\n if (nodeId && kind) chipScrollStore.set(chipScrollKey(nodeId, kind), el.scrollLeft);\n };\n\n const onChipScroll = (event: Event) => {\n const el = event.target as HTMLElement | null;\n if (el?.classList?.contains(\"node-key-chips\")) rememberChipScroll(el);\n };\n container.addEventListener(\"scroll\", onChipScroll, true);\n\n let restoreFrame = 0;\n const restoreChipScrolls = () => {\n cancelAnimationFrame(restoreFrame);\n restoreFrame = requestAnimationFrame(() => {\n ignoreChipScrollMemory = true;\n chipScrollStore.forEach((left, key) => {\n const [nodeId, kind] = key.split(\"::\");\n const el = findChipScroller(nodeId, kind);\n if (el && Math.abs(el.scrollLeft - left) > 0.5) el.scrollLeft = left;\n });\n requestAnimationFrame(() => {\n chipScrollStore.forEach((left, key) => {\n const [nodeId, kind] = key.split(\"::\");\n const el = findChipScroller(nodeId, kind);\n if (el && Math.abs(el.scrollLeft - left) > 0.5) el.scrollLeft = left;\n });\n ignoreChipScrollMemory = false;\n });\n });\n };\n cy.on(\"render\", restoreChipScrolls);\n\n const resolveOverflowChip = (target: EventTarget | null): HTMLElement | null =>\n (target as Element | null)?.closest?.(\"[data-key-overflow='true']\") as HTMLElement | null;\n\n const resolveNodeFromLabel = (target: EventTarget | null): Cytoscape.NodeSingular | null => {\n const label = (target as Element | null)?.closest?.(\"[data-cy-node-id]\");\n if (!label) return null;\n const nodeId = label.getAttribute(\"data-cy-node-id\");\n if (!nodeId) return null;\n const node = cy.getElementById(nodeId);\n if (node.empty()) return null;\n return node as Cytoscape.NodeSingular;\n };\n\n const openKeyPopoverFromChip = (overflow: HTMLElement) => {\n const nodeId = overflow.getAttribute(\"data-cy-node-id\");\n const kind = overflow.getAttribute(\"data-key-kind\") as \"pk\" | \"tpk\" | \"label\" | null;\n if (!nodeId || !kind) return;\n\n const node = cy.getElementById(nodeId);\n if (node.empty()) return;\n\n const data = node.data();\n const keys =\n kind === \"pk\"\n ? ((data.indexes as string[]) ?? [])\n : kind === \"label\"\n ? formatNodeLabels((data.labels as string[][]) ?? [])\n : getTransformPrimaryKeys(data);\n\n const containerRect = container.getBoundingClientRect();\n const chipRect = overflow.getBoundingClientRect();\n callbacks.onOpenKeyPopover({\n nodeId,\n kind,\n keys,\n anchor: {\n x: chipRect.left - containerRect.left,\n y: chipRect.bottom - containerRect.top + 8,\n },\n });\n };\n\n const handleNodeSelect = (node: Cytoscape.NodeSingular, multi: boolean) => {\n if (!canSelectNode(node)) return;\n if (multi) {\n if (isNodeSelected(cy, node.id())) {\n toggleSelectedNodeId(cy, node.id());\n callbacks.onCloseInspector();\n } else {\n toggleSelectedNodeId(cy, node.id());\n callbacks.onOpenInspector(node);\n }\n } else {\n const selected = getSelectedNodeIds(cy);\n const alreadySole = selected.length === 1 && selected[0] === node.id();\n if (!alreadySole) setSelectedNodeIds(cy, [node.id()]);\n else applyGraphVisualState(cy);\n callbacks.onOpenInspector(node);\n }\n };\n\n type BgPress = { x: number; y: number; moved: boolean; downAt: number };\n let bgPress: BgPress | null = null;\n let multiSelectSnapshot: string[] | null = null;\n let nodePress: { nodeId: string; x: number; y: number } | null = null;\n let nodePan: {\n nodeId: string;\n startX: number;\n startY: number;\n startPan: { x: number; y: number };\n moved: boolean;\n selectedAtStart: string[];\n } | null = null;\n let ignoreNextSelect = false;\n let selectionFreeze: string[] | null = null;\n let pressStartedOnOverflow = false;\n /**\n * One-shot per pointer gesture: mouseup/click/cy-tap can all try to select the\n * same press. A time window (TAP_DEDUPE_MS) was wrong — it also blocked the\n * *next* intentional select after a quick deselect. Reset on every mousedown.\n */\n let selectHandledThisGesture = false;\n let chipDrag: {\n kind: string;\n scrollNodeId: string;\n startX: number;\n startScrollLeft: number;\n moved: boolean;\n nodeId: string | null;\n } | null = null;\n\n /** One-shot: swallow the trailing click/tap after a drag-pan or scrollbar gesture. */\n const consumeSelectSuppress = (): boolean => {\n if (!ignoreNextSelect) return false;\n ignoreNextSelect = false;\n return true;\n };\n\n const armSelectSuppress = () => {\n ignoreNextSelect = true;\n nodePress = null;\n };\n\n const restoreFrozenSelection = () => {\n if (selectionFreeze == null) return;\n setSelectedNodeIds(cy, selectionFreeze);\n };\n\n const runSelectOnce = (node: Cytoscape.NodeSingular, multi: boolean) => {\n if (consumeSelectSuppress()) {\n restoreFrozenSelection();\n return;\n }\n if (selectHandledThisGesture) return;\n selectHandledThisGesture = true;\n handleNodeSelect(node, multi);\n };\n\n const onChipDragMove = (event: MouseEvent) => {\n if (!chipDrag) return;\n const dx = event.clientX - chipDrag.startX;\n if (Math.abs(dx) > NODE_PAN_MOVE_PX) chipDrag.moved = true;\n const el = findChipScroller(chipDrag.scrollNodeId, chipDrag.kind);\n if (el) {\n el.scrollLeft = chipDrag.startScrollLeft - dx;\n rememberChipScroll(el);\n }\n event.preventDefault();\n event.stopPropagation();\n };\n\n const onChipDragEnd = (event: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onChipDragMove, true);\n document.removeEventListener(\"mouseup\", onChipDragEnd, true);\n const drag = chipDrag;\n chipDrag = null;\n if (!drag) return;\n findChipScroller(drag.scrollNodeId, drag.kind)?.classList.remove(\"is-grabbing\");\n event.preventDefault();\n event.stopPropagation();\n if (!drag.moved && drag.nodeId && !ignoreNextSelect) {\n const node = cy.getElementById(drag.nodeId);\n if (!node.empty() && canSelectNode(node as Cytoscape.NodeSingular)) {\n runSelectOnce(node as Cytoscape.NodeSingular, event.ctrlKey || event.metaKey);\n }\n }\n };\n\n const onNodePanMove = (event: MouseEvent) => {\n if (!nodePan) return;\n const dx = event.clientX - nodePan.startX;\n const dy = event.clientY - nodePan.startY;\n if (!nodePan.moved) {\n if (dx * dx + dy * dy <= NODE_PAN_MOVE_PX * NODE_PAN_MOVE_PX) return;\n nodePan.moved = true;\n callbacks.onUserInteracted();\n }\n cy.pan({ x: nodePan.startPan.x + dx, y: nodePan.startPan.y + dy });\n event.preventDefault();\n };\n\n const onNodePanEnd = (event: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onNodePanMove, true);\n document.removeEventListener(\"mouseup\", onNodePanEnd, true);\n const pan = nodePan;\n nodePan = null;\n if (!pan) return;\n event.preventDefault();\n event.stopPropagation();\n if (pan.moved) {\n selectionFreeze = pan.selectedAtStart;\n armSelectSuppress();\n restoreFrozenSelection();\n return;\n }\n const node = cy.getElementById(pan.nodeId);\n if (!node.empty() && canSelectNode(node as Cytoscape.NodeSingular)) {\n runSelectOnce(node as Cytoscape.NodeSingular, event.ctrlKey || event.metaKey);\n }\n };\n\n const onDocumentMouseMove = (event: MouseEvent) => {\n if (!bgPress) return;\n const dx = event.clientX - bgPress.x;\n const dy = event.clientY - bgPress.y;\n if (dx * dx + dy * dy > BG_CLEAR_MOVE_PX * BG_CLEAR_MOVE_PX) bgPress.moved = true;\n };\n\n const endBackgroundPress = (event: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onDocumentMouseMove, true);\n document.removeEventListener(\"mouseup\", endBackgroundPress, true);\n\n if (event.button !== 0 || !bgPress) {\n bgPress = null;\n multiSelectSnapshot = null;\n return;\n }\n\n const press = bgPress;\n bgPress = null;\n const snapshot = multiSelectSnapshot;\n multiSelectSnapshot = null;\n\n const releasedOnNode = Boolean(resolveNodeFromLabel(event.target));\n const releasedOnCanvas = container.contains(event.target as Node);\n const duration = performance.now() - press.downAt;\n const isShortClick = !press.moved && duration <= BG_CLEAR_MAX_MS;\n const shouldClear =\n releasedOnCanvas &&\n !releasedOnNode &&\n isShortClick &&\n getSelectedNodeIds(cy).length > 0;\n\n if (shouldClear) {\n clearSelectedNodeIds(cy);\n clearGraphFocus(cy);\n callbacks.onCloseInspector();\n callbacks.onCloseKeyPopover();\n return;\n }\n\n if (snapshot && snapshot.length > 1) {\n setSelectedNodeIds(cy, snapshot);\n }\n };\n\n const onContainerMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) return;\n // Context-menu items live inside the cy container; do not treat their\n // LMB as background/node press (that clears currentCyEvent / selection).\n if (isContextMenuTarget(event.target)) return;\n pressStartedOnOverflow = false;\n nodePress = null;\n selectionFreeze = null;\n // New intentional press — drop any leftover one-shot suppress from a\n // previous gesture. The trailing click after a drag has no new mousedown\n // before it, so it still sees ignoreNextSelect=true.\n ignoreNextSelect = false;\n selectHandledThisGesture = false;\n\n const scroller = (event.target as Element | null)?.closest?.(\n \".node-key-chips\",\n ) as HTMLElement | null;\n if (scroller) {\n const canScroll = scroller.scrollWidth > scroller.clientWidth;\n const rect = scroller.getBoundingClientRect();\n const sbH = Math.max(scroller.offsetHeight - scroller.clientHeight, 10);\n const inScrollbarBand =\n canScroll &&\n event.clientY >= rect.bottom - sbH &&\n event.clientY <= rect.bottom + 2;\n\n // Only the real scrollbar thumb/track should freeze selection. Clicks on\n // chip gaps / scrollbar-gutter used to armSelectSuppress and keep the\n // *previous* node selected (orange stays selected when aiming at green).\n if (inScrollbarBand) {\n rememberChipScroll(scroller);\n selectionFreeze = getSelectedNodeIds(cy);\n armSelectSuppress();\n event.stopPropagation();\n return;\n }\n\n if (canScroll) {\n const scrollNodeId = scroller.getAttribute(\"data-cy-node-id\");\n const kind = scroller.getAttribute(\"data-key-kind\");\n if (scrollNodeId && kind) {\n // Drag scrolls chips; a press without move selects this node\n // (chip, gap, or gutter — all belong to the card).\n chipDrag = {\n kind,\n scrollNodeId,\n startX: event.clientX,\n startScrollLeft: scroller.scrollLeft,\n moved: false,\n nodeId: scrollNodeId,\n };\n scroller.classList.add(\"is-grabbing\");\n event.preventDefault();\n event.stopPropagation();\n document.addEventListener(\"mousemove\", onChipDragMove, true);\n document.addEventListener(\"mouseup\", onChipDragEnd, true);\n return;\n }\n }\n // Non-scrollable chip row: fall through to normal node select via\n // data-cy-node-id on the scroller.\n }\n\n const overflow = resolveOverflowChip(event.target);\n if (overflow) {\n pressStartedOnOverflow = true;\n event.preventDefault();\n event.stopPropagation();\n openKeyPopoverFromChip(overflow);\n return;\n }\n\n const nodeAtDown = resolveNodeFromLabel(event.target);\n if (nodeAtDown) {\n event.preventDefault();\n event.stopPropagation();\n nodePress = { nodeId: nodeAtDown.id(), x: event.clientX, y: event.clientY };\n const pan = cy.pan();\n nodePan = {\n nodeId: nodeAtDown.id(),\n startX: event.clientX,\n startY: event.clientY,\n startPan: { x: pan.x, y: pan.y },\n moved: false,\n selectedAtStart: getSelectedNodeIds(cy),\n };\n document.addEventListener(\"mousemove\", onNodePanMove, true);\n document.addEventListener(\"mouseup\", onNodePanEnd, true);\n return;\n }\n\n if (!container.contains(event.target as Node)) return;\n\n const selected = getSelectedNodeIds(cy);\n multiSelectSnapshot = selected.length > 1 ? selected : null;\n bgPress = { x: event.clientX, y: event.clientY, moved: false, downAt: performance.now() };\n document.addEventListener(\"mousemove\", onDocumentMouseMove, true);\n document.addEventListener(\"mouseup\", endBackgroundPress, true);\n };\n\n const onCyNodeTap = (event: Cytoscape.EventObject) => {\n if (consumeSelectSuppress()) {\n restoreFrozenSelection();\n return;\n }\n const node = event.target as Cytoscape.NodeSingular;\n if (!canSelectNode(node)) return;\n const original = event.originalEvent as MouseEvent | undefined;\n if (original?.button != null && original.button !== 0) return;\n if (pressStartedOnOverflow || resolveOverflowChip(original?.target ?? null)) return;\n runSelectOnce(node, Boolean(original?.ctrlKey || original?.metaKey));\n };\n\n const onContainerClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n if (isContextMenuTarget(event.target)) return;\n if (consumeSelectSuppress()) {\n nodePress = null;\n restoreFrozenSelection();\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (resolveOverflowChip(event.target)) {\n event.preventDefault();\n event.stopPropagation();\n nodePress = null;\n return;\n }\n // mouseup already selected this press — swallow the trailing click.\n if (selectHandledThisGesture) {\n nodePress = null;\n return;\n }\n let node = resolveNodeFromLabel(event.target);\n if (!node && nodePress) {\n const dx = event.clientX - nodePress.x;\n const dy = event.clientY - nodePress.y;\n if (dx * dx + dy * dy <= NODE_PAN_MOVE_PX * NODE_PAN_MOVE_PX) {\n const candidate = cy.getElementById(nodePress.nodeId);\n if (!candidate.empty()) node = candidate as Cytoscape.NodeSingular;\n }\n }\n nodePress = null;\n if (!node) return;\n event.preventDefault();\n event.stopPropagation();\n runSelectOnce(node, event.ctrlKey || event.metaKey);\n };\n\n const onContainerMouseOut = (event: MouseEvent) => {\n const related = event.relatedTarget as Node | null;\n if (related && container.contains(related)) return;\n if (getSelectedNodeIds(cy).length > 0) return;\n clearGraphFocus(cy);\n };\n\n const onDblTapGroup = (event: Cytoscape.EventObject) => {\n const node = event.target as Cytoscape.NodeSingular;\n const type = node.data(\"type\") as string;\n if (type === \"group\" || type === \"group-expanded\") {\n callbacks.onToggleGroup(node.data(\"name\") as string);\n }\n };\n\n // HTML labels sit above the canvas and swallow the browser contextmenu, so\n // cytoscape-context-menus never sees a native cxttap. Forward RMB on labels\n // and on empty areas of the (events:no) expanded blue frame.\n const onContainerContextMenu = (event: MouseEvent) => {\n const node = resolvePointerTarget(cy, container, event);\n if (!node) return;\n event.preventDefault();\n event.stopPropagation();\n // Skip native mouseup→core cxttap that would wipe this menu on empty\n // frame chrome (title band has no events:yes node under the cursor).\n suppressUpcomingNativeCxttap(cy);\n callbacks.onContextTarget?.(node);\n\n // Plugin only *shows* matching items; it does not hide the rest unless the\n // menu position object changes. Clear every item first so Collapse cannot\n // linger from a previous RMB on the blue frame.\n container.querySelectorAll(\".cy-context-menus-cxt-menuitem\").forEach((el) => {\n (el as HTMLElement).style.display = \"none\";\n });\n\n const pos = modelPosFromClient(cy, container, event.clientX, event.clientY);\n // Cytoscape emit accepts a plain event object with position fields.\n // @ts-expect-error cytoscape EventNames overload misses the object form\n node.emit({\n type: \"cxttap\",\n position: { x: pos.x, y: pos.y },\n renderedPosition: pos.rendered,\n originalEvent: event,\n });\n\n // Plugin corner-flip math often drifts for HTML-label hits (esp. on the\n // right half of the canvas). Pin the menu under the cursor instead.\n // Also enforce item visibility from the resolved target (not stale selectors).\n queueMicrotask(() => {\n const menu = container.querySelector(\n \".cy-context-menus-cxt-menu\",\n ) as HTMLElement | null;\n if (!menu || getComputedStyle(menu).display === \"none\") return;\n const rect = container.getBoundingClientRect();\n menu.style.left = `${event.clientX - rect.left}px`;\n menu.style.top = `${event.clientY - rect.top}px`;\n menu.style.right = \"auto\";\n menu.style.bottom = \"auto\";\n\n const type = node.data(\"type\") as string;\n const openDetails = menu.querySelector(\"#open-details\") as HTMLElement | null;\n const expand = menu.querySelector(\"#expand-steps\") as HTMLElement | null;\n const collapse = menu.querySelector(\"#collapse-steps\") as HTMLElement | null;\n if (openDetails) openDetails.style.display = \"\";\n if (expand) expand.style.display = type === \"group\" ? \"\" : \"none\";\n if (collapse) collapse.style.display = type === \"group-expanded\" ? \"\" : \"none\";\n });\n };\n\n // Double-click: HTML group labels, or empty area of an expanded blue frame\n // (group-expanded uses events:no so dbltap does not fire there).\n const onContainerDblClick = (event: MouseEvent) => {\n const node = resolvePointerTarget(cy, container, event);\n if (!node) return;\n const type = node.data(\"type\") as string;\n if (type === \"group\" || type === \"group-expanded\") {\n event.preventDefault();\n event.stopPropagation();\n callbacks.onToggleGroup(node.data(\"name\") as string);\n }\n };\n\n const onContainerWheel = (event: WheelEvent) => {\n const scroller = (event.target as Element | null)?.closest?.(\n \".node-key-chips\",\n ) as HTMLElement | null;\n if (scroller) {\n if (scroller.scrollWidth <= scroller.clientWidth) return;\n const delta =\n Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY;\n if (delta === 0) return;\n scroller.scrollLeft += delta;\n rememberChipScroll(scroller);\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n event.preventDefault();\n callbacks.onUserInteracted();\n const raw = Math.max(-WHEEL_DELTA_CLAMP, Math.min(WHEEL_DELTA_CLAMP, event.deltaY));\n const normalizedDelta = Math.sign(raw) * Math.sqrt(Math.abs(raw));\n const speed = event.shiftKey ? FAST_WHEEL_ZOOM_SPEED : WHEEL_ZOOM_SPEED;\n const factor = Math.exp(-normalizedDelta * WHEEL_ZOOM_COEFF * speed);\n const rect = container.getBoundingClientRect();\n const renderedPosition = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n const nextZoom = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, cy.zoom() * factor));\n cy.zoom({ level: nextZoom, renderedPosition });\n };\n\n cy.boxSelectionEnabled(false);\n cy.on(\"tap\", \"node\", onCyNodeTap);\n container.addEventListener(\"wheel\", onContainerWheel, { capture: true, passive: false });\n container.addEventListener(\"mousedown\", onContainerMouseDown, true);\n container.addEventListener(\"click\", onContainerClick, true);\n container.addEventListener(\"contextmenu\", onContainerContextMenu, true);\n container.addEventListener(\"dblclick\", onContainerDblClick, true);\n container.addEventListener(\"mouseout\", onContainerMouseOut, true);\n cy.on(\"dbltap\", 'node[type = \"group\"], node[type = \"group-expanded\"]', onDblTapGroup);\n\n return () => {\n document.removeEventListener(\"mousemove\", onDocumentMouseMove, true);\n document.removeEventListener(\"mouseup\", endBackgroundPress, true);\n document.removeEventListener(\"mousemove\", onChipDragMove, true);\n document.removeEventListener(\"mouseup\", onChipDragEnd, true);\n document.removeEventListener(\"mousemove\", onNodePanMove, true);\n document.removeEventListener(\"mouseup\", onNodePanEnd, true);\n cancelAnimationFrame(restoreFrame);\n if (!cy.destroyed()) {\n cy.off(\"render\", restoreChipScrolls);\n container.removeEventListener(\"scroll\", onChipScroll, true);\n container.removeEventListener(\"wheel\", onContainerWheel, true);\n container.removeEventListener(\"mousedown\", onContainerMouseDown, true);\n container.removeEventListener(\"click\", onContainerClick, true);\n container.removeEventListener(\"contextmenu\", onContainerContextMenu, true);\n container.removeEventListener(\"dblclick\", onContainerDblClick, true);\n container.removeEventListener(\"mouseout\", onContainerMouseOut, true);\n cy.off(\"tap\", \"node\", onCyNodeTap);\n cy.off(\"dbltap\", 'node[type = \"group\"], node[type = \"group-expanded\"]', onDblTapGroup);\n }\n };\n}\n\nexport { MIN_ZOOM, MAX_ZOOM };\n","import Cytoscape from \"cytoscape\";\nimport { nodeUsesHtmlLabel } from \"./htmlLabelOpacity\";\n\nexport type HtmlLabelAlign = \"top\" | \"left\" | \"center\" | \"right\" | \"bottom\";\n\nexport type HtmlNodeLabelConfig = {\n query: string;\n tpl: (data: Cytoscape.NodeDataDefinition) => string;\n halign?: HtmlLabelAlign;\n valign?: HtmlLabelAlign;\n halignBox?: HtmlLabelAlign;\n valignBox?: HtmlLabelAlign;\n cssClass?: string;\n};\n\ntype LabelPosition = { w: number; h: number; x: number; y: number };\n\ntype LabelEntry = {\n root: HTMLDivElement;\n content: HTMLDivElement;\n config: HtmlNodeLabelConfig;\n dataKey: string;\n align: [number, number, number, number];\n};\n\nconst layerStore = new WeakMap();\nconst initStore = new WeakMap();\n\nconst ALIGN: Record = {\n top: -0.5,\n left: -0.5,\n center: 0,\n right: 0.5,\n bottom: 0.5,\n};\n\nfunction buildAlign(config: HtmlNodeLabelConfig): [number, number, number, number] {\n const halign = config.halign ?? \"center\";\n const valign = config.valign ?? \"center\";\n const halignBox = config.halignBox ?? \"center\";\n const valignBox = config.valignBox ?? \"center\";\n return [\n ALIGN[halign],\n ALIGN[valign],\n 100 * (ALIGN[halignBox] - 0.5),\n 100 * (ALIGN[valignBox] - 0.5),\n ];\n}\n\n/** Stable key for label HTML — ignores transient UI/focus/size/opacity fields. */\nexport function htmlLabelDataKey(data: Cytoscape.NodeDataDefinition): string {\n const copy: Record = { ...data };\n delete copy.uiFocused;\n delete copy.uiSelected;\n delete copy.uiRelated;\n delete copy.uiDimmed;\n // Size/opacity animate every frame during expand/collapse; rebuild only on content.\n delete copy.boxW;\n delete copy.boxH;\n delete copy.htmlLabelOpacity;\n return JSON.stringify(copy);\n}\n\nfunction getNodePosition(node: Cytoscape.NodeSingular): LabelPosition {\n return {\n w: node.width(),\n h: node.height(),\n x: node.position(\"x\"),\n y: node.position(\"y\"),\n };\n}\n\nfunction renderLabelHtml(content: HTMLDivElement, html: string): void {\n while (content.firstChild) {\n content.removeChild(content.firstChild);\n }\n if (!html) return;\n const parsed = new DOMParser().parseFromString(html, \"text/html\");\n Array.from(parsed.body.children).forEach((child) => {\n content.appendChild(child);\n });\n}\n\nfunction applyLabelTransform(entry: LabelEntry, position: LabelPosition): void {\n // Keep the painted card size in sync with cytoscape box (morph updates\n // boxW/boxH without rebuilding label HTML). Size lives on the inner\n // `.node-compound-label`, not the absolute positioning root.\n const card = entry.content.firstElementChild as HTMLElement | null;\n if (card) {\n if (position.w > 0) card.style.width = `${position.w}px`;\n if (position.h > 0) card.style.height = `${position.h}px`;\n }\n const x = position.x + entry.align[0] * position.w;\n const y = position.y + entry.align[1] * position.h;\n const valRel = `translate(${entry.align[2]}%,${entry.align[3]}%) `;\n const valAbs = `translate(${x.toFixed(2)}px,${y.toFixed(2)}px)`;\n entry.root.style.transform = valRel + valAbs;\n}\n\nfunction ensureLayer(cy: Cytoscape.Core): HTMLDivElement | null {\n const container = cy.container();\n if (!container) return null;\n\n let layer = layerStore.get(cy);\n if (layer && container.contains(layer)) return layer;\n\n const canvas = container.querySelector(\"canvas\");\n if (!canvas?.parentNode) return null;\n\n layer = document.createElement(\"div\");\n layer.className = \"cy-node-html-labels\";\n layer.style.position = \"absolute\";\n layer.style.zIndex = \"10\";\n layer.style.width = \"500px\";\n layer.style.margin = \"0\";\n layer.style.padding = \"0\";\n layer.style.border = \"0\";\n layer.style.outline = \"0\";\n layer.style.pointerEvents = \"none\";\n canvas.parentNode.appendChild(layer);\n layerStore.set(cy, layer);\n return layer;\n}\n\nfunction updateLayerPanZoom(cy: Cytoscape.Core): void {\n const layer = layerStore.get(cy);\n if (!layer) return;\n const pan = cy.pan();\n const zoom = cy.zoom();\n layer.style.transform = `translate(${pan.x}px,${pan.y}px) scale(${zoom})`;\n layer.style.transformOrigin = \"top left\";\n}\n\nfunction matchingConfig(\n configs: HtmlNodeLabelConfig[],\n node: Cytoscape.NodeSingular,\n): HtmlNodeLabelConfig | undefined {\n for (let i = configs.length - 1; i >= 0; i -= 1) {\n if (node.is(configs[i].query)) return configs[i];\n }\n return undefined;\n}\n\n/**\n * Custom HTML label layer for Cytoscape nodes.\n *\n * Replaces cytoscape-node-html-label which rebuilds label DOM on every `style`\n * event (including transient `:active`), causing selection flicker and camera jumps.\n * We only rebuild when node *data* content changes (labelRefresh, run status, etc.).\n */\nexport function initHtmlNodeLabels(cy: Cytoscape.Core, configs: HtmlNodeLabelConfig[]): void {\n if (initStore.has(cy)) return;\n initStore.set(cy, true);\n\n const entries = new Map();\n\n const removeNode = (nodeId: string) => {\n const entry = entries.get(nodeId);\n if (!entry) return;\n entry.root.remove();\n entries.delete(nodeId);\n };\n\n const upsertNode = (node: Cytoscape.NodeSingular) => {\n if (!nodeUsesHtmlLabel(node)) {\n removeNode(node.id());\n return;\n }\n\n const config = matchingConfig(configs, node);\n if (!config) {\n removeNode(node.id());\n return;\n }\n\n const layer = ensureLayer(cy);\n if (!layer) return;\n\n const html = config.tpl(node.data());\n const dataKey = htmlLabelDataKey(node.data());\n const position = getNodePosition(node);\n let entry = entries.get(node.id());\n\n if (!entry) {\n const root = document.createElement(\"div\");\n root.style.position = \"absolute\";\n if (config.cssClass) root.classList.add(config.cssClass);\n const content = document.createElement(\"div\");\n root.appendChild(content);\n layer.appendChild(root);\n entry = {\n root,\n content,\n config,\n dataKey: \"\",\n align: buildAlign(config),\n };\n entries.set(node.id(), entry);\n }\n\n entry.config = config;\n entry.align = buildAlign(config);\n\n if (entry.dataKey !== dataKey) {\n entry.dataKey = dataKey;\n renderLabelHtml(entry.content, html);\n }\n\n applyLabelTransform(entry, position);\n };\n\n const syncAll = () => {\n if (cy.destroyed()) return;\n configs.forEach((cfg) => {\n cy.elements(cfg.query).forEach((ele) => {\n if (ele.isNode()) upsertNode(ele as Cytoscape.NodeSingular);\n });\n });\n };\n\n const onData = (event: Cytoscape.EventObject) => {\n const target = event.target;\n if (!target.isNode()) return;\n upsertNode(target as Cytoscape.NodeSingular);\n };\n\n const onPosition = (event: Cytoscape.EventObject) => {\n const target = event.target;\n if (!target.isNode()) return;\n const entry = entries.get(target.id());\n if (!entry) return;\n applyLabelTransform(entry, getNodePosition(target as Cytoscape.NodeSingular));\n };\n\n cy.one(\"render\", () => {\n ensureLayer(cy);\n syncAll();\n updateLayerPanZoom(cy);\n });\n\n cy.on(\"add\", onData);\n cy.on(\"remove\", (event) => removeNode(event.target.id()));\n cy.on(\"data\", onData);\n cy.on(\"position bounds\", onPosition);\n cy.on(\"pan zoom\", () => updateLayerPanZoom(cy));\n\n cy.one(\"destroy\", () => {\n entries.forEach((entry) => entry.root.remove());\n entries.clear();\n layerStore.delete(cy);\n initStore.delete(cy);\n });\n}\n","import Cytoscape from \"cytoscape\";\nimport { getSelectedNodeIds } from \"./graphSelection\";\nimport type { InspectorState } from \"./NodeInspectorPanel\";\n\nexport type GraphSessionState = {\n graphUrl: string;\n expandedGroups: string[];\n selectedNodeIds: string[];\n inspectorNodeId: string | null;\n zoom: number;\n pan: { x: number; y: number };\n userInteracted: boolean;\n};\n\nconst STORAGE_PREFIX = \"dp.graphSession.\";\n\nfunction storageKey(graphUrl: string): string {\n return `${STORAGE_PREFIX}${graphUrl}`;\n}\n\nexport function loadGraphSessionState(graphUrl: string): GraphSessionState | null {\n try {\n const raw = sessionStorage.getItem(storageKey(graphUrl));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as GraphSessionState;\n if (parsed.graphUrl !== graphUrl) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function saveGraphSessionState(state: GraphSessionState, _stageFilter?: string | null): void {\n try {\n sessionStorage.setItem(storageKey(state.graphUrl), JSON.stringify(state));\n } catch {\n /* quota / private mode */\n }\n}\n\nexport function captureGraphSessionState(\n graphUrl: string,\n expandedGroups: Set,\n inspector: InspectorState,\n cy: Cytoscape.Core | undefined,\n userInteracted: boolean,\n): GraphSessionState {\n if (!cy || cy.destroyed()) {\n const selected = inspector ? [inspector.nodeId] : [];\n return {\n graphUrl,\n expandedGroups: Array.from(expandedGroups),\n selectedNodeIds: selected,\n inspectorNodeId: inspector?.nodeId ?? null,\n zoom: 1,\n pan: { x: 0, y: 0 },\n userInteracted,\n };\n }\n\n const pan = cy.pan();\n const selected = getSelectedNodeIds(cy);\n\n return {\n graphUrl,\n expandedGroups: Array.from(expandedGroups),\n selectedNodeIds:\n selected.length > 0 ? selected : inspector ? [inspector.nodeId] : [],\n inspectorNodeId: inspector?.nodeId ?? null,\n zoom: cy.zoom(),\n pan: { x: pan.x, y: pan.y },\n userInteracted,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport Cytoscape from \"cytoscape\";\nimport CytoscapeComponent from \"react-cytoscapejs\";\nimport \"cytoscape-context-menus/cytoscape-context-menus.css\";\n\nimport dagre from \"cytoscape-dagre\";\nimport contextMenus from \"cytoscape-context-menus\";\n\nimport \"./style.css\";\nimport { groupBoxSize, stepNodeSize, tableNodeSize } from \"./graphNodeLayout\";\nimport { groupIconSvg, tableIconSvg, transformIconSvg, slidersHorizontalIconSvg } from \"./nodeIcons\";\nimport { escapeHtml, getTransformPrimaryKeys, renderKeyChipList, renderLabelChipList } from \"./nodeKeyChips\";\nimport { KeyListPopover, type KeyPopoverState } from \"./KeyListPopover\";\nimport { NodeInspectorPanel, type InspectorState } from \"./NodeInspectorPanel\";\nimport { useResizableWidth } from \"../../hooks/useResizableWidth\";\nimport { reprocessData } from \"./process\";\nimport { stylesheet } from \"./stylesheet\";\nimport { syncCyGraph } from \"./syncCyGraph\";\nimport { initHtmlLabelOpacitySync, setNodeVisualOpacity } from \"./htmlLabelOpacity\";\nimport { initInternalEdgeOverlay, refreshInternalEdgeOverlay } from \"./internalEdgeOverlay\";\nimport {\n applyFailedEdgeStyles,\n clearSelectedNodeIds,\n initHtmlLabelInteractionStateSync,\n setSelectedNodeIds,\n} from \"./graphVisualState\";\nimport { attachGraphInteractions, MAX_ZOOM, MIN_ZOOM } from \"./graphInteractions\";\nimport { initHtmlNodeLabels } from \"./htmlNodeLabels\";\nimport { Alert, AlertProps, Spin } from \"antd\";\nimport { apiFetch, getApiErrorMessage } from \"../../api/http\";\nimport { opsApi } from \"../../api/client\";\nimport {\n captureGraphSessionState,\n loadGraphSessionState,\n saveGraphSessionState,\n type GraphSessionState,\n} from \"./graphSessionState\";\nimport { GraphData } from \"../../types\";\nimport type { PipelineGraphProps } from \"../../types/pipelineGraph\";\n\nCytoscape.use(dagre);\nCytoscape.use(contextMenus);\n\nfunction buildGraphUrl(stageFilter?: string | null): string {\n const base = (process.env[\"REACT_APP_GET_GRAPH_URL\"] as string) || \"/api/v1alpha3/graph\";\n if (!stageFilter) return base;\n const joiner = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${joiner}stage=${encodeURIComponent(stageFilter)}`;\n}\n\nconst labelsInitStore = new WeakMap();\n\nfunction labelOpacityStyle(data: Cytoscape.NodeDataDefinition): string {\n const opacity = typeof data.htmlLabelOpacity === \"number\" ? data.htmlLabelOpacity : 1;\n return `opacity:${opacity};`;\n}\n\nfunction buildNodeLabelTpl() {\n return (data: Cytoscape.NodeDataDefinition) => {\n if (data.type === \"group-expanded\") {\n return \"\";\n }\n\n const fullName = data.name as string;\n const nodeId = (data.id as string) || fullName;\n const metaGroup = data.metaGroup as string | undefined;\n const isSubgraph = Boolean(metaGroup);\n const renderName = (lines: string[]) => lines.join(\"
\");\n\n if (data.type === \"group\") {\n const childCount = data.child_count ?? 0;\n const tpk = getTransformPrimaryKeys(data);\n const fallback = groupBoxSize(fullName, childCount, tpk);\n const w = (data.boxW as number) ?? fallback.w;\n const h = (data.boxH as number) ?? fallback.h;\n return `\n
\n
\n
${groupIconSvg}
\n
\n
${renderName(fallback.lines)}
\n
${childCount} steps
\n ${renderKeyChipList(nodeId, \"tpk\", tpk)}\n ${renderLabelChipList(nodeId, (data.labels as string[][]) ?? [])}\n
\n
\n
\n `;\n }\n\n const coreClass = isSubgraph ? \"node-core-subgraph\" : \"\";\n\n if (data.type === \"table\") {\n const primaryKeys = (data.indexes as string[]) || [];\n const tableType = data.store_class ? String(data.store_class) : \"TableStoreDB\";\n const { w, h, lines } = tableNodeSize(fullName, primaryKeys, false);\n return `\n \n
\n
${tableIconSvg}
\n
\n
${renderName(lines)}
\n
${escapeHtml(tableType)}
\n ${renderKeyChipList(nodeId, \"pk\", primaryKeys)}\n
\n
\n \n `;\n }\n\n const tpk = getTransformPrimaryKeys(data);\n const { w, h, lines } = stepNodeSize(fullName, false, tpk);\n const transformType = data.transform_type ? String(data.transform_type) : \"TransformStep\";\n\n return `\n \n
\n
${transformIconSvg}
\n
\n
${renderName(lines)}
\n
${escapeHtml(transformType)}
\n ${renderKeyChipList(nodeId, \"tpk\", tpk)}\n ${renderLabelChipList(nodeId, (data.labels as string[][]) ?? [])}\n
\n
\n \n `;\n };\n}\n\nfunction initNodeLabels(cy: Cytoscape.Core) {\n if (labelsInitStore.has(cy)) return;\n labelsInitStore.set(cy, true);\n initHtmlLabelOpacitySync(cy);\n initInternalEdgeOverlay(cy);\n initHtmlNodeLabels(cy, [\n {\n query: \"node\",\n halign: \"center\",\n valign: \"center\",\n halignBox: \"center\",\n valignBox: \"center\",\n tpl: buildNodeLabelTpl(),\n },\n ]);\n initHtmlLabelInteractionStateSync(cy);\n cy.one(\"render\", () => {\n cy.nodes().forEach((node) => setNodeVisualOpacity(cy, node, 1));\n });\n}\n\nfunction refreshNodeLabelPositions(cy: Cytoscape.Core) {\n if (cy.destroyed()) return;\n cy.nodes().forEach((node) => {\n node.trigger(\"position\");\n });\n}\n\nfunction PipelineGraphView({\n stageFilter = null,\n runSteps = null,\n height = \"100%\",\n rankDir = \"TB\",\n refreshIntervalMs = 0,\n pipelineId: pipelineIdProp,\n graphRefreshToken = 0,\n}: PipelineGraphProps) {\n const navigate = useNavigate();\n const [loading, setLoading] = useState(false);\n const [showInitialSpin, setShowInitialSpin] = useState(true);\n const initialLoadRef = useRef(true);\n const [cy, setCy] = useState();\n const [alertMsg, setAlertMsg] = useState(null);\n const [expandedGroups, setExpandedGroups] = useState>(() => {\n const saved = loadGraphSessionState(buildGraphUrl(stageFilter));\n return saved ? new Set(saved.expandedGroups) : new Set();\n });\n const [rawGraph, setRawGraph] = useState(null);\n const [pipelineId, setPipelineId] = useState(pipelineIdProp ?? null);\n\n const [keyPopover, setKeyPopover] = useState(null);\n const [inspector, setInspector] = useState(null);\n\n // Allow the inspector panel to grow up to ~50% of the viewport. The panel\n // lives inside the zoomed #root (--dp-ui-scale), so its CSS-px space is the\n // viewport width divided by that scale.\n const inspectorMaxWidth = useMemo(() => {\n if (typeof window === \"undefined\") return 900;\n const scaleRaw = getComputedStyle(document.documentElement).getPropertyValue(\n \"--dp-ui-scale\",\n );\n const scale = parseFloat(scaleRaw) || 0.8;\n return Math.round((window.innerWidth / scale) * 0.5);\n }, []);\n\n const {\n width: panelWidth,\n dragging: panelDragging,\n onHandleMouseDown: onPanelResize,\n } = useResizableWidth({\n initial: 360,\n min: 260,\n max: inspectorMaxWidth,\n storageKey: \"dp.graphInspectorWidth\",\n edge: \"left\",\n });\n\n const savedSessionRef = useRef(\n loadGraphSessionState(buildGraphUrl(stageFilter)),\n );\n const sessionRestoredRef = useRef(false);\n // Persisted zoom/pan is only restored on the very first mount (page reload /\n // deep-link). In-app navigation between stages and the full graph must not\n // snap the camera to a stale manual viewport — it animates a clean fit\n // instead, so the transition stays smooth and consistent.\n const firstMountRef = useRef(true);\n\n const needFitRef = useRef(true);\n // Whether the user has manually panned/zoomed. Until they do, the camera is\n // considered \"auto\": a container resize (flex settle, inspector panel resize,\n // sidebar toggle, window resize) re-fits so the graph stays centered instead\n // of drifting to an edge because cytoscape cached a stale container width.\n const userInteractedRef = useRef(false);\n // graphUrl whose data currently lives in `rawGraph`; guards the sync effect\n // from running against a stale graph during a stage switch (which would fit\n // the camera to the old graph and consume needFit before the new one loads).\n const loadedUrlRef = useRef(null);\n const stageInitKeyRef = useRef(null);\n const anchorGroupRef = useRef(null);\n const expandingRef = useRef(false);\n const pipelineIdRef = useRef(pipelineId);\n pipelineIdRef.current = pipelineId;\n\n const runStatusByStep = useMemo(() => {\n const map = new Map();\n runSteps?.forEach((s) => map.set(s.step_name, s.status));\n return map.size ? map : undefined;\n }, [runSteps]);\n\n const graphUrl = useMemo(() => buildGraphUrl(stageFilter), [stageFilter]);\n const runStatusRef = useRef(runStatusByStep);\n runStatusRef.current = runStatusByStep;\n\n const graphNodesById = useMemo(() => {\n if (!rawGraph) return new Map();\n const { nodes } = reprocessData(rawGraph, expandedGroups);\n return nodes;\n }, [rawGraph, expandedGroups]);\n\n const applySessionRestore = useCallback(\n (cyInstance: Cytoscape.Core) => {\n const saved = savedSessionRef.current;\n if (!saved || sessionRestoredRef.current || cyInstance.destroyed()) return;\n sessionRestoredRef.current = true;\n\n // Skip stale camera when expanded metas were open — remount must fit\n // the rebuilt layout instead of an old pan from a different viewport.\n if (saved.userInteracted && saved.expandedGroups.length === 0) {\n cyInstance.zoom(saved.zoom);\n cyInstance.pan(saved.pan);\n }\n\n const nodeIds =\n saved.selectedNodeIds.length > 0\n ? saved.selectedNodeIds\n : saved.inspectorNodeId\n ? [saved.inspectorNodeId]\n : [];\n\n if (nodeIds.length > 0) {\n setSelectedNodeIds(cyInstance, nodeIds);\n }\n\n if (saved.inspectorNodeId) {\n const node = cyInstance.getElementById(saved.inspectorNodeId);\n if (!node.empty()) {\n setInspector({\n nodeId: saved.inspectorNodeId,\n data: node.data(),\n });\n } else {\n const fallback = graphNodesById.get(saved.inspectorNodeId);\n if (fallback) {\n setInspector({\n nodeId: saved.inspectorNodeId,\n data: fallback,\n });\n }\n }\n }\n },\n [graphNodesById],\n );\n\n const setKeyPopoverRef = useRef(setKeyPopover);\n const setInspectorRef = useRef(setInspector);\n setKeyPopoverRef.current = setKeyPopover;\n setInspectorRef.current = setInspector;\n\n useEffect(() => {\n if (pipelineIdProp) {\n setPipelineId(pipelineIdProp);\n return;\n }\n opsApi\n .getCapabilities()\n .then((c) => setPipelineId(c.pipeline_id ?? null))\n .catch(() => setPipelineId(null));\n }, [pipelineIdProp]);\n\n const persistGraphSession = useCallback(() => {\n saveGraphSessionState(\n captureGraphSessionState(\n graphUrl,\n expandedGroups,\n inspector,\n cy,\n userInteractedRef.current,\n ),\n stageFilter,\n );\n }, [graphUrl, expandedGroups, inspector, cy, stageFilter]);\n\n const toggleGroupExpand = useCallback((groupName: string) => {\n if (!cy) return;\n anchorGroupRef.current = groupName;\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupName)) {\n next.delete(groupName);\n expandingRef.current = false;\n } else {\n next.add(groupName);\n expandingRef.current = true;\n }\n return next;\n });\n }, [cy]);\n\n const openNodeDetails = useCallback((node: Cytoscape.NodeSingular) => {\n persistGraphSession();\n const pid = pipelineIdRef.current;\n if (!pid) {\n setAlertMsg({ type: \"warning\", message: \"Pipeline ID not available\" });\n return;\n }\n const nodeType = node.data(\"type\") as string;\n const name = node.data(\"name\") as string;\n const base = `/pipelines/${encodeURIComponent(pid)}`;\n if (nodeType === \"group\" || nodeType === \"group-expanded\") {\n navigate(`${base}/meta-steps/${encodeURIComponent(name)}`);\n } else if (nodeType === \"table\") {\n navigate(`${base}/tables/${encodeURIComponent(name)}`);\n } else if (nodeType === \"transform\") {\n navigate(`${base}/transforms/${encodeURIComponent(name)}`);\n }\n }, [navigate, persistGraphSession]);\n\n const openNodeDetailsRef = useRef(openNodeDetails);\n const toggleGroupExpandRef = useRef(toggleGroupExpand);\n const contextTargetRef = useRef(null);\n openNodeDetailsRef.current = openNodeDetails;\n toggleGroupExpandRef.current = toggleGroupExpand;\n\n useEffect(() => {\n // Only the first mount restores a persisted camera/selection (reload or\n // deep-link). Later graphUrl changes are in-app navigation: drop the saved\n // session so the graph animates a fresh fit instead of snapping to a stale\n // manual zoom/pan.\n const isFirstMount = firstMountRef.current;\n firstMountRef.current = false;\n const saved = isFirstMount ? loadGraphSessionState(graphUrl) : null;\n savedSessionRef.current = saved;\n sessionRestoredRef.current = false;\n stageInitKeyRef.current = null;\n // Expanded metas must be re-laid out from scratch on remount; restoring a\n // stale pan/zoom (often from a narrower inspector viewport) hides the graph\n // and can leave the blue frame visually detached after Fit.\n const hasExpanded = Boolean(saved?.expandedGroups?.length);\n needFitRef.current = saved ? hasExpanded || !saved.userInteracted : true;\n userInteractedRef.current = saved && !hasExpanded ? saved.userInteracted : false;\n if (saved) {\n setExpandedGroups(new Set(saved.expandedGroups));\n } else {\n setExpandedGroups(new Set());\n }\n initialLoadRef.current = true;\n anchorGroupRef.current = null;\n setShowInitialSpin(true);\n }, [graphUrl]);\n\n useEffect(() => {\n if (!rawGraph) return;\n\n const initKey = `${graphUrl}::${stageFilter ?? \"\"}`;\n if (stageInitKeyRef.current === initKey) return;\n stageInitKeyRef.current = initKey;\n\n if (savedSessionRef.current) {\n // Never clear expandedGroups while a session is being restored — a\n // sync that finishes first used to flip sessionRestored and then this\n // effect wiped the expand set, leaving a broken layout.\n const saved = savedSessionRef.current;\n if (!sessionRestoredRef.current) {\n const hasExpanded = saved.expandedGroups.length > 0;\n needFitRef.current = hasExpanded || !saved.userInteracted;\n }\n return;\n }\n\n setExpandedGroups(new Set());\n needFitRef.current = true;\n }, [rawGraph, graphUrl, stageFilter]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadGraph() {\n if (initialLoadRef.current) {\n setLoading(true);\n }\n\n try {\n const response = await apiFetch(graphUrl);\n if (!response.ok) throw new Error(`Graph request failed: ${response.status}`);\n const data = await response.json();\n if (cancelled) return;\n loadedUrlRef.current = graphUrl;\n setRawGraph(data);\n } catch (error) {\n if (!cancelled) {\n if (cy) {\n cy.elements().remove();\n }\n setAlertMsg({ type: \"error\", message: getApiErrorMessage(error) });\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n initialLoadRef.current = false;\n setShowInitialSpin(false);\n }\n }\n }\n\n loadGraph();\n if (!refreshIntervalMs) return () => {\n cancelled = true;\n };\n\n const timer = setInterval(loadGraph, refreshIntervalMs);\n return () => {\n cancelled = true;\n clearInterval(timer);\n };\n }, [graphUrl, refreshIntervalMs, cy, graphRefreshToken]);\n\n useEffect(() => {\n if (!cy || !rawGraph || loading) return;\n // Skip while rawGraph still belongs to the previous stage: wait until the\n // fetch for the current graphUrl lands so we animate to the right frame.\n if (loadedUrlRef.current !== graphUrl) return;\n\n syncCyGraph(cy, rawGraph, expandedGroups, {\n mode: needFitRef.current ? \"fit\" : \"preserve\",\n rankDir,\n anchorGroup: anchorGroupRef.current,\n expanding: expandingRef.current,\n onLayoutComplete: () => {\n refreshNodeLabelPositions(cy);\n applyFailedEdgeStyles(cy, runStatusRef.current);\n refreshInternalEdgeOverlay(cy);\n applySessionRestore(cy);\n },\n });\n needFitRef.current = false;\n anchorGroupRef.current = null;\n }, [cy, rawGraph, expandedGroups, loading, rankDir, graphUrl, applySessionRestore]);\n\n useEffect(() => {\n return () => {\n persistGraphSession();\n };\n }, [persistGraphSession]);\n\n useEffect(() => {\n if (!cy || cy.destroyed()) return;\n initNodeLabels(cy);\n }, [cy]);\n\n // Keep cytoscape's cached viewport size in sync with the container.\n // Only call cy.resize() on real dimension changes — never pan/fit on\n // selection (that must not move the camera).\n useEffect(() => {\n if (!cy || cy.destroyed()) return;\n const container = cy.container();\n if (!container || typeof ResizeObserver === \"undefined\") return;\n\n let frame = 0;\n let lastW = container.clientWidth;\n let lastH = container.clientHeight;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n if (cy.destroyed()) return;\n const w = container.clientWidth;\n const h = container.clientHeight;\n if (Math.abs(w - lastW) < 1 && Math.abs(h - lastH) < 1) return;\n lastW = w;\n lastH = h;\n cy.resize();\n refreshInternalEdgeOverlay(cy);\n // Autofit only while camera is still in auto mode (first load).\n if (!userInteractedRef.current && cy.nodes().nonempty()) {\n cy.fit(undefined, 60);\n }\n });\n });\n observer.observe(container);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [cy]);\n\n useEffect(() => {\n if (!cy || cy.destroyed()) return;\n\n return attachGraphInteractions(cy, {\n onOpenInspector: (node) => {\n setInspectorRef.current({\n nodeId: node.id(),\n data: node.data(),\n });\n setKeyPopoverRef.current(null);\n },\n onCloseInspector: () => setInspectorRef.current(null),\n onOpenKeyPopover: (state) => setKeyPopoverRef.current(state),\n onCloseKeyPopover: () => setKeyPopoverRef.current(null),\n onToggleGroup: (groupName) => toggleGroupExpandRef.current(groupName),\n onUserInteracted: () => {\n userInteractedRef.current = true;\n },\n onContextTarget: (node) => {\n contextTargetRef.current = node;\n },\n });\n }, [cy]);\n\n useEffect(() => {\n if (!cy || cy.destroyed()) return;\n\n // @ts-ignore cytoscape-context-menus\n cy.contextMenus({\n menuItems: [\n {\n id: \"open-details\",\n content: \"Open details page…\",\n selector: \"node\",\n onClickFunction: () => {\n const node = contextTargetRef.current;\n if (node && typeof node.data === \"function\") {\n openNodeDetailsRef.current(node);\n }\n },\n },\n {\n id: \"expand-steps\",\n content: \"Expand into sub-steps\",\n selector: 'node[type = \"group\"]',\n onClickFunction: () => {\n const node = contextTargetRef.current;\n if (node?.data(\"type\") === \"group\") {\n toggleGroupExpandRef.current(node.data(\"name\") as string);\n }\n },\n },\n {\n id: \"collapse-steps\",\n content: \"Collapse into single step\",\n // Only the expanded blue frame — not child steps/tables (they have metaGroup).\n selector: 'node[type = \"group-expanded\"]',\n onClickFunction: () => {\n const node = contextTargetRef.current;\n if (node?.data(\"type\") === \"group-expanded\") {\n toggleGroupExpandRef.current(node.data(\"name\") as string);\n }\n },\n },\n ],\n });\n\n return () => {\n try {\n if (!cy.destroyed()) {\n // @ts-ignore\n cy.contextMenus(\"destroy\");\n labelsInitStore.delete(cy);\n }\n } catch {\n /* cytoscape may already be torn down */\n }\n };\n }, [cy]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (keyPopover) {\n setKeyPopover(null);\n return;\n }\n if (inspector) {\n setInspector(null);\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [keyPopover, inspector]);\n\n useEffect(() => {\n if (!keyPopover) return undefined;\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Element | null;\n if (target?.closest?.(\".node-key-popover\") || target?.closest?.(\"[data-key-overflow='true']\")) {\n return;\n }\n setKeyPopover(null);\n };\n document.addEventListener(\"mousedown\", onPointerDown, true);\n return () => document.removeEventListener(\"mousedown\", onPointerDown, true);\n }, [keyPopover]);\n\n const closeAlert = () => setAlertMsg(null);\n\n const handleZoomIn = useCallback(() => {\n if (!cy || cy.destroyed()) return;\n userInteractedRef.current = true;\n const next = Math.min(MAX_ZOOM, cy.zoom() * 1.25);\n cy.zoom(next);\n }, [cy]);\n\n const handleZoomOut = useCallback(() => {\n if (!cy || cy.destroyed()) return;\n userInteractedRef.current = true;\n const next = Math.max(MIN_ZOOM, cy.zoom() / 1.25);\n cy.zoom(next);\n }, [cy]);\n\n const handleResetZoom = useCallback(() => {\n if (!cy || cy.destroyed()) return;\n userInteractedRef.current = true;\n cy.zoom(1);\n cy.center();\n }, [cy]);\n\n const handleFit = useCallback(() => {\n if (!cy || cy.destroyed()) return;\n userInteractedRef.current = false;\n cy.resize();\n cy.fit(undefined, 48);\n }, [cy]);\n\n const navigateToInspectorNode = useCallback(\n (nodeId: string) => {\n const fallbackData = graphNodesById.get(nodeId);\n if (!cy || cy.destroyed()) {\n if (fallbackData) {\n setInspector({ nodeId, data: fallbackData });\n setKeyPopover(null);\n }\n return;\n }\n const node = cy.getElementById(nodeId);\n if (!node.empty()) {\n const type = node.data(\"type\") as string;\n if (type !== \"group-expanded\") {\n setSelectedNodeIds(cy, [node.id()]);\n setInspector({ nodeId: node.id(), data: node.data() });\n setKeyPopover(null);\n return;\n }\n }\n if (fallbackData) {\n setInspector({ nodeId, data: fallbackData });\n setKeyPopover(null);\n if (!node.empty()) {\n clearSelectedNodeIds(cy);\n }\n }\n },\n [cy, graphNodesById],\n );\n\n const fillParent = height === \"100%\" || height === \"100vh\";\n\n return (\n \n
\n {alertMsg && (\n \n )}\n {showInitialSpin && loading && }\n
\n \n \n \n \n 100%\n \n \n
\n \n {keyPopover && (\n setKeyPopover(null)} />\n )}\n
\n setInspector(null)}\n onNavigateToNode={navigateToInspectorNode}\n onOpenDetails={\n inspector\n ? () => {\n const node = cy?.getElementById(inspector.nodeId);\n if (node && !node.empty()) openNodeDetails(node);\n }\n : undefined\n }\n />\n \n );\n}\n\nexport default PipelineGraphView;\n"],"names":["NODE_HEIGHT","charsPerLine","cardWidth","textPx","Math","max","floor","graphNodeDimensions","table","width","height","heightTwoRows","transform","groupCollapsed","compactTable","compactTransform","compactGroup","horizontalGap","verticalGap","splitTokens","name","parts","split","map","part","index","length","filter","token","wrapName","maxChars","maxLines","tokens","lines","current","flushHard","chunk","rest","push","slice","forEach","truncated","last","maxLen","reduce","acc","line","stepNodeSize","compact","dim","w","h","tableNodeSize","trimmed","groupBoxSize","_childCount","KeyListPopover","state","onClose","title","kind","keys","className","style","left","anchor","x","top","y","role","type","onClick","key","InspectorEmptyState","NodeInspectorPanel","inspector","graphNodesById","runStatusByStep","dragging","onHandleMouseDown","onNavigateToNode","onOpenDetails","flex","onMouseDown","node","data","runStatus","get","String","showTableData","showMetaTable","graphColors","bg","bg2","border","icon","text","expandedBg","expandedBorder","edgeColors","nodeName","stylesheet","selector","shape","getTransformPrimaryKeys","ghost","backgroundColor","label","color","events","opacity","edge","Boolean","isSequentialEdge","ANIMATION_MS","ANIMATION_EASING","easeInOutCubic","t","opacityStore","WeakMap","syncInitStore","activeRafStore","getOpacityStore","cy","store","Map","set","trackRaf","id","Set","add","getNodeHtmlLabelEl","nodeId","container","querySelector","CSS","escape","nodeUsesHtmlLabel","ensureGroupExpandedVisible","removeStyle","setNodeVisualOpacity","labelEl","makeEdgeKey","source","target","findEdgeByKey","idx","indexOf","parseEdgeKey","found","edges","empty","first","computeEdgeDiff","targetEdgeKeys","el","currentKeys","toAdd","Array","from","has","toRemove","addEdgesFromTarget","size","batch","GROUP_PADDING","RANK_SEP","NODE_SEP","bboxFromCenter","cx","bboxCenter","bbox","topCenter","placeByTopCenter","measureNode","tpk","child_count","pipelineIndex","pipelineOrderKey","boxW","boxH","indexes","parent","metaGroup","sortIds","ids","sort","a","b","localeCompare","comparePipelineOrder","nodes","na","nb","oa","ob","ia","ib","sortRankIds","layerNormalizedPos","nodeRank","ordered","rank","layer","countLayerCutCrossings","upperRank","lowerRank","pairs","src","tgt","rs","rt","tmp","u","v","crossings","i","j","buildNodeRankMap","layerNeighborPositions","layerRank","toward","layerSet","positions","tryPush","to","toRank","pos","orderByFarBarycenter","neighborPositions","scored","bary","sum","byPipe","entry","transposeLayerPair","fixUpper","improved","nextUpper","nextLower","movable","scratch","swapped","before","upper","lower","minimizeLayerCrossings","ranks","maxIters","rankKeys","r","totalCrossings","total","best","entries","k","bestScore","prevScore","iter","lowerKey","neighborPos","upperKey","down","up","score","hasPath","graph","visited","nexts","edgePipelinePriority","makeAcyclicRankEdges","sorted","result","buildRankEdges","renderEdges","sequential","synthetic","computeRanks","rankEdges","values","remap","value","next","densifyRanks","changed","guard","nextRank","longestPathRanks","layoutLayeredDag","rankDir","orderedRanks","sortedRankKeys","yCursor","rankIds","xCursor","rankHeight","rankWidth","innerGraphBBox","x1","Infinity","y1","x2","y2","min","Number","isFinite","layoutVerticalStack","children","orderedIds","order","maxW","layoutInnerGraph","pipelineOrder","hasInternalEdges","some","contentBBox","normalizeLayout","layout","margin","minX","minY","visible","shiftX","shiftY","cloneLayout","getGroupMembers","groupId","members","edgesToList","getBoundaryNodes","boundary","sourceIn","targetIn","collectLayoutMoveUnits","exclude","claimed","units","origX","origY","childEntry","childId","m","originX","originY","translateUnit","unit","dx","dy","computeExternalPositionsAfterGroupResize","oldGroupBBox","newGroupBBox","deltaH","startY","rows","row","find","abs","rowHeight","prev","curr","prevRight","currLeft","minLeft","reassignExternalRowsOnExpand","deltaW","floorX","candidate","expandGroupInLayout","groupEntry","innerIds","innerNodes","edgeList","innerEdges","innerPositions","expandedSize","oldBBox","groupBBox","innerOrigin","innerBBox","measured","buildCollapsedLayout","expanded","pipelineOrders","layoutNodes","ea","eb","applyLayoutToCy","e","ele","getElementById","center","position","morphRafStore","pendingMorphStore","trackMorphRaf","getPendingMorphs","stopLayoutAnimations","destroyed","rafs","cancelAnimationFrame","clear","stopHtmlOpacityAnimations","pending","morph","toCenter","opacityTo","onComplete","stopMorphAnimations","stop","animateLayoutTransition","fromCenters","toLayout","options","toCenters","centers","layoutToCenters","fadeIn","fadeOut","morphBoxes","n","specs","isFadeIn","isFadeOut","move","spec","edgeFadeIn","edgeFadeOut","totalWork","completed","finishOne","leaves","resetEdgeOpacities","onEdgeComplete","duration","easing","animate","complete","remove","animateEdgeOpacityTransitions","nodeEl","fromCenter","isNativeGroupFrame","fromOpacity","toOpacity","isMorphingNativeGroup","positionDone","opacityDone","maybeFinish","shrinking","start","performance","now","fadeOpacity","opacityFrom","undefined","finish","delete","removed","tick","op","requestAnimationFrame","animateNodeBoxMorph","timing","resolveOpacityTiming","fadeInTiming","fadeOutTiming","delay","usesHtml","startAt","eased","animateNodeVisualOpacity","READABLE_ZOOM","layoutContentBBox","fitViewportForBBox","bb","W","H","rawZoom","minZoom","maxZoom","pan","zoom","layoutStore","layoutTimerStore","preExpandStore","structureKeyStore","edgeKey","applyNodeDiff","removeAbsent","targetNodes","targetNodeIds","existing","nonempty","nextParent","currentParent","isChild","removeData","selectable","unselectify","applyElementDiff","targetEdges","applyEdgeDiff","getInnerNodeIds","clearLayoutTimer","window","clearTimeout","scheduleLayoutComplete","onLayoutComplete","timer","setTimeout","syncCyGraph","reprocessData","elements","grabbable","buildElements","anchorGroup","previousLayout","captureCenters","currentStructureKey","nodeIds","expandedIds","JSON","stringify","graphStructureKey","previousStructureKey","orders","meta","pipeline","pipe","step","getMetaPipelineOrder","pipelineOrdersFor","nextLayout","resize","fit","fitZoom","boundingBox","fitGraphViewport","mode","animateFitViewport","workingLayout","expanding","groups","savePreExpandLayout","edgeDiff","expandedGroup","fromEntry","toEntry","getInnerNodeIdsFromLayout","restored","takePreExpandLayout","restoredUsable","sameIdSet","expandedGroupsInLayout","collapsedLayout","layoutInnerIds","collapsed","collapsedBBox","collapseGroupInLayout","groupEle","groupNode","overlayInitStore","overlayLayerStore","overlayPathStore","ARROW_MARKER","ARROW_MARKERS","fill","setAttrIfChanged","element","getAttribute","setAttribute","edgeDashArray","updateOverlayCamera","defs","transformOrigin","mw","mh","marker","ensureOverlayRoot","host","firstElementChild","contains","document","createElement","appendChild","svg","createElementNS","classList","insertBefore","firstChild","arrowPath","syncInternalEdgeOverlay","root","paths","pathStoreFor","seen","edgeEle","path","_private","rscratch","allpts","points","segments","cmd","join","taxiPathFromPoints","midY","edgePathD","hasClass","edgeStroke","edgeWidth","edgeOpacity","edgeArrowMarker","dash","hasAttribute","removeAttribute","initInternalEdgeOverlay","pathFrame","cameraFrame","updatePaths","updateCamera","syncOverlayCameraOnly","on","one","refreshInternalEdgeOverlay","selectedIdsByCy","focusPaintStore","labelObserverStore","selectionStore","setsEqual","every","setHtmlFocusClasses","selected","related","dimmed","toggle","paintHtmlLabels","paint","selectedIds","highlightedIds","computeFocusPaint","collection","union","getSelectedNodes","connectedEdges","highlightedNodes","connectedNodes","edgeRelatedIds","highlightedEdges","commitFocusPaint","muted","toggleClass","removeClass","focused","paintNativeNodesAndEdges","getSelectedNodeIds","setSelectedNodeIds","clearSelectedNodeIds","toggleSelectedNodeId","applyGraphVisualState","clearGraphFocus","MIN_ZOOM","canSelectNode","modelPosFromClient","clientX","clientY","rect","getBoundingClientRect","rendered","resolvePointerTarget","event","fromLabel","closest","content","hit","bestArea","includeLabels","includeOverlays","area","findContentNodeAt","frame","findExpandedFrameAt","isContextMenuTarget","attachGraphInteractions","callbacks","chipScrollStore","ignoreChipScrollMemory","findChipScroller","rememberChipScroll","chipScrollKey","scrollLeft","onChipScroll","addEventListener","restoreFrame","restoreChipScrolls","resolveOverflowChip","resolveNodeFromLabel","handleNodeSelect","multi","isNodeSelected","onOpenInspector","onCloseInspector","bgPress","multiSelectSnapshot","nodePress","nodePan","ignoreNextSelect","selectionFreeze","pressStartedOnOverflow","selectHandledThisGesture","chipDrag","consumeSelectSuppress","armSelectSuppress","restoreFrozenSelection","runSelectOnce","onChipDragMove","startX","moved","scrollNodeId","startScrollLeft","preventDefault","stopPropagation","onChipDragEnd","removeEventListener","drag","ctrlKey","metaKey","onNodePanMove","NODE_PAN_MOVE_PX","onUserInteracted","startPan","onNodePanEnd","selectedAtStart","onDocumentMouseMove","BG_CLEAR_MOVE_PX","endBackgroundPress","button","press","snapshot","releasedOnNode","releasedOnCanvas","downAt","isShortClick","onCloseKeyPopover","onContainerMouseDown","scroller","canScroll","scrollWidth","clientWidth","sbH","offsetHeight","clientHeight","bottom","overflow","formatNodeLabels","labels","containerRect","chipRect","onOpenKeyPopover","openKeyPopoverFromChip","nodeAtDown","onCyNodeTap","original","originalEvent","onContainerClick","onContainerMouseOut","relatedTarget","onDblTapGroup","onToggleGroup","onContainerContextMenu","renderer","hoverData","cxtDragged","suppressUpcomingNativeCxttap","onContextTarget","call","querySelectorAll","display","emit","renderedPosition","queueMicrotask","menu","getComputedStyle","right","openDetails","expand","collapse","onContainerDblClick","onContainerWheel","delta","deltaX","deltaY","raw","normalizedDelta","sign","sqrt","speed","shiftKey","factor","exp","nextZoom","level","boxSelectionEnabled","capture","passive","off","layerStore","initStore","ALIGN","buildAlign","config","halign","valign","halignBox","valignBox","getNodePosition","applyLabelTransform","card","align","valRel","valAbs","toFixed","ensureLayer","canvas","parentNode","zIndex","padding","outline","pointerEvents","updateLayerPanZoom","initHtmlNodeLabels","configs","removeNode","upsertNode","is","query","matchingConfig","html","tpl","dataKey","copy","uiFocused","uiSelected","uiRelated","uiDimmed","htmlLabelOpacity","htmlLabelDataKey","cssClass","removeChild","parsed","DOMParser","parseFromString","body","child","renderLabelHtml","onData","isNode","cfg","storageKey","graphUrl","loadGraphSessionState","sessionStorage","getItem","parse","buildGraphUrl","stageFilter","base","process","joiner","includes","encodeURIComponent","Cytoscape","dagre","contextMenus","labelsInitStore","labelOpacityStyle","initNodeLabels","initHtmlLabelOpacitySync","fullName","isSubgraph","renderName","childCount","fallback","escapeHtml","groupIconSvg","renderKeyChipList","renderLabelChipList","coreClass","primaryKeys","tableType","store_class","tableIconSvg","transformType","transform_type","transformIconSvg","observer","MutationObserver","mutations","mutation","addedNodes","observe","childList","subtree","disconnect","initHtmlLabelInteractionStateSync","runSteps","refreshIntervalMs","pipelineId","pipelineIdProp","graphRefreshToken","navigate","useNavigate","loading","setLoading","useState","showInitialSpin","setShowInitialSpin","initialLoadRef","useRef","setCy","alertMsg","setAlertMsg","expandedGroups","setExpandedGroups","saved","rawGraph","setRawGraph","setPipelineId","keyPopover","setKeyPopover","setInspector","inspectorMaxWidth","useMemo","scaleRaw","documentElement","getPropertyValue","scale","parseFloat","round","innerWidth","panelWidth","panelDragging","onPanelResize","useResizableWidth","initial","savedSessionRef","sessionRestoredRef","firstMountRef","needFitRef","userInteractedRef","loadedUrlRef","stageInitKeyRef","anchorGroupRef","expandingRef","pipelineIdRef","s","step_name","status","runStatusRef","applySessionRestore","useCallback","cyInstance","userInteracted","selectedNodeIds","inspectorNodeId","setKeyPopoverRef","setInspectorRef","useEffect","opsApi","then","c","pipeline_id","catch","persistGraphSession","_stageFilter","setItem","saveGraphSessionState","captureGraphSessionState","toggleGroupExpand","groupName","openNodeDetails","pid","message","nodeType","openNodeDetailsRef","toggleGroupExpandRef","contextTargetRef","isFirstMount","hasExpanded","initKey","cancelled","async","loadGraph","response","apiFetch","ok","Error","json","error","getApiErrorMessage","setInterval","clearInterval","trigger","refreshNodeLabelPositions","failed","applyFailedEdgeStyles","ResizeObserver","lastW","lastH","menuItems","onClickFunction","onKeyDown","onPointerDown","handleZoomIn","handleZoomOut","handleResetZoom","handleFit","navigateToInspectorNode","fallbackData","fillParent","minHeight","closable","afterClose","spinning","dangerouslySetInnerHTML","__html","slidersHorizontalIconSvg","autoungrabify","wheelSensitivity"],"sourceRoot":""} \ No newline at end of file diff --git a/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/main.686c4cfa.js b/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/main.686c4cfa.js new file mode 100644 index 000000000..fecff974d --- /dev/null +++ b/libs/datapipe-ui-ml/datapipe_ui_ml/static/static/js/main.686c4cfa.js @@ -0,0 +1,3 @@ +/*! For license information please see main.686c4cfa.js.LICENSE.txt */ +(()=>{var e={8455:(e,t,n)=>{"use strict";n.d(t,{Bi:()=>i,NH:()=>o.NH});var r=n(3028),o=n(7873),a=n(7376);const i=(0,r.Z)((0,r.Z)({},o.e_),(0,a.to)())},3682:(e,t,n)=>{"use strict";n.d(t,{B8:()=>c,Cn:()=>u,S5:()=>l,bZ:()=>s,c6:()=>d});var r=n(4428);const o={NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0}.REACT_APP_GET_GRAPH_URL||"/api/v1alpha3/graph",a=o.replace(/\/graph$/,"");async function i(e){const t=await(0,r.SC)(e);if(!t.ok){const n=await(0,r.vu)(t);throw new r.MS("http","API error (".concat(t.status,"): ").concat(n),{status:t.status,url:e})}return t.json()}async function l(e){return i(e?"".concat(o,"?stage=").concat(encodeURIComponent(e)):o)}async function c(e){const t="".concat(a,"/tables/").concat(encodeURIComponent(e),"/size");return(await i(t)).size}async function s(e){const t="".concat(a,"/transforms/").concat(encodeURIComponent(e),"/meta-size");return(await i(t)).size}function u(){const e=localStorage.getItem("datapipe_table_page_size"),t=e?parseInt(e,10):5;return Number.isFinite(t)&&t>0?t:5}function d(e){localStorage.setItem("datapipe_table_page_size",String(e))}},4428:(e,t,n)=>{"use strict";n.d(t,{MS:()=>r,SC:()=>s,iC:()=>l,tD:()=>c,tS:()=>o,vu:()=>u});class r extends Error{constructor(e,t,n){var r;super(t),this.kind=void 0,this.status=void 0,this.url=void 0,this.code=void 0,this.details=void 0,this.name="ApiError",this.kind=e,this.status=null===n||void 0===n?void 0:n.status,this.url=null===n||void 0===n?void 0:n.url,this.code=null!==(r=null===n||void 0===n?void 0:n.code)&&void 0!==r?r:null,this.details=null===n||void 0===n?void 0:n.details}toString(){return this.message}}function o(){const e="undefined"!==typeof globalThis?globalThis.navigator:void 0;return void 0!==e&&!1===e.onLine}function a(e){return/failed to fetch|load failed|networkerror|network request failed/i.test(e)}function i(e,t){if(e instanceof r)return e;if(o())return new r("offline","You are offline. Check your network connection and try again.",{url:t,cause:e});const n=e instanceof Error?e.message:String(e);return e instanceof TypeError&&a(n)||a(n)?new r("network",function(e){const t=e?" (".concat(e,")"):"";return"Cannot reach the Datapipe API".concat(t,". The server may be stopped or unreachable. Start it with: uv run datapipe --pipeline app:app api")}(t),{url:t,cause:e}):new r("unknown",n||"Request failed",{url:t,cause:e})}function l(e){return i(e).message}function c(e){const t=e instanceof r?e:i(e);return"offline"===t.kind?"Reconnect to the network, then reload the page.":"network"===t.kind?"Open the Ops UI from the same host/port as the API (for example http://localhost:8001) and confirm the process is still running.":"http"===t.kind&&502===t.status?"The API proxy received a bad response. The Datapipe process may have crashed.":void 0}async function s(e,t){const n="string"===typeof e?e:e instanceof URL?e.href:e instanceof Request?e.url:void 0;if(o())throw new r("offline","You are offline. Check your network connection and try again.",{url:n});try{return await fetch(e,t)}catch(a){throw i(a,n)}}async function u(e){const t=await e.text();if(!t)return e.statusText||"HTTP ".concat(e.status);try{const e=JSON.parse(t);if("string"===typeof e.detail)return e.detail;if(Array.isArray(e.detail))return e.detail.map((e=>"string"===typeof e?e:JSON.stringify(e))).join("; ");if("string"===typeof e.message)return e.message}catch(n){}return t}},7873:(e,t,n)=>{"use strict";n.d(t,{L7:()=>a,MS:()=>r.MS,NH:()=>c,e_:()=>l,rd:()=>o});var r=n(4428);async function o(e,t){var n,o;const a="".concat("/api/v1alpha3").concat(e),i=await(0,r.SC)(a,t);if(!i.ok)throw await async function(e,t){var n,o;let a=null,i="";try{i=await e.text(),a=i?JSON.parse(i):null}catch(s){a=null}const l=null===(n=a)||void 0===n?void 0:n.error;if(l&&"object"===typeof l){const n="string"===typeof l.code?l.code:null,o="string"===typeof l.message&&l.message?l.message:"API error (".concat(e.status,")");return new r.MS("http",o,{status:e.status,url:t,code:n,details:l.details})}let c=null;return a&&("string"===typeof a.detail?c=a.detail:Array.isArray(a.detail)?c=a.detail.map((e=>"string"===typeof e?e:JSON.stringify(e))).join("; "):"string"===typeof a.message&&(c=a.message)),null===c&&(c=i||e.statusText||"HTTP ".concat(e.status)),new r.MS("http","API error (".concat(e.status,"): ").concat(c),{status:e.status,url:t,code:null,details:null!==(o=a)&&void 0!==o?o:void 0})}(i,a);if(204!==i.status&&"0"!==(null===(n=i.headers)||void 0===n||null===(o=n.get)||void 0===o?void 0:o.call(n,"content-length")))return i.json()}function a(e){const t=new URLSearchParams;Object.entries(e).forEach((e=>{let[n,r]=e;if(void 0!==r&&""!==r&&null!==r)if("filters"!==n)Array.isArray(r)?r.forEach((e=>t.append(n,String(e)))):t.set(n,String(r));else{const e=Array.isArray(r)?r:[];e.length&&t.set("filters",JSON.stringify(e))}}));const n=t.toString();return n?"?".concat(n):""}async function i(e,t){const n=await o("/pipelines/".concat(encodeURIComponent(e))),r=n.stages.find((e=>e.stage===t));if(!r)return{pipeline_id:e,stage:t,recent_runs:[]};const a=new Set(r.steps.map((e=>e.name)).filter((e=>Boolean(e))));if(!a.size)return{pipeline_id:e,stage:t,recent_runs:[]};const i=[];for(const l of n.recent_runs){(await o("/runs/".concat(l.run_id))).steps.some((e=>a.has(e.step_name)))&&i.push(l)}return{pipeline_id:e,stage:t,recent_runs:i}}const l={getCapabilities:()=>o("/capabilities"),getSettings:()=>o("/settings"),getPipeline:e=>o("/pipelines/".concat(e)),getStageRecentRuns:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10;return o("/pipelines/".concat(encodeURIComponent(e),"/stages/").concat(encodeURIComponent(t),"/recent-runs?limit=").concat(n))},resolveStageRecentRuns:async function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10;try{return await o("/pipelines/".concat(encodeURIComponent(e),"/stages/").concat(encodeURIComponent(t),"/recent-runs?limit=").concat(n))}catch(r){const n=String(r);if(!n.includes("404")&&!n.includes("Not Found"))throw r;return i(e,t)}},getRun:e=>o("/runs/".concat(e)),getRuns:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return o("/runs".concat(a(e)))},getRunLogs:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:200;return o("/runs/".concat(e,"/logs?after=").concat(t,"&limit=").concat(n))},startRun:function(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return o("/runs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({labels:e||[],background:t})})},stopRun:e=>o("/runs/".concat(encodeURIComponent(e),"/stop"),{method:"POST"}),resetTransformMetadata:(e,t)=>o("/pipelines/".concat(encodeURIComponent(e),"/transforms/").concat(encodeURIComponent(t),"/reset-metadata"),{method:"POST"})};function c(){const e=localStorage.getItem("datapipe_ops_refresh_s"),t=e?parseInt(e,10):30;return 1e3*(Number.isFinite(t)?t:30)}},7441:(e,t,n)=>{"use strict";n.d(t,{G3:()=>w});var r=n(969),o=n(9717),a=n(6822),i=n(3682),l=n(2481),c=n(7411),s=n(1449),u=n(7574);function d(e){let{title:t,count:n,children:r}=e;return(0,u.jsxs)("section",{className:"inspector-section",children:[(0,u.jsxs)("div",{className:"inspector-section-title",children:[(0,u.jsx)("span",{children:t}),n?(0,u.jsx)("span",{className:"inspector-section-count",children:n}):null]}),r]})}function f(e){let{kind:t,keys:n}=e;return n.length?(0,u.jsx)("div",{className:"inspector-chip-list",children:n.map((e=>(0,u.jsx)("span",{className:"node-key-chip ".concat(t),children:e},e)))}):(0,u.jsxs)("span",{style:{color:"#667085",fontSize:12},children:["No ","label"===t?"labels":"keys"]})}function p(e){let{schema:t,primaryKeys:n}=e;if(!t.length)return null;const r=new Set(n);return(0,u.jsx)(d,{title:"Columns",count:"".concat(t.length," columns"),children:(0,u.jsxs)("table",{className:"inspector-io-table inspector-schema-table",children:[(0,u.jsx)("thead",{children:(0,u.jsxs)("tr",{children:[(0,u.jsx)("th",{children:"Column"}),(0,u.jsx)("th",{children:"Type"})]})}),(0,u.jsx)("tbody",{children:t.map((e=>{const t=r.has(e.name);return(0,u.jsxs)("tr",{className:t?"inspector-schema-pk-row":void 0,children:[(0,u.jsx)("td",{children:(0,u.jsxs)("span",{className:"inspector-schema-column-name",children:[e.name,t?(0,u.jsx)("span",{className:"node-key-chip pk",children:"PK"}):null]})}),(0,u.jsx)("td",{children:(0,u.jsx)("code",{className:"inspector-schema-type",children:e.type})})]},e.name)}))})]})})}function h(e,t){var n;return e?"pk"===t?null!==(n=e.indexes)&&void 0!==n?n:[]:(0,s.R4)(e):[]}function v(e){let{nodeId:t,node:n,pipelineId:r,onNavigate:o}=e;const i=null!==n&&void 0!==n&&n.name?String(n.name):t;return o&&function(e){if(!e)return!1;const t=e.type;return"table"===t||"transform"===t||"group"===t}(n)?(0,u.jsx)("button",{type:"button",className:"inspector-node-link",title:"Show ".concat(i," in graph"),onClick:()=>o(t),children:i}):r&&"table"===(null===n||void 0===n?void 0:n.type)?(0,u.jsx)(a.rU,{to:"/pipelines/".concat(encodeURIComponent(r),"/tables/").concat(encodeURIComponent(t)),children:i}):r&&"transform"===(null===n||void 0===n?void 0:n.type)?(0,u.jsx)(a.rU,{to:"/pipelines/".concat(encodeURIComponent(r),"/transforms/").concat(encodeURIComponent(t)),children:i}):(0,u.jsx)(u.Fragment,{children:i})}function m(e){let{kicker:t,title:n,icon:r,onClose:a,onOpenDetails:i}=e;return(0,u.jsxs)("div",{className:"node-inspector-panel-header",children:[(0,u.jsxs)("div",{className:"inspector-header",children:[r,(0,u.jsxs)("div",{children:[(0,u.jsx)("div",{className:"inspector-kicker",children:t}),(0,u.jsx)("div",{className:"inspector-title",children:n})]})]}),(0,u.jsxs)("div",{className:"inspector-header-actions",children:[i?(0,u.jsx)(o.Z,{size:"small",type:"primary",onClick:i,children:"Open details"}):null,a?(0,u.jsx)("button",{type:"button",className:"node-inspector-close","aria-label":"Clear selection",title:"Clear selection",onClick:a,children:"\xd7"}):null]})]})}function g(e){let{table:t,knownRowCount:n,pipelineId:r,initialColumnFilter:o}=e;return(0,u.jsx)(d,{title:"Table data",children:(0,u.jsx)(l.H,{table:t,knownRowCount:n,pipelineId:r,initialColumnFilter:o})})}function y(e){var t,n;let{node:o,onClose:a,onOpenDetails:l,showTableData:s=!0,showHeader:h=!0,pipelineId:v,initialColumnFilter:y}=e;const b=null!==(t=o.indexes)&&void 0!==t?t:[],x=o.store_class?String(o.store_class):"TableStoreDB",w=String(o.name),k=(null!==(n=o.schema)&&void 0!==n?n:[]).filter((e=>(null===e||void 0===e?void 0:e.name)&&(null===e||void 0===e?void 0:e.type))),[C,S]=r.useState(null!=o.size?Number(o.size):null),[E,j]=r.useState(!1),[O,_]=r.useState(null),N={id:w,indexes:b,size:C,store_class:x,schema:k,type:"table"};return(0,u.jsxs)(u.Fragment,{children:[h?(0,u.jsx)(m,{kicker:"Table",title:w,onClose:a,onOpenDetails:l}):null,(0,u.jsxs)("div",{className:"node-inspector-panel-body",children:[(0,u.jsx)(d,{title:"Summary",children:(0,u.jsxs)("dl",{className:"inspector-kv",children:[(0,u.jsx)("dt",{children:"Type"}),(0,u.jsx)("dd",{children:x}),(0,u.jsx)("dt",{children:"Size"}),(0,u.jsx)("dd",{children:(0,u.jsx)(c.o,{size:C,loading:E,onCount:()=>{j(!0),_(null),(0,i.B8)(w).then(S).catch((e=>_(String(e)))).finally((()=>j(!1)))}})}),O?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{}),(0,u.jsx)("dd",{style:{color:"#ff4d4f"},children:O})]}):null,o.metaGroup?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Group"}),(0,u.jsx)("dd",{children:String(o.metaGroup)})]}):null]})}),(0,u.jsx)(p,{schema:k,primaryKeys:b}),(0,u.jsx)(d,{title:"Primary keys (PK)",count:"".concat(b.length," keys"),children:(0,u.jsx)(f,{kind:"pk",keys:b})}),s&&(0,u.jsx)(g,{table:N,knownRowCount:C,pipelineId:v,initialColumnFilter:y})]})]})}function b(e){var t,n,o,a;let{node:p,graphNodesById:g,runStatus:y,pipelineId:b,onClose:x,onOpenDetails:w,onNavigateToNode:k,showMetaTable:C=!0,showHeader:S=!0}=e;const E=String(p.name),j=(0,s.R4)(p),O=(null!==(t=p.inputs)&&void 0!==t?t:[]).map((e=>({id:e,node:null===g||void 0===g?void 0:g.get(e)}))),_=(null!==(n=p.outputs)&&void 0!==n?n:[]).map((e=>({id:e,node:null===g||void 0===g?void 0:g.get(e)}))),N=(0,s.Ts)(null!==(o=p.labels)&&void 0!==o?o:[]),P=!0===p.has_transform_meta||null!=p.total_idx_count||null!=p.changed_idx_count,[Z,M]=r.useState(null),[T,I]=r.useState(!1),[A,R]=r.useState(null),D={id:E,indexes:null!==(a=p.indexes)&&void 0!==a?a:[],size:Z,store_class:p.transform_type?String(p.transform_type):"transform",type:"transform"};return(0,u.jsxs)(u.Fragment,{children:[S?(0,u.jsx)(m,{kicker:"Transform Step",title:E,icon:(0,u.jsx)("span",{className:"node-transform-f-icon",children:"f"}),onClose:x,onOpenDetails:w}):null,(0,u.jsxs)("div",{className:"node-inspector-panel-body",children:[(0,u.jsx)(d,{title:"Summary",children:(0,u.jsxs)("dl",{className:"inspector-kv",children:[(0,u.jsx)("dt",{children:"Type"}),(0,u.jsx)("dd",{children:p.transform_type?String(p.transform_type):"TransformStep"}),(0,u.jsx)("dt",{children:"ID"}),(0,u.jsx)("dd",{children:E}),p.metaGroup?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Group"}),(0,u.jsx)("dd",{children:String(p.metaGroup)})]}):null,y?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Status"}),(0,u.jsx)("dd",{children:y})]}):null]})}),(0,u.jsx)(d,{title:"Transform Primary Keys (TPK)",count:"".concat(j.length," keys"),children:(0,u.jsx)(f,{kind:"tpk",keys:j})}),N.length>0&&(0,u.jsx)(d,{title:"Labels",count:"".concat(N.length," labels"),children:(0,u.jsx)(f,{kind:"label",keys:N})}),(0,u.jsx)(d,{title:"Inputs",count:"".concat(O.length," input").concat(1===O.length?"":"s"),children:(0,u.jsxs)("table",{className:"inspector-io-table",children:[(0,u.jsx)("thead",{children:(0,u.jsxs)("tr",{children:[(0,u.jsx)("th",{children:"Source"}),(0,u.jsx)("th",{children:"Type"}),(0,u.jsx)("th",{children:"Keys"})]})}),(0,u.jsx)("tbody",{children:O.map((e=>{var t;let{id:n,node:r}=e;return(0,u.jsxs)("tr",{children:[(0,u.jsx)("td",{children:(0,u.jsx)(v,{nodeId:n,node:r,pipelineId:b,onNavigate:k})}),(0,u.jsx)("td",{children:"table"===(null===r||void 0===r?void 0:r.type)?"Table":null!==(t=null===r||void 0===r?void 0:r.type)&&void 0!==t?t:"\u2014"}),(0,u.jsx)("td",{children:(0,u.jsx)(f,{kind:"table"===(null===r||void 0===r?void 0:r.type)?"pk":"tpk",keys:h(r,"table"===(null===r||void 0===r?void 0:r.type)?"pk":"tpk")})})]},n)}))})]})}),(0,u.jsx)(d,{title:"Outputs",count:"".concat(_.length," output").concat(1===_.length?"":"s"),children:(0,u.jsxs)("table",{className:"inspector-io-table",children:[(0,u.jsx)("thead",{children:(0,u.jsxs)("tr",{children:[(0,u.jsx)("th",{children:"Destination"}),(0,u.jsx)("th",{children:"Type"}),(0,u.jsx)("th",{children:"Keys"})]})}),(0,u.jsx)("tbody",{children:_.map((e=>{var t;let{id:n,node:r}=e;return(0,u.jsxs)("tr",{children:[(0,u.jsx)("td",{children:(0,u.jsx)(v,{nodeId:n,node:r,pipelineId:b,onNavigate:k})}),(0,u.jsx)("td",{children:"table"===(null===r||void 0===r?void 0:r.type)?"Table":null!==(t=null===r||void 0===r?void 0:r.type)&&void 0!==t?t:"\u2014"}),(0,u.jsx)("td",{children:(0,u.jsx)(f,{kind:"table"===(null===r||void 0===r?void 0:r.type)?"pk":"tpk",keys:h(r,"table"===(null===r||void 0===r?void 0:r.type)?"pk":"tpk")})})]},n)}))})]})}),C&&P&&(0,u.jsxs)(d,{title:"Transform meta table",children:[(0,u.jsxs)("div",{style:{marginBottom:12},children:[(0,u.jsx)(c.o,{size:Z,loading:T,onCount:()=>{I(!0),R(null),(0,i.bZ)(E).then(M).catch((e=>R(String(e)))).finally((()=>I(!1)))}}),A?(0,u.jsx)("div",{style:{color:"#ff4d4f",marginTop:8},children:A}):null]}),(0,u.jsx)(l.H,{table:D,knownRowCount:Z,hideRunStep:!0})]})]})]})}function x(e){var t,n,o,i,l;let{node:c,graphNodesById:p,pipelineId:h,onClose:g,onOpenDetails:y,onNavigateToNode:b,subSteps:x,showHeader:w=!0}=e;const k=null!==(t=null!==(n=c.child_count)&&void 0!==n?n:null===x||void 0===x?void 0:x.length)&&void 0!==t?t:0,C=(0,s.R4)(c),S=null!==(o=c.inputs)&&void 0!==o?o:[],E=null!==(i=c.outputs)&&void 0!==i?i:[],j=(0,s.Ts)(null!==(l=c.labels)&&void 0!==l?l:[]);return(0,u.jsxs)(u.Fragment,{children:[w?(0,u.jsx)(m,{kicker:"Group Step",title:String(c.name),onClose:g,onOpenDetails:y}):null,(0,u.jsxs)("div",{className:"node-inspector-panel-body",children:[(0,u.jsx)(d,{title:"Summary",children:(0,u.jsxs)("dl",{className:"inspector-kv",children:[(0,u.jsx)("dt",{children:"Steps"}),(0,u.jsx)("dd",{children:k}),(0,u.jsx)("dt",{children:"Type"}),(0,u.jsx)("dd",{children:c.transform_type?String(c.transform_type):"Group"})]})}),C.length>0&&(0,u.jsx)(d,{title:"Transform Primary Keys (TPK)",count:"".concat(C.length," keys"),children:(0,u.jsx)(f,{kind:"tpk",keys:C})}),j.length>0&&(0,u.jsx)(d,{title:"Labels",count:"".concat(j.length," labels"),children:(0,u.jsx)(f,{kind:"label",keys:j})}),(S.length>0||E.length>0)&&(0,u.jsx)(d,{title:"Connections",children:(0,u.jsxs)("dl",{className:"inspector-kv",children:[S.length>0&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Inputs"}),(0,u.jsx)("dd",{className:"inspector-link-list",children:S.map(((e,t)=>(0,u.jsxs)(r.Fragment,{children:[t>0?", ":null,(0,u.jsx)(v,{nodeId:e,node:null===p||void 0===p?void 0:p.get(e),pipelineId:h,onNavigate:b})]},e)))})]}),E.length>0&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Outputs"}),(0,u.jsx)("dd",{className:"inspector-link-list",children:E.map(((e,t)=>(0,u.jsxs)(r.Fragment,{children:[t>0?", ":null,(0,u.jsx)(v,{nodeId:e,node:null===p||void 0===p?void 0:p.get(e),pipelineId:h,onNavigate:b})]},e)))})]})]})}),x&&x.length>0&&(0,u.jsx)(d,{title:"Sub-steps",count:"".concat(x.length," steps"),children:(0,u.jsx)("ul",{className:"inspector-substep-list",children:x.map((e=>(0,u.jsxs)("li",{children:["transform"===e.type&&h?(0,u.jsx)(a.rU,{to:"/pipelines/".concat(encodeURIComponent(h),"/transforms/").concat(encodeURIComponent(e.name)),children:e.name}):(0,u.jsx)("span",{children:e.name}),e.transform_type?(0,u.jsx)("span",{className:"node-key-chip label",style:{marginLeft:8},children:e.transform_type}):null]},e.name)))})})]})]})}function w(e){let{node:t,graphNodesById:n,runStatus:r,pipelineId:o,onClose:a,onOpenDetails:i,onNavigateToNode:l,subSteps:c,showTableData:s=!0,showMetaTable:d=!0,showHeader:f=!0,initialColumnFilter:p}=e;const h=t.type;return"table"===h?(0,u.jsx)(y,{node:t,pipelineId:o,onClose:a,onOpenDetails:i,showTableData:s,showHeader:f,initialColumnFilter:p}):"transform"===h?(0,u.jsx)(b,{node:t,graphNodesById:n,runStatus:r,pipelineId:o,onClose:a,onOpenDetails:i,onNavigateToNode:l,showMetaTable:d,showHeader:f}):"group"===h?(0,u.jsx)(x,{node:t,graphNodesById:n,pipelineId:o,onClose:a,onOpenDetails:i,onNavigateToNode:l,subSteps:c,showHeader:f}):null}},5299:(e,t,n)=>{"use strict";n.d(t,{Q4:()=>s,jA:()=>a,lX:()=>l,m5:()=>i,pb:()=>c});const r='viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"',o='viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"',a="'),i='',l="'),c="'),s=("'),"'))},1449:(e,t,n)=>{"use strict";function r(e){var t,n,r,o;return null!==(t=null!==(n=null!==(r=null!==(o=e.transform_primary_keys)&&void 0!==o?o:e.tpk)&&void 0!==r?r:e.indexes)&&void 0!==n?n:e.primary_keys)&&void 0!==t?t:[]}function o(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function a(e){return null!==e&&void 0!==e&&e.length?e.map((e=>{let[t,n]=e;return"".concat(t,"=").concat(n)})):[]}function i(e,t,n){if(!n.length)return"";const r="pk"===t?"PK":"tpk"===t?"TPK":"Labels",a=n.map((e=>'\n \n ').concat(o(e),"\n \n "))).join("");return'\n
\n ').concat(r,'\n \n ').concat(a,"\n \n
\n ")}function l(e,t){return i(e,"label",a(t))}n.d(t,{R4:()=>r,Ts:()=>a,Wz:()=>l,Xv:()=>o,l4:()=>i})},2431:(e,t,n)=>{"use strict";n.d(t,{u:()=>w});var r=n(2159),o=n(3028);const a=["metaGroup"];function i(e,t,n){if(e)return"".concat(e,".").concat(t,".").concat(String(n).padStart(4,"0"))}function l(e,t,n){if(!t)return!1;const r=null===e||void 0===e?void 0:e.pipelineOrderKey,o=null===e||void 0===e?void 0:e.tableOrderSource;return!r||("producer"===n&&"producer"!==o||("consumer"!==n||"producer"!==o)&&t.localeCompare(r)<0)}function c(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=null;for(const o of Array.from(e))if(o.source===t&&o.target===n){a=o;break}if(a){if(a.sequential)return;return e.delete(a),void e.add((0,o.Z)((0,o.Z)({},a),{},{sequential:!0},r))}e.add((0,o.Z)({source:t,target:n,sequential:!0,synthetic:!0},r))}function s(e){return"transform"===e||"group"===e}function u(e,t,n,r){let o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const a=[];n.forEach((t=>{var n;if("meta"===t.type&&r.has(t.name))return;s(null===(n=e.get(t.name))||void 0===n?void 0:n.type)&&a.push(t.name)}));for(let i=0;i6&&void 0!==arguments[6]?arguments[6]:"consumer";const s=t.catalog[n];if(!s)return;const u=e.get(n),d=l(u,i,c)?{pipelineIndex:a,pipelineOrderKey:i,tableOrderSource:c}:{};e.set(n,(0,o.Z)((0,o.Z)((0,o.Z)((0,o.Z)({},u),s),{},{type:"table",name:n},d),r?{metaGroup:r}:{}))}function f(e,t,n,r,a,l,c){var s,u,f,p;const h=r.name;e.set(h,(0,o.Z)((0,o.Z)((0,o.Z)((0,o.Z)({},r),{},{type:"transform",name:h,transform_primary_keys:null!==(s=null!==(u=null!==(f=null!==(p=r.transform_primary_keys)&&void 0!==p?p:r.tpk)&&void 0!==f?f:r.indexes)&&void 0!==u?u:r.primary_keys)&&void 0!==s?s:[]},a?{metaGroup:a}:{}),null!=l?{pipelineIndex:l}:{}),c?{pipelineOrderKey:c}:{})),(r.inputs||[]).forEach(((r,o)=>{d(e,n,r,a,l,i(c,"in",o),"consumer"),t.add({source:r,target:h})})),(r.outputs||[]).forEach(((r,o)=>{d(e,n,r,a,l,i(c,"out",o),"producer"),t.add({source:h,target:r})}))}function p(e,t,n,r,a,l){var c,s,u,f,p;const h=null!==(c=null===(s=r.graph)||void 0===s||null===(u=s.pipeline)||void 0===u?void 0:u.length)&&void 0!==c?c:0;e.set(r.name,(0,o.Z)((0,o.Z)({type:"group",name:r.name,transform_type:r.transform_type||r.name,labels:r.labels,collapsed:!0,child_count:h,inputs:r.inputs||[],outputs:r.outputs||[],transform_primary_keys:null!==(f=null!==(p=r.transform_primary_keys)&&void 0!==p?p:r.tpk)&&void 0!==f?f:[]},null!=a?{pipelineIndex:a}:{}),l?{pipelineOrderKey:l}:{})),(r.inputs||[]).forEach(((o,c)=>{d(e,n,o,void 0,a,i(l,"in",c),"consumer"),t.add({source:o,target:r.name})})),(r.outputs||[]).forEach(((o,c)=>{d(e,n,o,void 0,a,i(l,"out",c),"producer"),t.add({source:r.name,target:o})}))}function h(e,t,n,r,o,a){n.pipeline.forEach(((i,l)=>{const c="".concat(a,".").concat(String(l).padStart(4,"0"));"meta"!==i.type?f(e,t,n,i,o,l,c):r.has(i.name)?(h(e,t,i.graph,r,i.name,c),i.graph.pipeline.forEach(((n,r)=>{if("meta"!==n.type){const o="".concat(c,".").concat(String(r).padStart(4,"0"));f(e,t,i.graph,n,i.name,r,o)}}))):p(e,t,i.graph,i,l,c)}))}function v(e,t,n,r){n.pipeline.forEach(((o,a)=>{const i=String(a).padStart(4,"0");"meta"===o.type?r.has(o.name)?h(e,t,o.graph,r,o.name,i):p(e,t,n,o,a,i):f(e,t,n,o,void 0,a,i)}))}function m(e,t){const n=new Set;t.forEach((e=>{e.source&&n.add(e.source),e.target&&n.add(e.target)})),Array.from(e.entries()).forEach((t=>{let[r,o]=t;"table"!==o.type||n.has(r)||e.delete(r)}))}function g(e,t){for(const n of e){if("meta"===n.type&&n.name===t)return n;if("meta"===n.type){const e=g(n.graph.pipeline,t);if(e)return e}}}function y(e,t,n,o){Array.from(n).forEach((n=>{var i,l;const c=new Set;if(e.forEach(((e,t)=>{e.metaGroup===n&&c.add(t)})),!c.size)return;const s=g(o.pipeline,n),u=new Set(null!==(i=null===s||void 0===s?void 0:s.inputs)&&void 0!==i?i:[]),d=new Set(null!==(l=null===s||void 0===s?void 0:s.outputs)&&void 0!==l?l:[]),f=new Set;t.forEach((e=>{const t=e.source,n=e.target,r=c.has(t),o=c.has(n);r!==o&&(r&&f.add(t),o&&f.add(n))})),u.forEach((e=>{c.has(e)&&f.add(e)})),d.forEach((e=>{if(!c.has(e))return;if(f.has(e))return;const n=Array.from(t).some((t=>t.target===e&&c.has(t.source))),r=Array.from(t).some((t=>t.source===e&&c.has(t.target)));n&&r||f.add(e)}));let p=0;c.forEach((t=>{const n=e.get(t);if(n)if("table"===n.type&&f.has(t)){const{metaGroup:o}=n,i=(0,r.Z)(n,a);e.set(t,i)}else p+=1})),p>0&&e.set(n,{id:n,type:"group-expanded",name:n,child_count:p,frameLabel:"".concat(n," \xb7 ").concat(p," step").concat(1===p?"":"s")})}))}function b(e,t,n,r){u(e,t,n.pipeline,r),r.forEach((o=>{const a=g(n.pipeline,o);a&&u(e,t,a.graph.pipeline,r,{internalMeta:o})}))}function x(e,t){const n=new Set;return t.forEach((t=>{var r,a;const i=null===(r=e.get(t.source))||void 0===r?void 0:r.metaGroup,l=null===(a=e.get(t.target))||void 0===a?void 0:a.metaGroup;i&&i===l?n.add((0,o.Z)((0,o.Z)({},t),{},{internalMeta:i})):n.add(t)})),n}function w(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Set;const n=new Map,r=new Set;v(n,r,e,t),m(n,r),y(n,r,t,e),b(n,r,e,t);const o=x(n,r);return{nodes:n,edges:o}}},2481:(e,t,n)=>{"use strict";n.d(t,{H:()=>E});var r=n(969),o=n(2085),a=n(3028),i=n(3831),l=n(9717),c=n(1824),s=n(6431),u=n(9673),d=n(41),f=n(3682),p=n(7376),h=n(7574);const v={NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0}.REACT_APP_GET_TABLE_URL||"/api/v1alpha3/get-table-data",m={NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0}.REACT_APP_GET_TRANSFORM_URL||"/api/v1alpha3/get-transform-data",g={NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0}.REACT_APP_WEBSOCKET_URL||"/api/v1alpha3/ws/transform/";function y(e){if(e)for(const[t,n]of Object.entries(e))if(("frozen_dataset_id"===t||t.endsWith("_frozen_dataset_id"))&&"string"===typeof n&&n)return n}const b=e=>{let{transform:t,setAlertMsg:n,tableFocus:o,setDataIsProcessed:a}=e;const[c,s]=(0,r.useState)({status:void 0,processed:0,total:100}),[u,d]=(0,r.useState)(null);return(0,r.useEffect)((()=>{const e=new WebSocket("".concat(g).concat(t,"/run-status"));return d(e),e.onopen=()=>{},e.onmessage=e=>{const t=JSON.parse(e.data);let r,o=0,i=0;if("not found"===t.status||"not allowed"===t.status)return void n({type:"warning",message:t.status});"running"===t.status?(r="active",o=t.processed,i=t.total):"finished"===t.status&&(o=t.processed,i=t.total,r="success",a(!0));s({status:r,processed:o,total:i})},e.onerror=e=>{const t={status:"exception",processed:c.processed,total:c.total};s(t),console.error("WebSocket error:",e)},e.onclose=()=>{console.log("WebSocket closed")},()=>{e.close()}}),[t]),(0,h.jsxs)(h.Fragment,{children:[("active"===c.status||"success"===c.status)&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{children:["Total: ",c.total]}),(0,h.jsxs)("div",{children:["Processed: ",c.processed]}),(0,h.jsx)(i.Z,{status:c.status,percent:Math.round(100*c.processed/c.total),size:"small"})]}),(0,h.jsx)(l.Z,{type:"primary",onClick:()=>{const e={transform:t,operation:"run-step",filters:(null===o||void 0===o?void 0:o.indexes)||null};u&&u.send(JSON.stringify(e))},children:"Run Step"})]})},x=e=>{let{searchInput:t,column:n,selectedKeys:r,colValue:o,setSelectedKeys:a,confirm:i,clearFilters:u}=e;return(0,h.jsxs)("div",{style:{padding:8},children:[(0,h.jsx)(c.Z,{ref:t,placeholder:"Search ".concat(n),value:r[0],onChange:e=>{switch(typeof o){case"number":case"string":a(e.target.value?[e.target.value]:[])}},onPressEnter:()=>i(),style:{marginBottom:8,display:"block"}}),(0,h.jsxs)(s.Z,{children:[(0,h.jsx)(l.Z,{type:"primary",onClick:()=>i(),size:"small",style:{width:90},children:"Search"}),(0,h.jsx)(l.Z,{onClick:()=>{u&&(e=>{e()})(u),i()},size:"small",style:{width:90},children:"Reset"})]})]})},w=e=>{var t,n;let{tableFocus:o}=e;const[a,i]=(0,r.useState)(!1),[c,s]=(0,r.useState)(5);if(!o)return null;return(0,h.jsxs)("div",{style:{margin:"8px"},children:[(o.indexes||[]).slice(0,a?null===(t=o.indexes)||void 0===t?void 0:t.length:c).map(((e,t)=>(0,h.jsx)("div",{children:Object.entries(e).map(((e,t)=>{let[n,r]=e;return(0,h.jsxs)("span",{children:[(0,h.jsx)("strong",{children:n}),"=",(0,h.jsx)("strong",{children:r}),"\xa0"]},t)}))},t))),(null===(n=o.indexes)||void 0===n?void 0:n.length)&&(0,h.jsx)(l.Z,{size:"small",type:"primary",onClick:()=>{i(!a),s(a?5:o.indexes.length)},children:a?"Show Less":"Show All"})]})},k=async(e,t,n,r,o,i,l,c,s,u,d)=>{var f,g,b,w,k,C;const S=null!==(g=(c=null!==(f=c)&&void 0!==f?f:{}).page)&&void 0!==g?g:1,E=c.pageSize,j=c.overFocus,O=c.filters;let _;t(!0);const N=null===j?null:null!==j&&void 0!==j?j:s,P={table:i.id,page:S-1,page_size:E||l.pageSize,order_by:c.orderBy,order:c.order,include_total:!1};if(N&&N.table_name!==i.id&&(P.focus={table_name:N.table_name,items_idx:N.indexes}),O){P.filters={};const e={};let t=!1;Object.entries(O).forEach((n=>{let[r,o]=n;o&&o[0]&&"boolean"!==typeof o[0]&&(e[r]=o[0],t=!0)})),t&&(P.filters=e)}try{let e,t=P;e="transform"===i.type?m:v;const n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});_=await n.json()}catch(F){return console.error(F),t(!1),void n([])}if(null===(b=_)||void 0===b||!b.data)return t(!1),void n([]);if(0===_.data.length){var Z,M,T;t(!1),n([]);const e=null!==(Z=_.page_size)&&void 0!==Z?Z:l.pageSize,r=(null!==(M=_.page)&&void 0!==M?M:0)+1,a=null!==(T=null!==u&&void 0!==u?u:_.total)&&void 0!==T?T:null;return void o({total:a,page:r,pageSize:e,hasMore:null!=a&&r*e{var n;let[r,o]=t;const a=A.has(r);return{title:a?(0,h.jsxs)("span",{className:"dp-col-title",children:[r,(0,h.jsx)("span",{className:"dp-col-pk-badge",children:"PK"})]}):r,dataIndex:r,className:a?"dp-pk-col":void 0,sorter:"object"!==typeof o,render:(e,t)=>function(e,t,n,r){if(null===e||void 0===e)return e;if("\u2014"===e||""===e||!1===e)return e;if("number"===typeof e&&0===e)return"0";const o="model_id"===t||t.endsWith("_model_id"),a="frozen_dataset_id"===t||t.endsWith("_frozen_dataset_id");return"string"===typeof e&&o?(0,p.Ux)({kind:"model",id:e,datasetId:y(r)}):"string"===typeof e&&a?(0,p.Ux)({kind:"dataset",id:e}):"object"===typeof e?(0,h.jsx)("pre",{style:{fontSize:10,margin:0,maxHeight:120,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:JSON.stringify(e,null,2)}):"boolean"===typeof e?e?"True":"False":e}(e,r,0,t),filterDropdown:"object"!==typeof o&&(t=>{let{setSelectedKeys:n,selectedKeys:a,confirm:i,clearFilters:l}=t;return(0,h.jsx)(x,{searchInput:e,column:r,selectedKeys:a,colValue:o,setSelectedKeys:n,confirm:i,clearFilters:l})}),filteredValue:null!==(n=c)&&void 0!==n&&n.filters?c.filters[r]:null,onFilterDropdownOpenChange:t=>{t&&setTimeout((()=>{var t;return null===(t=e.current)||void 0===t?void 0:t.select()}),100)}}}))),n(_.data.map(((e,t)=>(0,a.Z)((0,a.Z)({},e),{},{index:t})))),t(!1);const R=null!==(k=_.page_size)&&void 0!==k?k:l.pageSize,D=_.page+1,L=null!==(C=null!==u&&void 0!==u?u:_.total)&&void 0!==C?C:null;o({total:L,page:D,pageSize:R,hasMore:null!=L?D*R=R})},C=[5,10,20,50,100],S=e=>{let{current:t,setAlertMsg:n,knownRowCount:o=null,hideRunStep:i=!1,pipelineId:c,initialColumnFilter:p}=e;const[v,m]=(0,r.useState)([]),[g,y]=(0,r.useState)(),[x,S]=(0,r.useState)(!1),[E,j]=(0,r.useState)(),[O,_]=(0,r.useState)({total:o,page:1,pageSize:(0,f.Cn)(),hasMore:!1}),[N,P]=(0,r.useState)({page:1,pageSize:(0,f.Cn)()}),[Z,M]=(0,r.useState)({orderBy:void 0,order:void 0}),[T,I]=(0,r.useState)(p?{[p.column]:[p.value]}:{}),[A,R]=(0,r.useState)(!1),D=(0,r.useRef)(!0),L=(0,r.useRef)(null),F={onChange:(e,n)=>{const r={table_name:t.id,keys:e,indexes:n.map((e=>t.indexes.reduce(((t,n)=>(t[n]=e[n],t)),{})))};D.current=!0,j(r)}},z=(0,r.useCallback)(((e,t,n)=>{if(n){const e=Array.isArray(n)?n[0]:n;M({orderBy:Array.isArray(e.field)?e.field[0]:e.field,order:"descend"===e.order?"desc":"asc"})}e.current&&e.pageSize&&P({page:Math.max(1,e.current),pageSize:e.pageSize}),I(t)}),[]),B=(0,r.useCallback)((()=>{j(void 0)}),[]);(0,r.useEffect)((()=>{I(p?{[p.column]:[p.value]}:{}),M({});const e=(0,f.Cn)();P({page:1,pageSize:e}),y([]),m([]),D.current=!1,k(L,S,y,m,_,t,O,{page:1,pageSize:e},E,o)}),[t.id,null===p||void 0===p?void 0:p.column,null===p||void 0===p?void 0:p.value]),(0,r.useEffect)((()=>{_((e=>(0,a.Z)((0,a.Z)({},e),{},{total:o})))}),[o]),(0,r.useEffect)((()=>{D.current?D.current=!1:k(L,S,y,m,_,t,O,{orderBy:Z.orderBy,order:Z.order,page:N.page,pageSize:N.pageSize,filters:T},E,o)}),[T,E,N,A,Z.orderBy,Z.order,o,c]);const U=null!=O.total&&O.total>=0?Math.max(1,Math.ceil(O.total/N.pageSize)):null;return(0,h.jsxs)(h.Fragment,{children:["transform"===t.type&&!i&&(0,h.jsx)(b,{transform:t.id,setAlertMsg:n,tableFocus:E,setDataIsProcessed:R}),(0,h.jsxs)("div",{style:{height:E?"fit-content":1,opacity:E?1:0,transition:".2s all ease-out",overflow:"hidden"},children:[(0,h.jsx)("div",{style:{color:"red"},children:(0,h.jsx)("strong",{children:"Focus mode"})}),E&&(0,h.jsxs)(h.Fragment,{children:["table: ",(0,h.jsxs)("strong",{children:[null===E||void 0===E?void 0:E.table_name,"\xa0"]}),"indexes:\xa0",(0,h.jsx)("div",{children:(0,h.jsx)(w,{tableFocus:E})}),(0,h.jsx)(s.Z,{children:(0,h.jsx)(l.Z,{size:"small",onClick:B,children:"Clear"})})]})]}),Object.values(T).length>0&&(!g||0===g.length)&&(0,h.jsx)(l.Z,{onClick:()=>{I({})},children:"Clear filters"}),(0,h.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:(0,h.jsxs)(s.Z,{children:[(0,h.jsx)(l.Z,{size:"small",disabled:N.page<=1||x,onClick:()=>P((e=>(0,a.Z)((0,a.Z)({},e),{},{page:Math.max(1,e.page-1)}))),children:"Previous"}),(0,h.jsxs)("span",{children:["Page ",N.page,null!=U?" of ".concat(U):""]}),(0,h.jsx)(l.Z,{size:"small",disabled:!O.hasMore||x,onClick:()=>P((e=>(0,a.Z)((0,a.Z)({},e),{},{page:e.page+1}))),children:"Next"}),(0,h.jsx)(u.Z,{size:"small",value:N.pageSize,options:C.map((e=>({value:e,label:"".concat(e," / page")}))),onChange:e=>{(0,f.c6)(e),P({page:1,pageSize:e})}}),null!=O.total&&(0,h.jsxs)("span",{style:{color:"rgba(0,0,0,0.45)"},children:[O.total.toLocaleString()," rows"]})]})}),(0,h.jsx)(d.Z,{loading:x,showHeader:!x&&(null===g||void 0===g?void 0:g.length)>0,onChange:z,pagination:!1,rowKey:e=>{var n;if(t.indexes.length>0){const n=t.indexes.reduce(((t,n)=>t+=n+"_"+e[n]+"_"),"");return"".concat(t.id,"_").concat(n)}return"".concat(t.id,"_row_").concat(null!==(n=e.index)&&void 0!==n?n:JSON.stringify(e))},rowSelection:E&&t.id!==E.table_name?void 0:(0,a.Z)({type:"checkbox",selectedRowKeys:E?E.keys:[],preserveSelectedRowKeys:!0},F),size:"small",style:{width:"100%"},scroll:{x:"max-content"},columns:v,dataSource:x?[]:null!==g&&void 0!==g?g:[]})]})};function E(e){let{table:t,knownRowCount:n=null,hideRunStep:a=!1,pipelineId:i,initialColumnFilter:l}=e;const[c,s]=(0,r.useState)(null);return(0,h.jsxs)("div",{className:"dp-table-data-panel",children:[c&&(0,h.jsx)(o.Z,{style:{marginBottom:12},type:c.type,message:c.message,closable:!0,onClose:()=>s(null)}),(0,h.jsx)("div",{className:"dp-table-data-scroll",children:(0,h.jsx)(S,{current:t,setAlertMsg:s,knownRowCount:n,hideRunStep:a,pipelineId:i,initialColumnFilter:l})})]})}},7411:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});n(969);var r=n(6431),o=n(9717),a=n(7574);function i(e){let{size:t,loading:n,onCount:i}=e;return(0,a.jsxs)(r.Z,{size:8,children:[(0,a.jsx)("span",{children:null!=t?t.toLocaleString():"\u2014"}),(0,a.jsx)(o.Z,{size:"small",loading:n,onClick:i,children:"Count size"})]})}},6135:(e,t,n)=>{"use strict";n.d(t,{C:()=>o});var r=n(969);function o(e){let{initial:t,min:n,max:o,storageKey:a,edge:i}=e;const l=(0,r.useCallback)((e=>Math.min(o,Math.max(n,e))),[n,o]),[c,s]=(0,r.useState)((()=>{if(a){const e=localStorage.getItem(a),t=null==e?NaN:Number(e);if(Number.isFinite(t))return Math.min(o,Math.max(n,t))}return t})),[u,d]=(0,r.useState)(!1),f=(0,r.useRef)(null);(0,r.useEffect)((()=>{a&&localStorage.setItem(a,String(Math.round(c)))}),[c,a]),(0,r.useEffect)((()=>{if(!u)return;const e=e=>{const t=f.current;if(!t)return;const n=e.clientX-t.startX,r="right"===i?t.startWidth+n:t.startWidth-n;s(l(r))},t=()=>d(!1);document.addEventListener("mousemove",e),document.addEventListener("mouseup",t);const n=document.body.style.cursor,r=document.body.style.userSelect;return document.body.style.cursor="col-resize",document.body.style.userSelect="none",()=>{document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",t),document.body.style.cursor=n,document.body.style.userSelect=r}}),[u,i,l]);const p=(0,r.useCallback)((e=>{e.preventDefault(),f.current={startX:e.clientX,startWidth:c},d(!0)}),[c]);return{width:c,dragging:u,onHandleMouseDown:p,setWidth:s}}},7376:(e,t,n)=>{"use strict";n.d(t,{AG:()=>h,HD:()=>c,IL:()=>p,Oc:()=>l,Ux:()=>v,Wm:()=>d,YE:()=>s,_e:()=>u,to:()=>f});var r=n(3028),o=n(969),a=n(7574);const i=[];function l(e){if(i.some((t=>t.id===e.id)))throw new Error('UI plugin "'.concat(e.id,'" is already registered'));i.push(e)}function c(){return(0,a.jsx)(a.Fragment,{children:i.map((e=>{var t;return(0,a.jsx)(o.Fragment,{children:null===(t=e.routes)||void 0===t?void 0:t.call(e)},e.id)}))})}function s(e){return(0,a.jsx)(a.Fragment,{children:i.map((t=>{var n;return(0,a.jsx)(o.Fragment,{children:null===(n=t.renderNavSections)||void 0===n?void 0:n.call(t,e)},t.id)}))})}function u(e){return i.flatMap((t=>{var n,r;return null!==(n=null===(r=t.renderLegacyNavItems)||void 0===r?void 0:r.call(t,e))&&void 0!==n?n:[]}))}function d(){return i.flatMap((e=>{var t;return null!==(t=e.obsPagePrefixes)&&void 0!==t?t:[]}))}function f(){return Object.assign({},...i.map((e=>{var t;return null!==(t=e.opsApiExtensions)&&void 0!==t?t:{}})))}function p(e){const t=f()[e];if("function"===typeof t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o{const n=t.PluginSection;return n?(0,a.jsx)(n,(0,r.Z)({},e),t.id):null}))})}function v(e){var t;for(const n of i)if(n.EntityLink){const t=n.EntityLink;return(0,a.jsx)(t,(0,r.Z)({},e))}return(0,a.jsx)(a.Fragment,{children:null!==(t=e.children)&&void 0!==t?t:e.id})}},1370:(e,t,n)=>{"use strict";n.d(t,{R_:()=>f,ez:()=>p});var r=n(3104),o=n(9526),a=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function i(e){var t=e.r,n=e.g,o=e.b,a=(0,r.py)(t,n,o);return{h:360*a.h,s:a.s,v:a.v}}function l(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.vq)(t,n,o,!1))}function c(e,t,n){var r=n/100;return{r:(t.r-e.r)*r+e.r,g:(t.g-e.g)*r+e.g,b:(t.b-e.b)*r+e.b}}function s(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-2*t:Math.round(e.h)+2*t:n?Math.round(e.h)+2*t:Math.round(e.h)-2*t)<0?r+=360:r>=360&&(r-=360),r}function u(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-.16*t:4===t?e.s+.16:e.s+.05*t)>1&&(r=1),n&&5===t&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function d(e,t,n){var r;return(r=n?e.v+.05*t:e.v-.15*t)>1&&(r=1),Number(r.toFixed(2))}function f(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.uA)(e),f=5;f>0;f-=1){var p=i(r),h=l((0,o.uA)({h:s(p,f,!0),s:u(p,f,!0),v:d(p,f,!0)}));n.push(h)}n.push(l(r));for(var v=1;v<=4;v+=1){var m=i(r),g=l((0,o.uA)({h:s(m,v),s:u(m,v),v:d(m,v)}));n.push(g)}return"dark"===t.theme?a.map((function(e){var r=e.index,a=e.opacity;return l(c((0,o.uA)(t.backgroundColor||"#141414"),(0,o.uA)(n[r]),100*a))})):n}var p={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1890FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},h={},v={};Object.keys(p).forEach((function(e){h[e]=f(p[e]),h[e].primary=h[e][5],v[e]=f(p[e],{theme:"dark",backgroundColor:"#141414"}),v[e].primary=v[e][5]}));h.red,h.volcano,h.gold,h.orange,h.yellow,h.lime,h.green,h.cyan,h.blue,h.geekblue,h.purple,h.magenta,h.grey},3104:(e,t,n)=>{"use strict";n.d(t,{T6:()=>p,VD:()=>h,WE:()=>s,Yt:()=>v,lC:()=>a,py:()=>c,rW:()=>o,s:()=>d,ve:()=>l,vq:()=>u});var r=n(6672);function o(e,t,n){return{r:255*(0,r.sh)(e,255),g:255*(0,r.sh)(t,255),b:255*(0,r.sh)(n,255)}}function a(e,t,n){e=(0,r.sh)(e,255),t=(0,r.sh)(t,255),n=(0,r.sh)(n,255);var o=Math.max(e,t,n),a=Math.min(e,t,n),i=0,l=0,c=(o+a)/2;if(o===a)l=0,i=0;else{var s=o-a;switch(l=c>.5?s/(2-o-a):s/(o+a),o){case e:i=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function l(e,t,n){var o,a,l;if(e=(0,r.sh)(e,360),t=(0,r.sh)(t,100),n=(0,r.sh)(n,100),0===t)a=n,l=n,o=n;else{var c=n<.5?n*(1+t):n+t-n*t,s=2*n-c;o=i(s,c,e+1/3),a=i(s,c,e),l=i(s,c,e-1/3)}return{r:255*o,g:255*a,b:255*l}}function c(e,t,n){e=(0,r.sh)(e,255),t=(0,r.sh)(t,255),n=(0,r.sh)(n,255);var o=Math.max(e,t,n),a=Math.min(e,t,n),i=0,l=o,c=o-a,s=0===o?0:c/o;if(o===a)i=0;else{switch(o){case e:i=(t-n)/c+(t>16,g:(65280&e)>>8,b:255&e}}},6746:(e,t,n)=>{"use strict";n.d(t,{R:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},9526:(e,t,n)=>{"use strict";n.d(t,{uA:()=>i});var r=n(3104),o=n(6746),a=n(6672);function i(e){var t={r:0,g:0,b:0},n=1,i=null,l=null,c=null,s=!1,f=!1;return"string"===typeof e&&(e=function(e){if(0===(e=e.trim().toLowerCase()).length)return!1;var t=!1;if(o.R[e])e=o.R[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e))return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e))return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e))return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e))return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e))return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e))return{r:(0,r.VD)(n[1]),g:(0,r.VD)(n[2]),b:(0,r.VD)(n[3]),a:(0,r.T6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e))return{r:(0,r.VD)(n[1]),g:(0,r.VD)(n[2]),b:(0,r.VD)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e))return{r:(0,r.VD)(n[1]+n[1]),g:(0,r.VD)(n[2]+n[2]),b:(0,r.VD)(n[3]+n[3]),a:(0,r.T6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e))return{r:(0,r.VD)(n[1]+n[1]),g:(0,r.VD)(n[2]+n[2]),b:(0,r.VD)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"===typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r.rW)(e.r,e.g,e.b),s=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(i=(0,a.JX)(e.s),l=(0,a.JX)(e.v),t=(0,r.WE)(e.h,i,l),s=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(i=(0,a.JX)(e.s),c=(0,a.JX)(e.l),t=(0,r.ve)(e.h,i,c),s=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,a.Yq)(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var l="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),c="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),s="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),u={CSS_UNIT:new RegExp(l),rgb:new RegExp("rgb"+c),rgba:new RegExp("rgba"+s),hsl:new RegExp("hsl"+c),hsla:new RegExp("hsla"+s),hsv:new RegExp("hsv"+c),hsva:new RegExp("hsva"+s),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},6672:(e,t,n)=>{"use strict";function r(e,t){(function(e){return"string"===typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"===typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function a(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function i(e){return e<=1?"".concat(100*Number(e),"%"):e}function l(e){return 1===e.length?"0"+e:String(e)}n.d(t,{FZ:()=>l,JX:()=>i,V2:()=>o,Yq:()=>a,sh:()=>r})},8493:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;td,J0:()=>l,RQ:()=>T,WK:()=>D,Zn:()=>S,aU:()=>o,cP:()=>f,cm:()=>P,fp:()=>v,lX:()=>i,pC:()=>Z}),function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"}(o||(o={}));const a="popstate";function i(e){return void 0===e&&(e={}),p((function(e,t){let{pathname:n,search:r,hash:o}=e.location;return u("",{pathname:n,search:r,hash:o},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){return"string"===typeof t?t:d(t)}),null,e)}function l(e,t){if(!1===e||null===e||"undefined"===typeof e)throw new Error(t)}function c(e,t){if(!e){"undefined"!==typeof console&&console.warn(t);try{throw new Error(t)}catch(n){}}}function s(e,t){return{usr:e.state,key:e.key,idx:t}}function u(e,t,n,o){return void 0===n&&(n=null),r({pathname:"string"===typeof e?e:e.pathname,search:"",hash:""},"string"===typeof t?f(t):t,{state:n,key:t&&t.key||o||Math.random().toString(36).substr(2,8)})}function d(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&"?"!==n&&(t+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(t+="#"===r.charAt(0)?r:"#"+r),t}function f(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function p(e,t,n,i){void 0===i&&(i={});let{window:c=document.defaultView,v5Compat:f=!1}=i,p=c.history,h=o.Pop,v=null,m=g();function g(){return(p.state||{idx:null}).idx}function y(){h=o.Pop;let e=g(),t=null==e?null:e-m;m=e,v&&v({action:h,location:x.location,delta:t})}function b(e){let t="null"!==c.location.origin?c.location.origin:c.location.href,n="string"===typeof e?e:d(e);return n=n.replace(/ $/,"%20"),l(t,"No window.location.(origin|href) available to create URL for href: "+n),new URL(n,t)}null==m&&(m=0,p.replaceState(r({},p.state,{idx:m}),""));let x={get action(){return h},get location(){return e(c,p)},listen(e){if(v)throw new Error("A history only accepts one active listener");return c.addEventListener(a,y),v=e,()=>{c.removeEventListener(a,y),v=null}},createHref:e=>t(c,e),createURL:b,encodeLocation(e){let t=b(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){h=o.Push;let r=u(x.location,e,t);n&&n(r,e),m=g()+1;let a=s(r,m),i=x.createHref(r);try{p.pushState(a,"",i)}catch(l){if(l instanceof DOMException&&"DataCloneError"===l.name)throw l;c.location.assign(i)}f&&v&&v({action:h,location:x.location,delta:1})},replace:function(e,t){h=o.Replace;let r=u(x.location,e,t);n&&n(r,e),m=g();let a=s(r,m),i=x.createHref(r);p.replaceState(a,"",i),f&&v&&v({action:h,location:x.location,delta:0})},go:e=>p.go(e)};return x}var h;!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(h||(h={}));new Set(["lazy","caseSensitive","path","id","index","children"]);function v(e,t,n){return void 0===n&&(n="/"),m(e,t,n,!1)}function m(e,t,n,r){let o=S(("string"===typeof t?f(t):t).pathname||"/",n);if(null==o)return null;let a=g(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every(((e,n)=>e===t[n]))?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(a);let i=null,l=function(e){try{return e.split("/").map((e=>decodeURIComponent(e).replace(/\//g,"%2F"))).join("/")}catch(t){return c(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}(o);for(let c=0;null==i&&c{let i={relativePath:void 0===a?e.path||"":a,caseSensitive:!0===e.caseSensitive,childrenIndex:o,route:e};i.relativePath.startsWith("/")&&(l(i.relativePath.startsWith(r),'Absolute route path "'+i.relativePath+'" nested under path "'+r+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),i.relativePath=i.relativePath.slice(r.length));let c=T([r,i.relativePath]),s=n.concat(i);e.children&&e.children.length>0&&(l(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+c+'".'),g(e.children,t,s,c)),(null!=e.path||e.index)&&t.push({path:c,score:w(c,e.index),routesMeta:s})};return e.forEach(((e,t)=>{var n;if(""!==e.path&&null!=(n=e.path)&&n.includes("?"))for(let r of y(e.path))o(e,t,r);else o(e,t)})),t}function y(e){let t=e.split("/");if(0===t.length)return[];let[n,...r]=t,o=n.endsWith("?"),a=n.replace(/\?$/,"");if(0===r.length)return o?[a,""]:[a];let i=y(r.join("/")),l=[];return l.push(...i.map((e=>""===e?a:[a,e].join("/")))),o&&l.push(...i),l.map((t=>e.startsWith("/")&&""===t?"/":t))}const b=/^:[\w-]+$/,x=e=>"*"===e;function w(e,t){let n=e.split("/"),r=n.length;return n.some(x)&&(r+=-2),t&&(r+=2),n.filter((e=>!x(e))).reduce(((e,t)=>e+(b.test(t)?3:""===t?1:10)),r)}function k(e,t,n){void 0===n&&(n=!1);let{routesMeta:r}=e,o={},a="/",i=[];for(let l=0;l(r.push({paramName:t,isOptional:null!=n}),n?"/?([^\\/]+)?":"/([^\\/]+)")));e.endsWith("*")?(r.push({paramName:"*"}),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?o+="\\/*$":""!==e&&"/"!==e&&(o+="(?:(?=\\/|$))");return[new RegExp(o,t?void 0:"i"),r]}(e.path,e.caseSensitive,e.end),o=t.match(n);if(!o)return null;let a=o[0],i=a.replace(/(.)\/+$/,"$1"),l=o.slice(1);return{params:r.reduce(((e,t,n)=>{let{paramName:r,isOptional:o}=t;if("*"===r){let e=l[n]||"";i=a.slice(0,a.length-e.length).replace(/(.)\/+$/,"$1")}const c=l[n];return e[r]=o&&!c?void 0:(c||"").replace(/%2F/g,"/"),e}),{}),pathname:a,pathnameBase:i,pattern:e}}function S(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&"/"!==r?null:e.slice(n)||"/"}const E=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function j(e,t){void 0===t&&(t="/");let n,{pathname:r,search:o="",hash:a=""}="string"===typeof e?f(e):e;if(r)if(i=r,E.test(i))n=r;else{if(r.includes("//")){let e=r;r=M(r),c(!1,"Pathnames cannot have embedded double slashes - normalizing "+e+" -> "+r)}n=r.startsWith("/")?O(r.substring(1),"/"):O(r,t)}else n=t;var i;return{pathname:n,search:A(o),hash:R(a)}}function O(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}function _(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the `to."+n+'` field. Alternatively you may provide the full path as a string in and the router will parse it for you.'}function N(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}function P(e,t){let n=N(e);return t?n.map(((e,t)=>t===n.length-1?e.pathname:e.pathnameBase)):n.map((e=>e.pathnameBase))}function Z(e,t,n,o){let a;void 0===o&&(o=!1),"string"===typeof e?a=f(e):(a=r({},e),l(!a.pathname||!a.pathname.includes("?"),_("?","pathname","search",a)),l(!a.pathname||!a.pathname.includes("#"),_("#","pathname","hash",a)),l(!a.search||!a.search.includes("#"),_("#","search","hash",a)));let i,c=""===e||""===a.pathname,s=c?"/":a.pathname;if(null==s)i=n;else{let e=t.length-1;if(!o&&s.startsWith("..")){let t=s.split("/");for(;".."===t[0];)t.shift(),e-=1;a.pathname=t.join("/")}i=e>=0?t[e]:"/"}let u=j(a,i),d=s&&"/"!==s&&s.endsWith("/"),p=(c||"."===s)&&n.endsWith("/");return u.pathname.endsWith("/")||!d&&!p||(u.pathname+="/"),u}const M=e=>e.replace(/\/\/+/g,"/"),T=e=>M(e.join("/")),I=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),A=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",R=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";Error;function D(e){return null!=e&&"number"===typeof e.status&&"string"===typeof e.statusText&&"boolean"===typeof e.internal&&"data"in e}const L=["post","put","patch","delete"],F=(new Set(L),["get",...L]);new Set(F),new Set([301,302,303,307,308]),new Set([307,308]);Symbol("deferred")},5750:(e,t,n)=>{"use strict";n.d(t,{E:()=>o,Y:()=>a});var r=n(4141),o=(0,r.b)("success","processing","error","default","warning"),a=(0,r.b)("pink","red","yellow","orange","cyan","green","blue","purple","geekblue","magenta","volcano","gold","lime")},7756:(e,t,n)=>{"use strict";function r(e){return Object.keys(e).reduce((function(t,n){return!n.startsWith("data-")&&!n.startsWith("aria-")&&"role"!==n||n.startsWith("data-__")||(t[n]=e[n]),t}),{})}n.d(t,{Z:()=>r})},5517:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(6234),o=n(969),a=n(1066);const i=function(){var e=o.useState(!1),t=(0,r.Z)(e,2),n=t[0],i=t[1];return o.useEffect((function(){i((0,a.fk)())}),[]),n}},5637:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(6234),o=n(969);function a(){var e=o.useReducer((function(e){return e+1}),0);return(0,r.Z)(e,2)[1]}},405:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>s,mL:()=>c,q0:()=>l});var r=function(){return{height:0,opacity:0}},o=function(e){return{height:e.scrollHeight,opacity:1}},a=function(e,t){return!0===(null===t||void 0===t?void 0:t.deadline)||"height"===t.propertyName},i={motionName:"ant-motion-collapse",onAppearStart:r,onEnterStart:r,onAppearActive:o,onEnterActive:o,onLeaveStart:function(e){return{height:e?e.offsetHeight:0}},onLeaveActive:r,onAppearEnd:a,onEnterEnd:a,onLeaveEnd:a,motionDeadline:500},l=((0,n(4141).b)("bottomLeft","bottomRight","topLeft","topRight"),function(e){return void 0===e||"topLeft"!==e&&"topRight"!==e?"slide-up":"slide-down"}),c=function(e,t,n){return void 0!==n?n:"".concat(e,"-").concat(t)};const s=i},4766:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(7896),o=n(1831),a={adjustX:1,adjustY:1},i={adjustX:0,adjustY:0},l=[0,0];function c(e){return"boolean"===typeof e?e?a:i:(0,r.Z)((0,r.Z)({},i),e)}function s(e){var t=e.arrowWidth,n=void 0===t?4:t,a=e.horizontalArrowShift,i=void 0===a?16:a,s=e.verticalArrowShift,u=void 0===s?8:s,d=e.autoAdjustOverflow,f=e.arrowPointAtCenter,p={left:{points:["cr","cl"],offset:[-4,0]},right:{points:["cl","cr"],offset:[4,0]},top:{points:["bc","tc"],offset:[0,-4]},bottom:{points:["tc","bc"],offset:[0,4]},topLeft:{points:["bl","tc"],offset:[-(i+n),-4]},leftTop:{points:["tr","cl"],offset:[-4,-(u+n)]},topRight:{points:["br","tc"],offset:[i+n,-4]},rightTop:{points:["tl","cr"],offset:[4,-(u+n)]},bottomRight:{points:["tr","bc"],offset:[i+n,4]},rightBottom:{points:["bl","cr"],offset:[4,u+n]},bottomLeft:{points:["tl","bc"],offset:[-(i+n),4]},leftBottom:{points:["br","cl"],offset:[-4,u+n]}};return Object.keys(p).forEach((function(e){p[e]=f?(0,r.Z)((0,r.Z)({},p[e]),{overflow:c(d),targetOffset:l}):(0,r.Z)((0,r.Z)({},o.C[e]),{overflow:c(d)}),p[e].ignoreShake=!0})),p}},6530:(e,t,n)=>{"use strict";n.d(t,{Tm:()=>i,l$:()=>o,wm:()=>a});var r=n(969),o=r.isValidElement;function a(e,t,n){return o(e)?r.cloneElement(e,"function"===typeof n?n(e.props||{}):n):t}function i(e,t){return a(e,e,t)}},7834:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>u,c4:()=>a});var r=n(6666),o=n(7896),a=["xxl","xl","lg","md","sm","xs"],i={xs:"(max-width: 575px)",sm:"(min-width: 576px)",md:"(min-width: 768px)",lg:"(min-width: 992px)",xl:"(min-width: 1200px)",xxl:"(min-width: 1600px)"},l=new Map,c=-1,s={};const u={matchHandlers:{},dispatch:function(e){return s=e,l.forEach((function(e){return e(s)})),l.size>=1},subscribe:function(e){return l.size||this.register(),c+=1,l.set(c,e),e(s),c},unsubscribe:function(e){l.delete(e),l.size||this.unregister()},unregister:function(){var e=this;Object.keys(i).forEach((function(t){var n=i[t],r=e.matchHandlers[n];null===r||void 0===r||r.mql.removeListener(null===r||void 0===r?void 0:r.listener)})),l.clear()},register:function(){var e=this;Object.keys(i).forEach((function(t){var n=i[t],a=function(n){var a=n.matches;e.dispatch((0,o.Z)((0,o.Z)({},s),(0,r.Z)({},t,a)))},l=window.matchMedia(n);l.addListener(a),e.matchHandlers[n]={mql:l,listener:a},a(l)}))}}},4771:(e,t,n)=>{"use strict";n.d(t,{F:()=>l,Z:()=>i});var r=n(6666),o=n(5667),a=n.n(o);(0,n(4141).b)("warning","error","");function i(e,t,n){var o;return a()((o={},(0,r.Z)(o,"".concat(e,"-status-success"),"success"===t),(0,r.Z)(o,"".concat(e,"-status-warning"),"warning"===t),(0,r.Z)(o,"".concat(e,"-status-error"),"error"===t),(0,r.Z)(o,"".concat(e,"-status-validating"),"validating"===t),(0,r.Z)(o,"".concat(e,"-has-feedback"),n),o))}var l=function(e,t){return t||e}},1066:(e,t,n)=>{"use strict";n.d(t,{fk:()=>i,jD:()=>a});var r,o=n(3126),a=function(){return(0,o.Z)()&&window.document.documentElement},i=function(){if(!a())return!1;if(void 0!==r)return r;var e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),r=1===e.scrollHeight,document.body.removeChild(e),r}},4141:(e,t,n)=>{"use strict";n.d(t,{a:()=>o,b:()=>r});var r=function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{Z:()=>k});var r=n(7896),o=n(9249),a=n(7371),i=n(753),l=n(8106),c=n(551),s=n(5334),u=n(125),d=n(969),f=n(1742),p=n(3076),h=0,v={};function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=h++,r=t;function o(){(r-=1)<=0?(e(),delete v[n]):v[n]=(0,p.Z)(o)}return v[n]=(0,p.Z)(o),n}m.cancel=function(e){void 0!==e&&(p.Z.cancel(v[e]),delete v[e])},m.ids=v;var g,y=n(6530);function b(e){return!e||null===e.offsetParent||e.hidden}function x(e){var t=(e||"").match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/);return!(t&&t[1]&&t[2]&&t[3])||!(t[1]===t[2]&&t[2]===t[3])}var w=function(e){(0,l.Z)(n,e);var t=(0,c.Z)(n);function n(){var e;return(0,o.Z)(this,n),(e=t.apply(this,arguments)).containerRef=d.createRef(),e.animationStart=!1,e.destroyed=!1,e.onClick=function(t,n){var r,o,a=e.props,l=a.insertExtraNode;if(!(a.disabled||!t||b(t)||t.className.indexOf("-leave")>=0)){e.extraNode=document.createElement("div");var c=(0,i.Z)(e).extraNode,u=e.context.getPrefixCls;c.className="".concat(u(""),"-click-animating-node");var d=e.getAttributeName();if(t.setAttribute(d,"true"),n&&"#ffffff"!==n&&"rgb(255, 255, 255)"!==n&&x(n)&&!/rgba\((?:\d*, ){3}0\)/.test(n)&&"transparent"!==n){c.style.borderColor=n;var f=(null===(r=t.getRootNode)||void 0===r?void 0:r.call(t))||t.ownerDocument,p=f instanceof Document?f.body:null!==(o=f.firstChild)&&void 0!==o?o:f;g=(0,s.hq)("\n [".concat(u(""),"-click-animating-without-extra-node='true']::after, .").concat(u(""),"-click-animating-node {\n --antd-wave-shadow-color: ").concat(n,";\n }"),"antd-wave",{csp:e.csp,attachTo:p})}l&&t.appendChild(c),["transition","animation"].forEach((function(n){t.addEventListener("".concat(n,"start"),e.onTransitionStart),t.addEventListener("".concat(n,"end"),e.onTransitionEnd)}))}},e.onTransitionStart=function(t){if(!e.destroyed){var n=e.containerRef.current;t&&t.target===n&&!e.animationStart&&e.resetEffect(n)}},e.onTransitionEnd=function(t){t&&"fadeEffect"===t.animationName&&e.resetEffect(t.target)},e.bindAnimationEvent=function(t){if(t&&t.getAttribute&&!t.getAttribute("disabled")&&!(t.className.indexOf("disabled")>=0)){var n=function(n){if("INPUT"!==n.target.tagName&&!b(n.target)){e.resetEffect(t);var r=getComputedStyle(t).getPropertyValue("border-top-color")||getComputedStyle(t).getPropertyValue("border-color")||getComputedStyle(t).getPropertyValue("background-color");e.clickWaveTimeoutId=window.setTimeout((function(){return e.onClick(t,r)}),0),m.cancel(e.animationStartId),e.animationStart=!0,e.animationStartId=m((function(){e.animationStart=!1}),10)}};return t.addEventListener("click",n,!0),{cancel:function(){t.removeEventListener("click",n,!0)}}}},e.renderWave=function(t){var n=t.csp,r=e.props.children;if(e.csp=n,!d.isValidElement(r))return r;var o=e.containerRef;return(0,u.Yr)(r)&&(o=(0,u.sQ)(r.ref,e.containerRef)),(0,y.Tm)(r,{ref:o})},e}return(0,a.Z)(n,[{key:"componentDidMount",value:function(){this.destroyed=!1;var e=this.containerRef.current;e&&1===e.nodeType&&(this.instance=this.bindAnimationEvent(e))}},{key:"componentWillUnmount",value:function(){this.instance&&this.instance.cancel(),this.clickWaveTimeoutId&&clearTimeout(this.clickWaveTimeoutId),this.destroyed=!0}},{key:"getAttributeName",value:function(){var e=this.context.getPrefixCls,t=this.props.insertExtraNode;return"".concat(e(""),t?"-click-animating":"-click-animating-without-extra-node")}},{key:"resetEffect",value:function(e){var t=this;if(e&&e!==this.extraNode&&e instanceof Element){var n=this.props.insertExtraNode,r=this.getAttributeName();e.setAttribute(r,"false"),g&&(g.innerHTML=""),n&&this.extraNode&&e.contains(this.extraNode)&&e.removeChild(this.extraNode),["transition","animation"].forEach((function(n){e.removeEventListener("".concat(n,"start"),t.onTransitionStart),e.removeEventListener("".concat(n,"end"),t.onTransitionEnd)}))}}},{key:"render",value:function(){return d.createElement(f.C,null,this.renderWave)}}]),n}(d.Component);w.contextType=f.E_;const k=(0,d.forwardRef)((function(e,t){return d.createElement(w,(0,r.Z)({ref:t},e))}))},2085:(e,t,n)=>{"use strict";n.d(t,{Z:()=>T});var r=n(7896),o=n(6234),a=n(6666),i=n(315),l=n(3473),c=n(3063),s=n(2665),u=n(8107),d=n(7949),f=n(4349),p=n(6963),h=n(6902),v=n(5667),m=n.n(v),g=n(8289),y=n(969),b=n(1742),x=n(7756),w=n(6530),k=n(9249),C=n(7371),S=n(8106),E=n(551),j=function(e){(0,S.Z)(n,e);var t=(0,E.Z)(n);function n(){var e;return(0,k.Z)(this,n),(e=t.apply(this,arguments)).state={error:void 0,info:{componentStack:""}},e}return(0,C.Z)(n,[{key:"componentDidCatch",value:function(e,t){this.setState({error:e,info:t})}},{key:"render",value:function(){var e=this.props,t=e.message,n=e.description,r=e.children,o=this.state,a=o.error,i=o.info,l=i&&i.componentStack?i.componentStack:null,c="undefined"===typeof t?(a||"").toString():t,s="undefined"===typeof n?l:n;return a?y.createElement(T,{type:"error",message:c,description:y.createElement("pre",null,s)}):r}}]),n}(y.Component),O=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{n:()=>P,Z:()=>T});var r=n(7896),o=n(6666),a=n(6234),i=n(6522),l=n(5667),c=n.n(l),s=n(8870),u=n(969),d=n(1742),f=n(9842),p=n(945),h=n(6530),v=n(4141),m=n(4290),g=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>r});const r=n(6142).Z},1718:(e,t,n)=>{"use strict";n.d(t,{Z:()=>S});var r=n(6666),o=n(7896),a=n(5667),i=n.n(a),l=n(4786),c=n(969),s=n(1742),u=n(4549),d=n(8079),f=n(6234),p=n(8870),h=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o0&&(a=T().map((function(e){return c.createElement(k,{prefixCls:I,key:e.value.toString(),disabled:"disabled"in e?e.disabled:x.disabled,value:e.value,checked:-1!==O.indexOf(e.value),onChange:e.onChange,className:"".concat(A,"-item"),style:e.style},e.label)})));var D={toggleOption:function(e){var t=O.indexOf(e.value),n=(0,d.Z)(O);-1===t?n.push(e.value):n.splice(t,1),"value"in x||_(n);var r=T();null===b||void 0===b||b(n.filter((function(e){return-1!==Z.indexOf(e)})).sort((function(e,t){return r.findIndex((function(t){return t.value===e}))-r.findIndex((function(e){return e.value===t}))})))},value:O,disabled:x.disabled,name:x.name,registerValue:function(e){M((function(t){return[].concat((0,d.Z)(t),[e])}))},cancelValue:function(e){M((function(t){return t.filter((function(t){return t!==e}))}))}},L=i()(A,(0,r.Z)({},"".concat(A,"-rtl"),"rtl"===S),g);return c.createElement("div",(0,o.Z)({className:L,style:y},R,{ref:t}),c.createElement(v.Provider,{value:D},a))},g=c.forwardRef(m);const y=c.memo(g);var b=n(9842),x=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>i,n:()=>a});var r=n(969),o=r.createContext(!1),a=function(e){var t=e.children,n=e.disabled,a=r.useContext(o);return r.createElement(o.Provider,{value:n||a},t)};const i=o},945:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i,q:()=>a});var r=n(969),o=r.createContext(void 0),a=function(e){var t=e.children,n=e.size;return r.createElement(o.Consumer,null,(function(e){return r.createElement(o.Provider,{value:n||e},t)}))};const i=o},1742:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,E_:()=>r});var r=n(969).createContext({getPrefixCls:function(e,t){return t||(e?"ant-".concat(e):"ant")}}),o=r.Consumer},2913:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(969),o=n(1742),a=n(1613);const i=function(e){return r.createElement(o.C,null,(function(t){var n=(0,t.getPrefixCls)("empty");switch(e){case"Table":case"List":return r.createElement(a.Z,{image:a.Z.PRESENTED_IMAGE_SIMPLE});case"Select":case"TreeSelect":case"Cascader":case"Transfer":case"Mentions":return r.createElement(a.Z,{image:a.Z.PRESENTED_IMAGE_SIMPLE,className:"".concat(n,"-small")});default:return r.createElement(a.Z,null)}}))}},2081:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7896);const o={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"};var a=n(129);const i={lang:(0,r.Z)({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},o),timePickerLocale:(0,r.Z)({},a.Z)}},8832:(e,t,n)=>{"use strict";n.d(t,{Z:()=>O});var r=n(7896),o=n(6522),a=n(6234),i=n(6666),l=n(4620),c=n(5667),s=n.n(c),u=n(4175),d=n(8753),f=n(1978),p=n(969),h=n(1742),v=n(9438),m=n(4766),g=n(6530),y=n(4141),b=n(977),x=n(9717),w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o=0?"".concat(t,"-slide-down"):"".concat(t,"-slide-up")}(),trigger:M,overlay:function(){var t,n=e.overlay;return t="function"===typeof n?n():n,t=p.Children.only("string"===typeof t?p.createElement("span",null,t):t),p.createElement(v.J,{prefixCls:"".concat(N,"-menu"),expandIcon:p.createElement("span",{className:"".concat(N,"-menu-submenu-arrow")},p.createElement(l.Z,{className:"".concat(N,"-menu-submenu-arrow-icon")})),mode:"vertical",selectable:!1,onClick:z,validator:function(e){e.mode}},t)},placement:function(){var t=e.placement;return t?t.includes("Center")?t.slice(0,t.indexOf("Center")):t:"rtl"===b?"bottomRight":"bottomLeft"}(),onVisibleChange:D}),Z)};E.Button=S,E.defaultProps={mouseEnterDelay:.15,mouseLeaveDelay:.1};const j=E,O=E},1613:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var r=n(6666),o=n(7896),a=n(5667),i=n.n(a),l=n(969),c=n(1742),s=n(6570);const u=function(){var e=(0,l.useContext(c.E_).getPrefixCls)("empty-img-default");return l.createElement("svg",{className:e,width:"184",height:"152",viewBox:"0 0 184 152",xmlns:"http://www.w3.org/2000/svg"},l.createElement("g",{fill:"none",fillRule:"evenodd"},l.createElement("g",{transform:"translate(24 31.67)"},l.createElement("ellipse",{className:"".concat(e,"-ellipse"),cx:"67.797",cy:"106.89",rx:"67.797",ry:"12.668"}),l.createElement("path",{className:"".concat(e,"-path-1"),d:"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z"}),l.createElement("path",{className:"".concat(e,"-path-2"),d:"M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z",transform:"translate(13.56)"}),l.createElement("path",{className:"".concat(e,"-path-3"),d:"M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"}),l.createElement("path",{className:"".concat(e,"-path-4"),d:"M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z"})),l.createElement("path",{className:"".concat(e,"-path-5"),d:"M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z"}),l.createElement("g",{className:"".concat(e,"-g"),transform:"translate(149.65 15.383)"},l.createElement("ellipse",{cx:"20.654",cy:"3.167",rx:"2.849",ry:"2.815"}),l.createElement("path",{d:"M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z"}))))};const d=function(){var e=(0,l.useContext(c.E_).getPrefixCls)("empty-img-simple");return l.createElement("svg",{className:e,width:"64",height:"41",viewBox:"0 0 64 41",xmlns:"http://www.w3.org/2000/svg"},l.createElement("g",{transform:"translate(0 1)",fill:"none",fillRule:"evenodd"},l.createElement("ellipse",{className:"".concat(e,"-ellipse"),cx:"32",cy:"33",rx:"32",ry:"7"}),l.createElement("g",{className:"".concat(e,"-g"),fillRule:"nonzero"},l.createElement("path",{d:"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"}),l.createElement("path",{d:"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z",className:"".concat(e,"-path")}))))};var f=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{RV:()=>s,Rk:()=>u,Ux:()=>f,aM:()=>d,q3:()=>l,qI:()=>c});var r=n(7896),o=n(7056),a=n(8870),i=n(969),l=i.createContext({labelAlign:"right",vertical:!1,itemRef:function(){}}),c=i.createContext(null),s=function(e){var t=(0,a.Z)(e,["prefixCls"]);return i.createElement(o.RV,(0,r.Z)({},t))},u=i.createContext({prefixCls:""}),d=i.createContext({}),f=function(e){var t=e.children,n=e.status,o=e.override,a=(0,i.useContext)(d),l=(0,i.useMemo)((function(){var e=(0,r.Z)({},a);return o&&delete e.isFormItemInput,n&&(delete e.status,delete e.hasFeedback,delete e.feedbackIcon),e}),[n,o,a]);return i.createElement(d.Provider,{value:l},t)}},7048:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(969),o=n(5637),a=n(7834);const i=function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=(0,r.useRef)({}),n=(0,o.Z)();return(0,r.useEffect)((function(){var r=a.ZP.subscribe((function(r){t.current=r,e&&n()}));return function(){return a.ZP.unsubscribe(r)}}),[]),t.current}},5221:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>T,D7:()=>P,rJ:()=>Z,nH:()=>M});var r=n(6666),o=n(7896),a=n(6522),i=n(3063),l=n(5667),c=n.n(l),s=n(969);function u(e){return!(!e.addonBefore&&!e.addonAfter)}function d(e){return!!(e.prefix||e.suffix||e.allowClear)}function f(e,t,n,r){if(n){var o=t;if("click"===t.type){var a=e.cloneNode(!0);return o=Object.create(t,{target:{value:a},currentTarget:{value:a}}),a.value="",void n(o)}if(void 0!==r)return o=Object.create(t,{target:{value:e},currentTarget:{value:e}}),e.value=r,void n(o);n(o)}}function p(e){return"undefined"===typeof e||null===e?"":String(e)}const h=function(e){var t=e.inputElement,n=e.prefixCls,o=e.prefix,i=e.suffix,l=e.addonBefore,f=e.addonAfter,p=e.className,h=e.style,v=e.affixWrapperClassName,m=e.groupClassName,g=e.wrapperClassName,y=e.disabled,b=e.readOnly,x=e.focused,w=e.triggerFocus,k=e.allowClear,C=e.value,S=e.handleReset,E=e.hidden,j=(0,s.useRef)(null),O=(0,s.cloneElement)(t,{value:C,hidden:E});if(d(e)){var _,N="".concat(n,"-affix-wrapper"),P=c()(N,(_={},(0,r.Z)(_,"".concat(N,"-disabled"),y),(0,r.Z)(_,"".concat(N,"-focused"),x),(0,r.Z)(_,"".concat(N,"-readonly"),b),(0,r.Z)(_,"".concat(N,"-input-with-clear-btn"),i&&k&&C),_),!u(e)&&p,v),Z=(i||k)&&s.createElement("span",{className:"".concat(n,"-suffix")},function(){var e;if(!k)return null;var t=!y&&!b&&C,o="".concat(n,"-clear-icon"),l="object"===(0,a.Z)(k)&&(null===k||void 0===k?void 0:k.clearIcon)?k.clearIcon:"\u2716";return s.createElement("span",{onClick:S,onMouseDown:function(e){return e.preventDefault()},className:c()(o,(e={},(0,r.Z)(e,"".concat(o,"-hidden"),!t),(0,r.Z)(e,"".concat(o,"-has-suffix"),!!i),e)),role:"button",tabIndex:-1},l)}(),i);O=s.createElement("span",{className:P,style:h,hidden:!u(e)&&E,onMouseDown:function(e){var t;(null===(t=j.current)||void 0===t?void 0:t.contains(e.target))&&(null===w||void 0===w||w())},ref:j},o&&s.createElement("span",{className:"".concat(n,"-prefix")},o),(0,s.cloneElement)(t,{style:null,value:C,hidden:null}),Z)}if(u(e)){var M="".concat(n,"-group"),T="".concat(M,"-addon"),I=c()("".concat(n,"-wrapper"),M,g),A=c()("".concat(n,"-group-wrapper"),p,m);return s.createElement("span",{className:A,style:h,hidden:E},s.createElement("span",{className:I},l&&s.createElement("span",{className:T},l),(0,s.cloneElement)(O,{style:null,hidden:null}),f&&s.createElement("span",{className:T},f)))}return O};var v=n(8079),m=n(3028),g=n(6234),y=n(2159),b=n(8870),x=n(1978),w=["autoComplete","onChange","onFocus","onBlur","onPressEnter","onKeyDown","prefixCls","disabled","htmlSize","className","maxLength","suffix","showCount","type","inputClassName"];const k=(0,s.forwardRef)((function(e,t){var n=e.autoComplete,o=e.onChange,i=e.onFocus,l=e.onBlur,k=e.onPressEnter,C=e.onKeyDown,S=e.prefixCls,E=void 0===S?"rc-input":S,j=e.disabled,O=e.htmlSize,_=e.className,N=e.maxLength,P=e.suffix,Z=e.showCount,M=e.type,T=void 0===M?"text":M,I=e.inputClassName,A=(0,y.Z)(e,w),R=(0,x.Z)(e.defaultValue,{value:e.value}),D=(0,g.Z)(R,2),L=D[0],F=D[1],z=(0,s.useState)(!1),B=(0,g.Z)(z,2),U=B[0],V=B[1],H=(0,s.useRef)(null),K=function(e){H.current&&function(e,t){if(e){e.focus(t);var n=(t||{}).cursor;if(n){var r=e.value.length;switch(n){case"start":e.setSelectionRange(0,0);break;case"end":e.setSelectionRange(r,r);break;default:e.setSelectionRange(0,r)}}}}(H.current,e)};(0,s.useImperativeHandle)(t,(function(){return{focus:K,blur:function(){var e;null===(e=H.current)||void 0===e||e.blur()},setSelectionRange:function(e,t,n){var r;null===(r=H.current)||void 0===r||r.setSelectionRange(e,t,n)},select:function(){var e;null===(e=H.current)||void 0===e||e.select()},input:H.current}})),(0,s.useEffect)((function(){V((function(e){return(!e||!j)&&e}))}),[j]);var W=function(t){void 0===e.value&&F(t.target.value),H.current&&f(H.current,t,o)},Y=function(e){k&&"Enter"===e.key&&k(e),null===C||void 0===C||C(e)},q=function(e){V(!0),null===i||void 0===i||i(e)},$=function(e){V(!1),null===l||void 0===l||l(e)};return s.createElement(h,(0,m.Z)((0,m.Z)({},A),{},{prefixCls:E,className:_,inputElement:function(){var t=(0,b.Z)(e,["prefixCls","onPressEnter","addonBefore","addonAfter","prefix","suffix","allowClear","defaultValue","showCount","affixWrapperClassName","groupClassName","inputClassName","wrapperClassName","htmlSize"]);return s.createElement("input",(0,m.Z)((0,m.Z)({autoComplete:n},t),{},{onChange:W,onFocus:q,onBlur:$,onKeyDown:Y,className:c()(E,(0,r.Z)({},"".concat(E,"-disabled"),j),I,!u(e)&&!d(e)&&_),ref:H,size:O,type:T}))}(),handleReset:function(e){F(""),K(),H.current&&f(H.current,e,o)},value:p(L),focused:U,triggerFocus:K,suffix:function(){var e=Number(N)>0;if(P||Z){var t=(0,v.Z)(p(L)).length,n="object"===(0,a.Z)(Z)?Z.formatter({count:t,maxLength:N}):"".concat(t).concat(e?" / ".concat(N):"");return s.createElement(s.Fragment,null,!!Z&&s.createElement("span",{className:c()("".concat(E,"-show-count-suffix"),(0,r.Z)({},"".concat(E,"-show-count-has-suffix"),!!P))},n),P)}return null}(),disabled:j}))}));var C=n(125),S=n(1742),E=n(9842),j=n(945),O=n(4549),_=n(4771);var N=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>U});var r,o=n(6522),a=n(6666),i=n(7896),l=n(6234),c=n(8079),s=n(5667),u=n.n(s),d=n(9249),f=n(7371),p=n(8106),h=n(551),v=n(969),m=n(3028),g=n(4480),y=n(8870),b="\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n",x=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","font-variant","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing","word-break"],w={};function k(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.getAttribute("id")||e.getAttribute("data-reactid")||e.getAttribute("name");if(t&&w[n])return w[n];var r=window.getComputedStyle(e),o=r.getPropertyValue("box-sizing")||r.getPropertyValue("-moz-box-sizing")||r.getPropertyValue("-webkit-box-sizing"),a=parseFloat(r.getPropertyValue("padding-bottom"))+parseFloat(r.getPropertyValue("padding-top")),i=parseFloat(r.getPropertyValue("border-bottom-width"))+parseFloat(r.getPropertyValue("border-top-width")),l=x.map((function(e){return"".concat(e,":").concat(r.getPropertyValue(e))})).join(";"),c={sizingStyle:l,paddingSize:a,borderSize:i,boxSizing:o};return t&&n&&(w[n]=c),c}var C,S=n(1806),E=n.n(S);!function(e){e[e.NONE=0]="NONE",e[e.RESIZING=1]="RESIZING",e[e.RESIZED=2]="RESIZED"}(C||(C={}));const j=function(e){(0,p.Z)(n,e);var t=(0,h.Z)(n);function n(e){var o;return(0,d.Z)(this,n),(o=t.call(this,e)).nextFrameActionId=void 0,o.resizeFrameId=void 0,o.textArea=void 0,o.saveTextArea=function(e){o.textArea=e},o.handleResize=function(e){var t=o.state.resizeStatus,n=o.props,r=n.autoSize,a=n.onResize;t===C.NONE&&("function"===typeof a&&a(e),r&&o.resizeOnNextFrame())},o.resizeOnNextFrame=function(){cancelAnimationFrame(o.nextFrameActionId),o.nextFrameActionId=requestAnimationFrame(o.resizeTextarea)},o.resizeTextarea=function(){var e=o.props.autoSize;if(e&&o.textArea){var t=e.minRows,n=e.maxRows,a=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;r||((r=document.createElement("textarea")).setAttribute("tab-index","-1"),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),e.getAttribute("wrap")?r.setAttribute("wrap",e.getAttribute("wrap")):r.removeAttribute("wrap");var a=k(e,t),i=a.paddingSize,l=a.borderSize,c=a.boxSizing,s=a.sizingStyle;r.setAttribute("style","".concat(s,";").concat(b)),r.value=e.value||e.placeholder||"";var u,d=Number.MIN_SAFE_INTEGER,f=Number.MAX_SAFE_INTEGER,p=r.scrollHeight;if("border-box"===c?p+=l:"content-box"===c&&(p-=i),null!==n||null!==o){r.value=" ";var h=r.scrollHeight-i;null!==n&&(d=h*n,"border-box"===c&&(d=d+i+l),p=Math.max(d,p)),null!==o&&(f=h*o,"border-box"===c&&(f=f+i+l),u=p>f?"":"hidden",p=Math.min(f,p))}return{height:p,minHeight:d,maxHeight:f,overflowY:u,resize:"none"}}(o.textArea,!1,t,n);o.setState({textareaStyles:a,resizeStatus:C.RESIZING},(function(){cancelAnimationFrame(o.resizeFrameId),o.resizeFrameId=requestAnimationFrame((function(){o.setState({resizeStatus:C.RESIZED},(function(){o.resizeFrameId=requestAnimationFrame((function(){o.setState({resizeStatus:C.NONE}),o.fixFirefoxAutoScroll()}))}))}))}))}},o.renderTextArea=function(){var e=o.props,t=e.prefixCls,n=void 0===t?"rc-textarea":t,r=e.autoSize,l=e.onResize,c=e.className,s=e.disabled,d=o.state,f=d.textareaStyles,p=d.resizeStatus,h=(0,y.Z)(o.props,["prefixCls","onPressEnter","autoSize","defaultValue","onResize"]),b=u()(n,c,(0,a.Z)({},"".concat(n,"-disabled"),s));"value"in h&&(h.value=h.value||"");var x=(0,m.Z)((0,m.Z)((0,m.Z)({},o.props.style),f),p===C.RESIZING?{overflowX:"hidden",overflowY:"hidden"}:null);return v.createElement(g.Z,{onResize:o.handleResize,disabled:!(r||l)},v.createElement("textarea",(0,i.Z)({},h,{className:b,style:x,ref:o.saveTextArea})))},o.state={textareaStyles:{},resizeStatus:C.NONE},o}return(0,f.Z)(n,[{key:"componentDidUpdate",value:function(e){e.value===this.props.value&&E()(e.autoSize,this.props.autoSize)||this.resizeTextarea()}},{key:"componentWillUnmount",value:function(){cancelAnimationFrame(this.nextFrameActionId),cancelAnimationFrame(this.resizeFrameId)}},{key:"fixFirefoxAutoScroll",value:function(){try{if(document.activeElement===this.textArea){var e=this.textArea.selectionStart,t=this.textArea.selectionEnd;this.textArea.setSelectionRange(e,t)}}catch(n){}}},{key:"render",value:function(){return this.renderTextArea()}}]),n}(v.Component);const O=function(e){(0,p.Z)(n,e);var t=(0,h.Z)(n);function n(e){var r;(0,d.Z)(this,n),(r=t.call(this,e)).resizableTextArea=void 0,r.focus=function(){r.resizableTextArea.textArea.focus()},r.saveTextArea=function(e){r.resizableTextArea=e},r.handleChange=function(e){var t=r.props.onChange;r.setValue(e.target.value,(function(){r.resizableTextArea.resizeTextarea()})),t&&t(e)},r.handleKeyDown=function(e){var t=r.props,n=t.onPressEnter,o=t.onKeyDown;13===e.keyCode&&n&&n(e),o&&o(e)};var o="undefined"===typeof e.value||null===e.value?e.defaultValue:e.value;return r.state={value:o},r}return(0,f.Z)(n,[{key:"setValue",value:function(e,t){"value"in this.props||this.setState({value:e},t)}},{key:"blur",value:function(){this.resizableTextArea.textArea.blur()}},{key:"render",value:function(){return v.createElement(j,(0,i.Z)({},this.props,{value:this.state.value,onKeyDown:this.handleKeyDown,onChange:this.handleChange,ref:this.saveTextArea}))}}],[{key:"getDerivedStateFromProps",value:function(e){return"value"in e?{value:e.value}:null}}]),n}(v.Component);var _=n(1978),N=n(1742),P=n(9842),Z=n(945),M=n(4549),T=n(4771),I=n(3063),A=n(6530),R=(0,n(4141).b)("text","input");const D=function(e){(0,p.Z)(n,e);var t=(0,h.Z)(n);function n(){return(0,d.Z)(this,n),t.apply(this,arguments)}return(0,f.Z)(n,[{key:"renderClearIcon",value:function(e){var t,n=this.props,r=n.value,o=n.disabled,i=n.readOnly,l=n.handleReset,c=n.suffix,s=!o&&!i&&r,d="".concat(e,"-clear-icon");return v.createElement(I.Z,{onClick:l,onMouseDown:function(e){return e.preventDefault()},className:u()((t={},(0,a.Z)(t,"".concat(d,"-hidden"),!s),(0,a.Z)(t,"".concat(d,"-has-suffix"),!!c),t),d),role:"button"})}},{key:"renderTextAreaWithClearIcon",value:function(e,t,n){var r,o=this.props,i=o.value,l=o.allowClear,c=o.className,s=o.style,d=o.direction,f=o.bordered,p=o.hidden,h=o.status,m=n.status,g=n.hasFeedback;if(!l)return(0,A.Tm)(t,{value:i});var y,b=u()("".concat(e,"-affix-wrapper"),"".concat(e,"-affix-wrapper-textarea-with-clear-btn"),(0,T.Z)("".concat(e,"-affix-wrapper"),(0,T.F)(m,h),g),(r={},(0,a.Z)(r,"".concat(e,"-affix-wrapper-rtl"),"rtl"===d),(0,a.Z)(r,"".concat(e,"-affix-wrapper-borderless"),!f),(0,a.Z)(r,"".concat(c),!((y=this.props).addonBefore||y.addonAfter)&&c),r));return v.createElement("span",{className:b,style:s,hidden:p},(0,A.Tm)(t,{style:null,value:i}),this.renderClearIcon(e))}},{key:"render",value:function(){var e=this;return v.createElement(M.aM.Consumer,null,(function(t){var n=e.props,r=n.prefixCls,o=n.inputType,a=n.element;if(o===R[0])return e.renderTextAreaWithClearIcon(r,a,t)}))}}]),n}(v.Component);var L=n(5221),F=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);or&&(o=t),o}const U=v.forwardRef((function(e,t){var n,r=e.prefixCls,s=e.bordered,d=void 0===s||s,f=e.showCount,p=void 0!==f&&f,h=e.maxLength,m=e.className,g=e.style,b=e.size,x=e.disabled,w=e.onCompositionStart,k=e.onCompositionEnd,C=e.onChange,S=e.status,E=F(e,["prefixCls","bordered","showCount","maxLength","className","style","size","disabled","onCompositionStart","onCompositionEnd","onChange","status"]),j=v.useContext(N.E_),I=j.getPrefixCls,A=j.direction,R=v.useContext(Z.Z),U=v.useContext(P.Z),V=x||U,H=v.useContext(M.aM),K=H.status,W=H.hasFeedback,Y=H.isFormItemInput,q=H.feedbackIcon,$=(0,T.F)(K,S),G=v.useRef(null),X=v.useRef(null),Q=v.useState(!1),J=(0,l.Z)(Q,2),ee=J[0],te=J[1],ne=v.useRef(),re=v.useRef(0),oe=(0,_.Z)(E.defaultValue,{value:E.value}),ae=(0,l.Z)(oe,2),ie=ae[0],le=ae[1],ce=E.hidden,se=function(e,t){void 0===E.value&&(le(e),null===t||void 0===t||t())},ue=Number(h)>0,de=I("input",r);v.useImperativeHandle(t,(function(){var e;return{resizableTextArea:null===(e=G.current)||void 0===e?void 0:e.resizableTextArea,focus:function(e){var t,n;(0,L.nH)(null===(n=null===(t=G.current)||void 0===t?void 0:t.resizableTextArea)||void 0===n?void 0:n.textArea,e)},blur:function(){var e;return null===(e=G.current)||void 0===e?void 0:e.blur()}}}));var fe=v.createElement(O,(0,i.Z)({},(0,y.Z)(E,["allowClear"]),{disabled:V,className:u()((n={},(0,a.Z)(n,"".concat(de,"-borderless"),!d),(0,a.Z)(n,m,m&&!p),(0,a.Z)(n,"".concat(de,"-sm"),"small"===R||"small"===b),(0,a.Z)(n,"".concat(de,"-lg"),"large"===R||"large"===b),n),(0,T.Z)(de,$)),style:p?void 0:g,prefixCls:de,onCompositionStart:function(e){te(!0),ne.current=ie,re.current=e.currentTarget.selectionStart,null===w||void 0===w||w(e)},onChange:function(e){var t=e.target.value;!ee&&ue&&(t=B(e.target.selectionStart>=h+1||e.target.selectionStart===t.length||!e.target.selectionStart,ie,t,h));se(t),(0,L.rJ)(e.currentTarget,e,C,t)},onCompositionEnd:function(e){var t;te(!1);var n=e.currentTarget.value;ue&&(n=B(re.current>=h+1||re.current===(null===(t=ne.current)||void 0===t?void 0:t.length),ne.current,n,h));n!==ie&&(se(n),(0,L.rJ)(e.currentTarget,e,C,n)),null===k||void 0===k||k(e)},ref:G})),pe=(0,L.D7)(ie);ee||!ue||null!==E.value&&void 0!==E.value||(pe=z(pe,h));var he=v.createElement(D,(0,i.Z)({disabled:V},E,{prefixCls:de,direction:A,inputType:"text",value:pe,element:fe,handleReset:function(e){var t,n,r;se(""),null===(t=G.current)||void 0===t||t.focus(),(0,L.rJ)(null===(r=null===(n=G.current)||void 0===n?void 0:n.resizableTextArea)||void 0===r?void 0:r.textArea,e,C)},ref:X,bordered:d,status:S,style:p?void 0:g}));if(p||W){var ve,me=(0,c.Z)(pe).length,ge="";return ge="object"===(0,o.Z)(p)?p.formatter({count:me,maxLength:h}):"".concat(me).concat(ue?" / ".concat(h):""),v.createElement("div",{hidden:ce,className:u()("".concat(de,"-textarea"),(ve={},(0,a.Z)(ve,"".concat(de,"-textarea-rtl"),"rtl"===A),(0,a.Z)(ve,"".concat(de,"-textarea-show-count"),p),(0,a.Z)(ve,"".concat(de,"-textarea-in-form-item"),Y),ve),(0,T.Z)("".concat(de,"-textarea"),$,W),m),style:g,"data-count":ge},he,W&&v.createElement("span",{className:"".concat(de,"-textarea-suffix")},q))}return he}))},1824:(e,t,n)=>{"use strict";n.d(t,{Z:()=>A});var r=n(7896),o=n(6666),a=n(5667),i=n.n(a),l=n(969),c=n(1742),s=n(4549);const u=function(e){var t,n=(0,l.useContext)(c.E_),a=n.getPrefixCls,u=n.direction,d=e.prefixCls,f=e.className,p=void 0===f?"":f,h=a("input-group",d),v=i()(h,(t={},(0,o.Z)(t,"".concat(h,"-lg"),"large"===e.size),(0,o.Z)(t,"".concat(h,"-sm"),"small"===e.size),(0,o.Z)(t,"".concat(h,"-compact"),e.compact),(0,o.Z)(t,"".concat(h,"-rtl"),"rtl"===u),t),p),m=(0,l.useContext)(s.aM),g=(0,l.useMemo)((function(){return(0,r.Z)((0,r.Z)({},m),{isFormItemInput:!1})}),[m]);return l.createElement("span",{className:v,style:e.style,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onFocus:e.onFocus,onBlur:e.onBlur},l.createElement(s.aM.Provider,{value:g},e.children))};var d=n(5221),f=n(6234),p=n(3028);const h={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z"}},{tag:"path",attrs:{d:"M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z"}}]},name:"eye-invisible",theme:"outlined"};var v=n(2365),m=function(e,t){return l.createElement(v.Z,(0,p.Z)((0,p.Z)({},e),{},{ref:t,icon:h}))};m.displayName="EyeInvisibleOutlined";const g=l.forwardRef(m);const y={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var b=function(e,t){return l.createElement(v.Z,(0,p.Z)((0,p.Z)({},e),{},{ref:t,icon:y}))};b.displayName="EyeOutlined";const x=l.forwardRef(b);var w=n(8870),k=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>d,E:()=>f});var r=n(7896),o=n(9249),a=n(7371),i=n(8106),l=n(551),c=n(969),s=n(9216);const u=n(1973).Z;var d=function(e){(0,i.Z)(n,e);var t=(0,l.Z)(n);function n(){return(0,o.Z)(this,n),t.apply(this,arguments)}return(0,a.Z)(n,[{key:"getLocale",value:function(){var e=this.props,t=e.componentName,n=e.defaultLocale||u[null!==t&&void 0!==t?t:"global"],o=this.context,a=t&&o?o[t]:{};return(0,r.Z)((0,r.Z)({},n instanceof Function?n():n),a||{})}},{key:"getLocaleCode",value:function(){var e=this.context,t=e&&e.locale;return e&&e.exist&&!t?u.locale:t}},{key:"render",value:function(){return this.props.children(this.getLocale(),this.getLocaleCode(),this.context)}}]),n}(c.Component);function f(e,t){var n=c.useContext(s.Z);return[c.useMemo((function(){var o=t||u[e||"global"],a=e&&n?n[e]:{};return(0,r.Z)((0,r.Z)({},"function"===typeof o?o():o),a||{})}),[e,t,n])]}d.defaultProps={componentName:"global"},d.contextType=s.Z},9216:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=(0,n(969).createContext)(void 0)},1973:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7144),o=n(2081);const a=o.Z;var i=n(129),l="${label} is not a valid ${type}";const c={locale:"en",Pagination:r.Z,DatePicker:o.Z,TimePicker:i.Z,Calendar:a,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No Data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand"},PageHeader:{back:"Back"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:l,method:l,array:l,object:l,number:l,date:l,boolean:l,integer:l,float:l,regexp:l,email:l,url:l,hex:l},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"}}},9438:(e,t,n)=>{"use strict";n.d(t,{J:()=>l,Z:()=>c});var r=n(7896),o=n(969),a=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>R});var r=n(9249),o=n(7371),a=n(8106),i=n(551),l=n(7896),c=n(977),s=n(5667),u=n.n(s),d=n(8613),f=n(8753),p=n(8870),h=n(969),v=n(1742),m=h.createContext({});!function(){var e=0}();var g=n(405),y=n(6530),b=n(6522),x=n(6666),w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>H});var r=n(6666),o=n(7896),a=n(3028),i=n(969);const l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z"}}]},name:"double-left",theme:"outlined"};var c=n(2365),s=function(e,t){return i.createElement(c.Z,(0,a.Z)((0,a.Z)({},e),{},{ref:t,icon:l}))};s.displayName="DoubleLeftOutlined";const u=i.forwardRef(s);const d={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z"}}]},name:"double-right",theme:"outlined"};var f=function(e,t){return i.createElement(c.Z,(0,a.Z)((0,a.Z)({},e),{},{ref:t,icon:d}))};f.displayName="DoubleRightOutlined";const p=i.forwardRef(f);const h={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var v=function(e,t){return i.createElement(c.Z,(0,a.Z)((0,a.Z)({},e),{},{ref:t,icon:h}))};v.displayName="LeftOutlined";const m=i.forwardRef(v);var g=n(4620),y=n(5667),b=n.n(y),x=n(9249),w=n(7371),k=n(8106),C=n(551);const S=function(e){var t,n="".concat(e.rootPrefixCls,"-item"),o=b()(n,"".concat(n,"-").concat(e.page),(t={},(0,r.Z)(t,"".concat(n,"-active"),e.active),(0,r.Z)(t,"".concat(n,"-disabled"),!e.page),(0,r.Z)(t,e.className,!!e.className),t));return i.createElement("li",{title:e.showTitle?e.page:null,className:o,onClick:function(){e.onClick(e.page)},onKeyPress:function(t){e.onKeyPress(t,e.onClick,e.page)},tabIndex:"0"},e.itemRender(e.page,"page",i.createElement("a",{rel:"nofollow"},e.page)))},E=13,j=38,O=40;var _=function(e){(0,k.Z)(n,e);var t=(0,C.Z)(n);function n(){var e;(0,x.Z)(this,n);for(var r=arguments.length,o=new Array(r),a=0;a=0||t.relatedTarget.className.indexOf("".concat(a,"-item"))>=0)||o(e.getValidValue()))},e.go=function(t){""!==e.state.goInputText&&(t.keyCode!==E&&"click"!==t.type||(e.setState({goInputText:""}),e.props.quickGo(e.getValidValue())))},e}return(0,w.Z)(n,[{key:"getValidValue",value:function(){var e=this.state.goInputText;return!e||isNaN(e)?void 0:Number(e)}},{key:"getPageSizeOptions",value:function(){var e=this.props,t=e.pageSize,n=e.pageSizeOptions;return n.some((function(e){return e.toString()===t.toString()}))?n:n.concat([t.toString()]).sort((function(e,t){return(isNaN(Number(e))?0:Number(e))-(isNaN(Number(t))?0:Number(t))}))}},{key:"render",value:function(){var e=this,t=this.props,n=t.pageSize,r=t.locale,o=t.rootPrefixCls,a=t.changeSize,l=t.quickGo,c=t.goButton,s=t.selectComponentClass,u=t.buildOptionText,d=t.selectPrefixCls,f=t.disabled,p=this.state.goInputText,h="".concat(o,"-options"),v=s,m=null,g=null,y=null;if(!a&&!l)return null;var b=this.getPageSizeOptions();if(a&&v){var x=b.map((function(t,n){return i.createElement(v.Option,{key:n,value:t.toString()},(u||e.buildOptionText)(t))}));m=i.createElement(v,{disabled:f,prefixCls:d,showSearch:!1,className:"".concat(h,"-size-changer"),optionLabelProp:"children",dropdownMatchSelectWidth:!1,value:(n||b[0]).toString(),onChange:this.changeSize,getPopupContainer:function(e){return e.parentNode},"aria-label":r.page_size,defaultOpen:!1},x)}return l&&(c&&(y="boolean"===typeof c?i.createElement("button",{type:"button",onClick:this.go,onKeyUp:this.go,disabled:f,className:"".concat(h,"-quick-jumper-button")},r.jump_to_confirm):i.createElement("span",{onClick:this.go,onKeyUp:this.go},c)),g=i.createElement("div",{className:"".concat(h,"-quick-jumper")},r.jump_to,i.createElement("input",{disabled:f,type:"text",value:p,onChange:this.handleChange,onKeyUp:this.go,onBlur:this.handleBlur,"aria-label":r.page}),r.page,y)),i.createElement("li",{className:"".concat(h)},m,g)}}]),n}(i.Component);_.defaultProps={pageSizeOptions:["10","20","50","100"]};const N=_;function P(){}function Z(e){var t=Number(e);return"number"===typeof t&&!isNaN(t)&&isFinite(t)&&Math.floor(t)===t}function M(e,t,n){var r="undefined"===typeof e?t.pageSize:e;return Math.floor((n.total-1)/r)+1}var T=function(e){(0,k.Z)(n,e);var t=(0,C.Z)(n);function n(e){var r;(0,x.Z)(this,n),(r=t.call(this,e)).getJumpPrevPage=function(){return Math.max(1,r.state.current-(r.props.showLessItems?3:5))},r.getJumpNextPage=function(){return Math.min(M(void 0,r.state,r.props),r.state.current+(r.props.showLessItems?3:5))},r.getItemIcon=function(e,t){var n=r.props.prefixCls,o=e||i.createElement("button",{type:"button","aria-label":t,className:"".concat(n,"-item-link")});return"function"===typeof e&&(o=i.createElement(e,(0,a.Z)({},r.props))),o},r.savePaginationNode=function(e){r.paginationNode=e},r.isValid=function(e){var t=r.props.total;return Z(e)&&e!==r.state.current&&Z(t)&&t>0},r.shouldDisplayQuickJumper=function(){var e=r.props,t=e.showQuickJumper;return!(e.total<=r.state.pageSize)&&t},r.handleKeyDown=function(e){e.keyCode!==j&&e.keyCode!==O||e.preventDefault()},r.handleKeyUp=function(e){var t=r.getValidValue(e);t!==r.state.currentInputValue&&r.setState({currentInputValue:t}),e.keyCode===E?r.handleChange(t):e.keyCode===j?r.handleChange(t-1):e.keyCode===O&&r.handleChange(t+1)},r.handleBlur=function(e){var t=r.getValidValue(e);r.handleChange(t)},r.changePageSize=function(e){var t=r.state.current,n=M(e,r.state,r.props);t=t>n?n:t,0===n&&(t=r.state.current),"number"===typeof e&&("pageSize"in r.props||r.setState({pageSize:e}),"current"in r.props||r.setState({current:t,currentInputValue:t})),r.props.onShowSizeChange(t,e),"onChange"in r.props&&r.props.onChange&&r.props.onChange(t,e)},r.handleChange=function(e){var t=r.props,n=t.disabled,o=t.onChange,a=r.state,i=a.pageSize,l=a.current,c=a.currentInputValue;if(r.isValid(e)&&!n){var s=M(void 0,r.state,r.props),u=e;return e>s?u=s:e<1&&(u=1),"current"in r.props||r.setState({current:u}),u!==c&&r.setState({currentInputValue:u}),o(u,i),u}return l},r.prev=function(){r.hasPrev()&&r.handleChange(r.state.current-1)},r.next=function(){r.hasNext()&&r.handleChange(r.state.current+1)},r.jumpPrev=function(){r.handleChange(r.getJumpPrevPage())},r.jumpNext=function(){r.handleChange(r.getJumpNextPage())},r.hasPrev=function(){return r.state.current>1},r.hasNext=function(){return r.state.current2?n-2:0),o=2;o=n?n:Number(t)}},{key:"getShowSizeChanger",value:function(){var e=this.props,t=e.showSizeChanger,n=e.total,r=e.totalBoundaryShowSizeChanger;return"undefined"!==typeof t?t:n>r}},{key:"renderPrev",value:function(e){var t=this.props,n=t.prevIcon,r=(0,t.itemRender)(e,"prev",this.getItemIcon(n,"prev page")),o=!this.hasPrev();return(0,i.isValidElement)(r)?(0,i.cloneElement)(r,{disabled:o}):r}},{key:"renderNext",value:function(e){var t=this.props,n=t.nextIcon,r=(0,t.itemRender)(e,"next",this.getItemIcon(n,"next page")),o=!this.hasNext();return(0,i.isValidElement)(r)?(0,i.cloneElement)(r,{disabled:o}):r}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,a=t.className,l=t.style,c=t.disabled,s=t.hideOnSinglePage,u=t.total,d=t.locale,f=t.showQuickJumper,p=t.showLessItems,h=t.showTitle,v=t.showTotal,m=t.simple,g=t.itemRender,y=t.showPrevNextJumpers,x=t.jumpPrevIcon,w=t.jumpNextIcon,k=t.selectComponentClass,C=t.selectPrefixCls,E=t.pageSizeOptions,j=this.state,O=j.current,_=j.pageSize,P=j.currentInputValue;if(!0===s&&u<=_)return null;var Z=M(void 0,this.state,this.props),T=[],I=null,A=null,R=null,D=null,L=null,F=f&&f.goButton,z=p?1:2,B=O-1>0?O-1:0,U=O+1=2*z&&3!==O&&(T[0]=(0,i.cloneElement)(T[0],{className:"".concat(n,"-item-after-jump-prev")}),T.unshift(I)),Z-O>=2*z&&O!==Z-2&&(T[T.length-1]=(0,i.cloneElement)(T[T.length-1],{className:"".concat(n,"-item-before-jump-next")}),T.push(A)),1!==$&&T.unshift(R),G!==Z&&T.push(D)}var J=null;v&&(J=i.createElement("li",{className:"".concat(n,"-total-text")},v(u,[0===u?0:(O-1)*_+1,O*_>u?u:O*_])));var ee=!this.hasPrev()||!Z,te=!this.hasNext()||!Z;return i.createElement("ul",(0,o.Z)({className:b()(n,a,(0,r.Z)({},"".concat(n,"-disabled"),c)),style:l,unselectable:"unselectable",ref:this.savePaginationNode},V),J,i.createElement("li",{title:h?d.prev_page:null,onClick:this.prev,tabIndex:ee?null:0,onKeyPress:this.runIfEnterPrev,className:b()("".concat(n,"-prev"),(0,r.Z)({},"".concat(n,"-disabled"),ee)),"aria-disabled":ee},this.renderPrev(B)),T,i.createElement("li",{title:h?d.next_page:null,onClick:this.next,tabIndex:te?null:0,onKeyPress:this.runIfEnterNext,className:b()("".concat(n,"-next"),(0,r.Z)({},"".concat(n,"-disabled"),te)),"aria-disabled":te},this.renderNext(U)),i.createElement(N,{disabled:c,locale:d,rootPrefixCls:n,selectComponentClass:k,selectPrefixCls:C,changeSize:this.getShowSizeChanger()?this.changePageSize:null,current:O,pageSize:_,pageSizeOptions:E,quickGo:this.shouldDisplayQuickJumper()?this.handleChange:null,goButton:F}))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n={};if("current"in e&&(n.current=e.current,e.current!==t.current&&(n.currentInputValue=n.current)),"pageSize"in e&&e.pageSize!==t.pageSize){var r=t.current,o=M(e.pageSize,t,e);r=r>o?o:r,"current"in e||(n.current=r,n.currentInputValue=r),n.pageSize=e.pageSize}return n}}]),n}(i.Component);T.defaultProps={defaultCurrent:1,total:0,defaultPageSize:10,onChange:P,className:"",selectPrefixCls:"rc-select",prefixCls:"rc-pagination",selectComponentClass:null,hideOnSinglePage:!1,showPrevNextJumpers:!0,showQuickJumper:!1,showLessItems:!1,showTitle:!0,onShowSizeChange:P,locale:{items_per_page:"\u6761/\u9875",jump_to:"\u8df3\u81f3",jump_to_confirm:"\u786e\u5b9a",page:"\u9875",prev_page:"\u4e0a\u4e00\u9875",next_page:"\u4e0b\u4e00\u9875",prev_5:"\u5411\u524d 5 \u9875",next_5:"\u5411\u540e 5 \u9875",prev_3:"\u5411\u524d 3 \u9875",next_3:"\u5411\u540e 3 \u9875",page_size:"\u9875\u7801"},style:{},itemRender:function(e,t,n){return n},totalBoundaryShowSizeChanger:50};const I=T;var A=n(7144),R=n(1742),D=n(7048),L=n(6570),F=n(9673),z=function(e){return i.createElement(F.Z,(0,o.Z)({},e,{size:"small"}))},B=function(e){return i.createElement(F.Z,(0,o.Z)({},e,{size:"middle"}))};z.Option=F.Z.Option,B.Option=F.Z.Option;var U=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>K});var r=n(6666),o=n(7896),a=n(315),i=n(8052),l=n(3063),c=n(8107),s=n(5667),u=n.n(s),d=n(8870),f=n(969),p=n(1742),h=n(4141),v=n(1370),m=n(2159),g={className:"",percent:0,prefixCls:"rc-progress",strokeColor:"#2db7f5",strokeLinecap:"round",strokeWidth:1,style:{},trailColor:"#D9D9D9",trailWidth:1,gapPosition:"bottom"},y=function(){var e=(0,f.useRef)([]),t=(0,f.useRef)(null);return(0,f.useEffect)((function(){var n=Date.now(),r=!1;e.current.forEach((function(e){if(e){r=!0;var o=e.style;o.transitionDuration=".3s, .3s, .3s, .06s",t.current&&n-t.current<100&&(o.transitionDuration="0s, 0s")}})),r&&(t.current=Date.now())})),e.current},b=["className","percent","prefixCls","strokeColor","strokeLinecap","strokeWidth","style","trailColor","trailWidth","transition"],x=function(e){var t=e.className,n=e.percent,r=e.prefixCls,a=e.strokeColor,i=e.strokeLinecap,l=e.strokeWidth,c=e.style,s=e.trailColor,d=e.trailWidth,p=e.transition,h=(0,m.Z)(e,b);delete h.gapPosition;var v=Array.isArray(n)?n:[n],g=Array.isArray(a)?a:[a],x=y(),w=l/2,k=100-l/2,C="M ".concat("round"===i?w:0,",").concat(w,"\n L ").concat("round"===i?k:100,",").concat(w),S="0 0 100 ".concat(l),E=0;return f.createElement("svg",(0,o.Z)({className:u()("".concat(r,"-line"),t),viewBox:S,preserveAspectRatio:"none",style:c},h),f.createElement("path",{className:"".concat(r,"-line-trail"),d:C,strokeLinecap:i,stroke:s,strokeWidth:d||l,fillOpacity:"0"}),v.map((function(e,t){var n=1;switch(i){case"round":n=1-l/100;break;case"square":n=1-l/2/100;break;default:n=1}var o={strokeDasharray:"".concat(e*n,"px, 100px"),strokeDashoffset:"-".concat(E,"px"),transition:p||"stroke-dashoffset 0.3s ease 0s, stroke-dasharray .3s ease 0s, stroke 0.3s linear"},a=g[t]||g[g.length-1];return E+=e,f.createElement("path",{key:t,className:"".concat(r,"-line-path"),d:C,strokeLinecap:i,stroke:a,strokeWidth:l,fillOpacity:"0",ref:function(e){x[t]=e},style:o})})))};x.defaultProps=g,x.displayName="Line";var w=n(6522),k=n(6234),C=n(3126),S=0,E=(0,C.Z)();const j=function(e){var t=f.useState(),n=(0,k.Z)(t,2),r=n[0],o=n[1];return f.useEffect((function(){o("rc_progress_".concat(function(){var e;return E?(e=S,S+=1):e="TEST_OR_SSR",e}()))}),[]),e||r};var O=["id","prefixCls","strokeWidth","trailWidth","gapDegree","gapPosition","trailColor","strokeLinecap","style","className","strokeColor","percent"];function _(e){return+e.replace("%","")}function N(e){var t=null!==e&&void 0!==e?e:[];return Array.isArray(t)?t:[t]}var P=100,Z=function(e,t,n,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5?arguments[5]:void 0,i=arguments.length>6?arguments[6]:void 0,l=arguments.length>7?arguments[7]:void 0,c=o>0?90+o/2:-90,s=2*Math.PI*e,u=s*((360-o)/360),d=t/100*360*((360-o)/360),f=0===o?0:{bottom:0,top:180,left:90,right:-90}[a],p=(100-n)/100*u;return"round"===i&&100!==n&&(p+=l/2)>=u&&(p=u-.01),{stroke:"string"===typeof r?r:void 0,strokeDasharray:"".concat(u,"px ").concat(s),strokeDashoffset:p,transform:"rotate(".concat(c+d+f,"deg)"),transformOrigin:"50% 50%",transition:"stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s, opacity .3s ease 0s",fillOpacity:0}},M=function(e){var t=e.id,n=e.prefixCls,r=e.strokeWidth,a=e.trailWidth,i=e.gapDegree,l=e.gapPosition,c=e.trailColor,s=e.strokeLinecap,d=e.style,p=e.className,h=e.strokeColor,v=e.percent,g=(0,m.Z)(e,O),b=j(t),x="".concat(b,"-gradient"),k=50-r/2,C=Z(k,0,100,c,i,l,s,r),S=N(v),E=N(h),M=E.find((function(e){return e&&"object"===(0,w.Z)(e)})),T=y();return f.createElement("svg",(0,o.Z)({className:u()("".concat(n,"-circle"),p),viewBox:"0 0 ".concat(P," ").concat(P),style:d,id:t},g),M&&f.createElement("defs",null,f.createElement("linearGradient",{id:x,x1:"100%",y1:"0%",x2:"0%",y2:"0%"},Object.keys(M).sort((function(e,t){return _(e)-_(t)})).map((function(e,t){return f.createElement("stop",{key:t,offset:e,stopColor:M[e]})})))),f.createElement("circle",{className:"".concat(n,"-circle-trail"),r:k,cx:50,cy:50,stroke:c,strokeLinecap:s,strokeWidth:a||r,style:C}),function(){var e=0;return S.map((function(t,o){var a=E[o]||E[E.length-1],c=a&&"object"===(0,w.Z)(a)?"url(#".concat(x,")"):void 0,u=Z(k,e,t,a,i,l,s,r);return e+=t,f.createElement("circle",{key:o,className:"".concat(n,"-circle-path"),r:k,cx:50,cy:50,stroke:c,strokeLinecap:s,strokeWidth:r,opacity:0===t?0:1,style:u,ref:function(e){T[o]=e}})})).reverse()}())};M.defaultProps=g,M.displayName="Circle";const T=M;function I(e){return!e||e<0?0:e>100?100:e}function A(e){var t=e.success,n=e.successPercent;return t&&"progress"in t&&(n=t.progress),t&&"percent"in t&&(n=t.percent),n}function R(e){var t=e.percent,n=I(A({success:e.success,successPercent:e.successPercent}));return[n,I(I(t)-n)]}const D=function(e){var t=e.prefixCls,n=e.width,o=e.strokeWidth,a=e.trailColor,i=void 0===a?null:a,l=e.strokeLinecap,c=void 0===l?"round":l,s=e.gapPosition,d=e.gapDegree,p=e.type,h=e.children,m=e.success,g=n||120,y={width:g,height:g,fontSize:.15*g+6},b=o||6,x=s||"dashboard"===p&&"bottom"||void 0,w="[object Object]"===Object.prototype.toString.call(e.strokeColor),k=function(e){var t=e.success,n=void 0===t?{}:t,r=e.strokeColor;return[n.strokeColor||v.ez.green,r||null]}({success:m,strokeColor:e.strokeColor}),C=u()("".concat(t,"-inner"),(0,r.Z)({},"".concat(t,"-circle-gradient"),w));return f.createElement("div",{className:C,style:y},f.createElement(T,{percent:R(e),strokeWidth:b,trailWidth:b,strokeColor:k,strokeLinecap:c,trailColor:i,prefixCls:t,gapDegree:d||0===d?d:"dashboard"===p?75:void 0,gapPosition:x}),h)};var L=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o=100?"success":t||"normal"}(),Z=function(t,n){var r,o=e.format,s=A(e);if(!w)return null;var u="line"===C;return o||"exception"!==n&&"success"!==n?r=(o||function(e){return"".concat(e,"%")})(I(g),I(s)):"exception"===n?r=u?f.createElement(l.Z,null):f.createElement(c.Z,null):"success"===n&&(r=u?f.createElement(a.Z,null):f.createElement(i.Z,null)),f.createElement("span",{className:"".concat(t,"-text"),title:"string"===typeof r?r:void 0},r)}(N,P),M=Array.isArray(v)?v[0]:v,T="string"===typeof v||Array.isArray(v)?v:void 0;"line"===C?E=h?f.createElement(B,(0,o.Z)({},e,{strokeColor:T,prefixCls:N,steps:h}),Z):f.createElement(z,(0,o.Z)({},e,{strokeColor:M,prefixCls:N,direction:_}),Z):"circle"!==C&&"dashboard"!==C||(E=f.createElement(D,(0,o.Z)({},e,{strokeColor:M,prefixCls:N,progressStatus:P}),Z));var R=u()(N,(t={},(0,r.Z)(t,"".concat(N,"-").concat(("dashboard"===C?"circle":h&&"steps")||C),!0),(0,r.Z)(t,"".concat(N,"-status-").concat(P),!0),(0,r.Z)(t,"".concat(N,"-show-info"),w),(0,r.Z)(t,"".concat(N,"-").concat(b),b),(0,r.Z)(t,"".concat(N,"-rtl"),"rtl"===_),t),s);return f.createElement("div",(0,o.Z)({},(0,d.Z)(S,["status","format","trailColor","strokeWidth","width","gapDegree","gapPosition","strokeLinecap","success","successPercent"]),{className:R}),E)},K=H},7364:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>Z});var r=n(7896),o=n(6666),a=n(6234),i=n(5667),l=n.n(i),c=n(1978),s=n(969),u=n(1742),d=n(945),f=n(7756),p=s.createContext(null),h=p.Provider;const v=p;var m=s.createContext(null),g=m.Provider,y=n(4786),b=n(125),x=n(9842),w=n(4549),k=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o0&&(F=E.map((function(e){return"string"===typeof e||"number"===typeof e?s.createElement(S,{key:e.toString(),prefixCls:D,disabled:_,value:e,checked:b===e},e):s.createElement(S,{key:"radio-group-value-options-".concat(e.value),prefixCls:D,disabled:e.disabled||_,value:e.value,checked:b===e.value,style:e.style},e.label)})));var z=P||m,B=l()(L,"".concat(L,"-").concat(O),(n={},(0,o.Z)(n,"".concat(L,"-").concat(z),z),(0,o.Z)(n,"".concat(L,"-rtl"),"rtl"===v),n),C);return s.createElement("div",(0,r.Z)({},(0,f.Z)(e),{className:B,style:Z,onMouseEnter:T,onMouseLeave:I,onFocus:A,onBlur:R,id:M,ref:t}),s.createElement(h,{value:{onChange:function(t){var n=b,r=t.target.value;"value"in e||x(r);var o=e.onChange;o&&r!==n&&o(t)},value:b,disabled:e.disabled,name:e.name,optionType:e.optionType}},F))}));const j=s.memo(E);var O=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>Ue});var r=n(6666),o=n(7896),a=n(5667),i=n.n(a),l=n(8079),c=n(3028),s=n(6234),u=n(2159),d=n(6522),f=n(1978),p=n(5277),h=n(969),v=n(4184),m=n(9086),g=n(125),y=n(2968),b=n(6840);function x(e,t){var n,r=e.key;return"value"in e&&(n=e.value),null!==r&&void 0!==r?r:void 0!==n?n:"rc-index-key-".concat(t)}function w(e,t){var n=e||{};return{label:n.label||(t?"children":"label"),value:n.value||"value",options:n.options||"options"}}function k(e){var t=(0,c.Z)({},e);return"props"in t||Object.defineProperty(t,"props",{get:function(){return(0,p.ZP)(!1,"Return type is option instead of Option instance. Please read value directly instead of reading from `props`."),t}}),t}var C=n(7218),S=["prefixCls","disabled","visible","children","popupElement","containerWidth","animation","transitionName","dropdownStyle","dropdownClassName","direction","placement","dropdownMatchSelectWidth","dropdownRender","dropdownAlign","getPopupContainer","empty","getTriggerDOMNode","onPopupVisibleChange","onPopupMouseEnter"],E=function(e,t){var n=e.prefixCls,a=(e.disabled,e.visible),l=e.children,s=e.popupElement,d=e.containerWidth,f=e.animation,p=e.transitionName,v=e.dropdownStyle,m=e.dropdownClassName,g=e.direction,y=void 0===g?"ltr":g,b=e.placement,x=e.dropdownMatchSelectWidth,w=e.dropdownRender,k=e.dropdownAlign,E=e.getPopupContainer,j=e.empty,O=e.getTriggerDOMNode,_=e.onPopupVisibleChange,N=e.onPopupMouseEnter,P=(0,u.Z)(e,S),Z="".concat(n,"-dropdown"),M=s;w&&(M=w(s));var T=h.useMemo((function(){return function(e){var t=!0===e?0:1;return{bottomLeft:{points:["tl","bl"],offset:[0,4],overflow:{adjustX:t,adjustY:1}},bottomRight:{points:["tr","br"],offset:[0,4],overflow:{adjustX:t,adjustY:1}},topLeft:{points:["bl","tl"],offset:[0,-4],overflow:{adjustX:t,adjustY:1}},topRight:{points:["br","tr"],offset:[0,-4],overflow:{adjustX:t,adjustY:1}}}}(x)}),[x]),I=f?"".concat(Z,"-").concat(f):p,A=h.useRef(null);h.useImperativeHandle(t,(function(){return{getPopupElement:function(){return A.current}}}));var R=(0,c.Z)({minWidth:d},v);return"number"===typeof x?R.width=x:x&&(R.width=d),h.createElement(C.Z,(0,o.Z)({},P,{showAction:_?["click"]:[],hideAction:_?["click"]:[],popupPlacement:b||("rtl"===y?"bottomRight":"bottomLeft"),builtinPlacements:T,prefixCls:Z,popupTransitionName:I,popup:h.createElement("div",{ref:A,onMouseEnter:N},M),popupAlign:k,popupVisible:a,getPopupContainer:E,popupClassName:i()(m,(0,r.Z)({},"".concat(Z,"-empty"),j)),popupStyle:R,getTriggerDOMNode:O,onPopupVisibleChange:_}),l)},j=h.forwardRef(E);j.displayName="SelectTrigger";const O=j;var _=n(605),N=n(1594);const P=function(e){var t,n=e.className,r=e.customizeIcon,o=e.customizeIconProps,a=e.onMouseDown,l=e.onClick,c=e.children;return t="function"===typeof r?r(o):r,h.createElement("span",{className:n,onMouseDown:function(e){e.preventDefault(),a&&a(e)},style:{userSelect:"none",WebkitUserSelect:"none"},unselectable:"on",onClick:l,"aria-hidden":!0},void 0!==t?t:h.createElement("span",{className:i()(n.split(/\s+/).map((function(e){return"".concat(e,"-icon")})))},c))};var Z=function(e,t){var n,r,o=e.prefixCls,a=e.id,l=e.inputElement,s=e.disabled,u=e.tabIndex,d=e.autoFocus,f=e.autoComplete,v=e.editable,m=e.activeDescendantId,y=e.value,b=e.maxLength,x=e.onKeyDown,w=e.onMouseDown,k=e.onChange,C=e.onPaste,S=e.onCompositionStart,E=e.onCompositionEnd,j=e.open,O=e.attrs,_=l||h.createElement("input",null),N=_,P=N.ref,Z=N.props,M=Z.onKeyDown,T=Z.onChange,I=Z.onMouseDown,A=Z.onCompositionStart,R=Z.onCompositionEnd,D=Z.style;return(0,p.Kp)(!("maxLength"in _.props),"Passing 'maxLength' to input element directly may not work because input in BaseSelect is controlled."),_=h.cloneElement(_,(0,c.Z)((0,c.Z)((0,c.Z)({type:"search"},Z),{},{id:a,ref:(0,g.sQ)(t,P),disabled:s,tabIndex:u,autoComplete:f||"off",autoFocus:d,className:i()("".concat(o,"-selection-search-input"),null===(n=_)||void 0===n||null===(r=n.props)||void 0===r?void 0:r.className),role:"combobox","aria-expanded":j,"aria-haspopup":"listbox","aria-owns":"".concat(a,"_list"),"aria-autocomplete":"list","aria-controls":"".concat(a,"_list"),"aria-activedescendant":m},O),{},{value:v?y:"",maxLength:b,readOnly:!v,unselectable:v?null:"on",style:(0,c.Z)((0,c.Z)({},D),{},{opacity:v?null:0}),onKeyDown:function(e){x(e),M&&M(e)},onMouseDown:function(e){w(e),I&&I(e)},onChange:function(e){k(e),T&&T(e)},onCompositionStart:function(e){S(e),A&&A(e)},onCompositionEnd:function(e){E(e),R&&R(e)},onPaste:C}))},M=h.forwardRef(Z);M.displayName="Input";const T=M;function I(e){return Array.isArray(e)?e:void 0!==e?[e]:[]}var A="undefined"!==typeof window&&window.document&&window.document.documentElement;function R(e){var t;return null!==(t=e.key)&&void 0!==t?t:e.value}var D=function(e){e.preventDefault(),e.stopPropagation()};const L=function(e){var t,n,o=e.id,a=e.prefixCls,l=e.values,c=e.open,u=e.searchValue,d=e.inputRef,f=e.placeholder,p=e.disabled,v=e.mode,m=e.showSearch,g=e.autoFocus,y=e.autoComplete,b=e.activeDescendantId,x=e.tabIndex,w=e.removeIcon,k=e.maxTagCount,C=e.maxTagTextLength,S=e.maxTagPlaceholder,E=void 0===S?function(e){return"+ ".concat(e.length," ...")}:S,j=e.tagRender,O=e.onToggleOpen,Z=e.onRemove,M=e.onInputChange,I=e.onInputPaste,L=e.onInputKeyDown,F=e.onInputMouseDown,z=e.onInputCompositionStart,B=e.onInputCompositionEnd,U=h.useRef(null),V=(0,h.useState)(0),H=(0,s.Z)(V,2),K=H[0],W=H[1],Y=(0,h.useState)(!1),q=(0,s.Z)(Y,2),$=q[0],G=q[1],X="".concat(a,"-selection"),Q=c||"tags"===v?u:"",J="tags"===v||m&&(c||$);function ee(e,t,n,o,a){return h.createElement("span",{className:i()("".concat(X,"-item"),(0,r.Z)({},"".concat(X,"-item-disabled"),n)),title:"string"===typeof e||"number"===typeof e?e.toString():void 0},h.createElement("span",{className:"".concat(X,"-item-content")},t),o&&h.createElement(P,{className:"".concat(X,"-item-remove"),onMouseDown:D,onClick:a,customizeIcon:w},"\xd7"))}t=function(){W(U.current.scrollWidth)},n=[Q],A?h.useLayoutEffect(t,n):h.useEffect(t,n);var te=h.createElement("div",{className:"".concat(X,"-search"),style:{width:K},onFocus:function(){G(!0)},onBlur:function(){G(!1)}},h.createElement(T,{ref:d,open:c,prefixCls:a,id:o,inputElement:null,disabled:p,autoFocus:g,autoComplete:y,editable:J,activeDescendantId:b,value:Q,onKeyDown:L,onMouseDown:F,onChange:M,onPaste:I,onCompositionStart:z,onCompositionEnd:B,tabIndex:x,attrs:(0,_.Z)(e,!0)}),h.createElement("span",{ref:U,className:"".concat(X,"-search-mirror"),"aria-hidden":!0},Q,"\xa0")),ne=h.createElement(N.Z,{prefixCls:"".concat(X,"-overflow"),data:l,renderItem:function(e){var t=e.disabled,n=e.label,r=e.value,o=!p&&!t,a=n;if("number"===typeof C&&("string"===typeof n||"number"===typeof n)){var i=String(a);i.length>C&&(a="".concat(i.slice(0,C),"..."))}var l=function(t){t&&t.stopPropagation(),Z(e)};return"function"===typeof j?function(e,t,n,r,o){return h.createElement("span",{onMouseDown:function(e){D(e),O(!c)}},j({label:t,value:e,disabled:n,closable:r,onClose:o}))}(r,a,t,o,l):ee(n,a,t,o,l)},renderRest:function(e){var t="function"===typeof E?E(e):E;return ee(t,t,!1)},suffix:te,itemKey:R,maxCount:k});return h.createElement(h.Fragment,null,ne,!l.length&&!Q&&h.createElement("span",{className:"".concat(X,"-placeholder")},f))};const F=function(e){var t=e.inputElement,n=e.prefixCls,r=e.id,o=e.inputRef,a=e.disabled,i=e.autoFocus,l=e.autoComplete,c=e.activeDescendantId,u=e.mode,d=e.open,f=e.values,p=e.placeholder,v=e.tabIndex,m=e.showSearch,g=e.searchValue,y=e.activeValue,b=e.maxLength,x=e.onInputKeyDown,w=e.onInputMouseDown,k=e.onInputChange,C=e.onInputPaste,S=e.onInputCompositionStart,E=e.onInputCompositionEnd,j=h.useState(!1),O=(0,s.Z)(j,2),N=O[0],P=O[1],Z="combobox"===u,M=Z||m,I=f[0],A=g||"";Z&&y&&!N&&(A=y),h.useEffect((function(){Z&&P(!1)}),[Z,y]);var R=!("combobox"!==u&&!d&&!m)&&!!A,D=!I||"string"!==typeof I.label&&"number"!==typeof I.label?void 0:I.label.toString();return h.createElement(h.Fragment,null,h.createElement("span",{className:"".concat(n,"-selection-search")},h.createElement(T,{ref:o,prefixCls:n,id:r,open:d,inputElement:t,disabled:a,autoFocus:i,autoComplete:l,editable:M,activeDescendantId:c,value:A,onKeyDown:x,onMouseDown:w,onChange:function(e){P(!0),k(e)},onPaste:C,onCompositionStart:S,onCompositionEnd:E,tabIndex:v,attrs:(0,_.Z)(e,!0),maxLength:Z?b:void 0})),!Z&&I&&!R&&h.createElement("span",{className:"".concat(n,"-selection-item"),title:D},I.label),function(){if(I)return null;var e=R?{visibility:"hidden"}:void 0;return h.createElement("span",{className:"".concat(n,"-selection-placeholder"),style:e},p)}())};function z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:250,t=h.useRef(null),n=h.useRef(null);function r(r){(r||null===t.current)&&(t.current=r),window.clearTimeout(n.current),n.current=window.setTimeout((function(){t.current=null}),e)}return h.useEffect((function(){return function(){window.clearTimeout(n.current)}}),[]),[function(){return t.current},r]}var B=function(e,t){var n=(0,h.useRef)(null),r=(0,h.useRef)(!1),a=e.prefixCls,i=e.open,l=e.mode,c=e.showSearch,u=e.tokenWithEnter,d=e.onSearch,f=e.onSearchSubmit,p=e.onToggleOpen,m=e.onInputKeyDown,g=e.domRef;h.useImperativeHandle(t,(function(){return{focus:function(){n.current.focus()},blur:function(){n.current.blur()}}}));var y=z(0),b=(0,s.Z)(y,2),x=b[0],w=b[1],k=(0,h.useRef)(null),C=function(e){!1!==d(e,!0,r.current)&&p(!0)},S={inputRef:n,onInputKeyDown:function(e){var t,n=e.which;n!==v.Z.UP&&n!==v.Z.DOWN||e.preventDefault(),m&&m(e),n!==v.Z.ENTER||"tags"!==l||r.current||i||null===f||void 0===f||f(e.target.value),t=n,[v.Z.ESC,v.Z.SHIFT,v.Z.BACKSPACE,v.Z.TAB,v.Z.WIN_KEY,v.Z.ALT,v.Z.META,v.Z.WIN_KEY_RIGHT,v.Z.CTRL,v.Z.SEMICOLON,v.Z.EQUALS,v.Z.CAPS_LOCK,v.Z.CONTEXT_MENU,v.Z.F1,v.Z.F2,v.Z.F3,v.Z.F4,v.Z.F5,v.Z.F6,v.Z.F7,v.Z.F8,v.Z.F9,v.Z.F10,v.Z.F11,v.Z.F12].includes(t)||p(!0)},onInputMouseDown:function(){w(!0)},onInputChange:function(e){var t=e.target.value;if(u&&k.current&&/[\r\n]/.test(k.current)){var n=k.current.replace(/[\r\n]+$/,"").replace(/\r\n/g," ").replace(/[\r\n]/g," ");t=t.replace(n,k.current)}k.current=null,C(t)},onInputPaste:function(e){var t=e.clipboardData.getData("text");k.current=t},onInputCompositionStart:function(){r.current=!0},onInputCompositionEnd:function(e){r.current=!1,"combobox"!==l&&C(e.target.value)}},E="multiple"===l||"tags"===l?h.createElement(L,(0,o.Z)({},e,S)):h.createElement(F,(0,o.Z)({},e,S));return h.createElement("div",{ref:g,className:"".concat(a,"-selector"),onClick:function(e){e.target!==n.current&&(void 0!==document.body.style.msTouchAction?setTimeout((function(){n.current.focus()})):n.current.focus())},onMouseDown:function(e){var t=x();e.target===n.current||t||e.preventDefault(),("combobox"===l||c&&t)&&i||(i&&d("",!0,!1),p())}},E)},U=h.forwardRef(B);U.displayName="Selector";const V=U;var H=h.createContext(null);var K=["id","prefixCls","className","showSearch","tagRender","direction","omitDomProps","displayValues","onDisplayValuesChange","emptyOptions","notFoundContent","onClear","mode","disabled","loading","getInputElement","getRawInputElement","open","defaultOpen","onDropdownVisibleChange","activeValue","onActiveValueChange","activeDescendantId","searchValue","onSearch","onSearchSplit","tokenSeparators","allowClear","showArrow","inputIcon","clearIcon","OptionList","animation","transitionName","dropdownStyle","dropdownClassName","dropdownMatchSelectWidth","dropdownRender","dropdownAlign","placement","getPopupContainer","showAction","onFocus","onBlur","onKeyUp","onKeyDown","onMouseDown"],W=["value","onChange","removeIcon","placeholder","autoFocus","maxTagCount","maxTagTextLength","maxTagPlaceholder","choiceTransitionName","onInputKeyDown","onPopupScroll","tabIndex"];function Y(e){return"tags"===e||"multiple"===e}var q=h.forwardRef((function(e,t){var n,a,p=e.id,x=e.prefixCls,w=e.className,k=e.showSearch,C=e.tagRender,S=e.direction,E=e.omitDomProps,j=e.displayValues,_=e.onDisplayValuesChange,N=e.emptyOptions,Z=e.notFoundContent,M=void 0===Z?"Not Found":Z,T=e.onClear,I=e.mode,A=e.disabled,R=e.loading,D=e.getInputElement,L=e.getRawInputElement,F=e.open,B=e.defaultOpen,U=e.onDropdownVisibleChange,q=e.activeValue,$=e.onActiveValueChange,G=e.activeDescendantId,X=e.searchValue,Q=e.onSearch,J=e.onSearchSplit,ee=e.tokenSeparators,te=e.allowClear,ne=e.showArrow,re=e.inputIcon,oe=e.clearIcon,ae=e.OptionList,ie=e.animation,le=e.transitionName,ce=e.dropdownStyle,se=e.dropdownClassName,ue=e.dropdownMatchSelectWidth,de=e.dropdownRender,fe=e.dropdownAlign,pe=e.placement,he=e.getPopupContainer,ve=e.showAction,me=void 0===ve?[]:ve,ge=e.onFocus,ye=e.onBlur,be=e.onKeyUp,xe=e.onKeyDown,we=e.onMouseDown,ke=(0,u.Z)(e,K),Ce=Y(I),Se=(void 0!==k?k:Ce)||"combobox"===I,Ee=(0,c.Z)({},ke);W.forEach((function(e){delete Ee[e]})),null===E||void 0===E||E.forEach((function(e){delete Ee[e]}));var je=h.useState(!1),Oe=(0,s.Z)(je,2),_e=Oe[0],Ne=Oe[1];h.useEffect((function(){Ne((0,m.Z)())}),[]);var Pe=h.useRef(null),Ze=h.useRef(null),Me=h.useRef(null),Te=h.useRef(null),Ie=h.useRef(null),Ae=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,t=h.useState(!1),n=(0,s.Z)(t,2),r=n[0],o=n[1],a=h.useRef(null),i=function(){window.clearTimeout(a.current)};return h.useEffect((function(){return i}),[]),[r,function(t,n){i(),a.current=window.setTimeout((function(){o(t),n&&n()}),e)},i]}(),Re=(0,s.Z)(Ae,3),De=Re[0],Le=Re[1],Fe=Re[2];h.useImperativeHandle(t,(function(){var e,t;return{focus:null===(e=Te.current)||void 0===e?void 0:e.focus,blur:null===(t=Te.current)||void 0===t?void 0:t.blur,scrollTo:function(e){var t;return null===(t=Ie.current)||void 0===t?void 0:t.scrollTo(e)}}}));var ze=h.useMemo((function(){var e;if("combobox"!==I)return X;var t=null===(e=j[0])||void 0===e?void 0:e.value;return"string"===typeof t||"number"===typeof t?String(t):""}),[X,I,j]),Be="combobox"===I&&"function"===typeof D&&D()||null,Ue="function"===typeof L&&L(),Ve=(0,g.x1)(Ze,null===Ue||void 0===Ue||null===(n=Ue.props)||void 0===n?void 0:n.ref),He=(0,f.Z)(void 0,{defaultValue:B,value:F}),Ke=(0,s.Z)(He,2),We=Ke[0],Ye=Ke[1],qe=We,$e=!M&&N;(A||$e&&qe&&"combobox"===I)&&(qe=!1);var Ge=!$e&&qe,Xe=h.useCallback((function(e){var t=void 0!==e?e:!qe;qe===t||A||(Ye(t),null===U||void 0===U||U(t))}),[A,qe,Ye,U]),Qe=h.useMemo((function(){return(ee||[]).some((function(e){return["\n","\r\n"].includes(e)}))}),[ee]),Je=function(e,t,n){var r=!0,o=e;null===$||void 0===$||$(null);var a=n?null:function(e,t){if(!t||!t.length)return null;var n=!1,r=function e(t,r){var o=(0,b.Z)(r),a=o[0],i=o.slice(1);if(!a)return[t];var c=t.split(a);return n=n||c.length>1,c.reduce((function(t,n){return[].concat((0,l.Z)(t),(0,l.Z)(e(n,i)))}),[]).filter((function(e){return e}))}(e,t);return n?r:null}(e,ee);return"combobox"!==I&&a&&(o="",null===J||void 0===J||J(a),Xe(!1),r=!1),Q&&ze!==o&&Q(o,{source:t?"typing":"effect"}),r};h.useEffect((function(){qe||Ce||"combobox"===I||Je("",!1,!1)}),[qe]),h.useEffect((function(){We&&A&&Ye(!1),A&&Le(!1)}),[A]);var et=z(),tt=(0,s.Z)(et,2),nt=tt[0],rt=tt[1],ot=h.useRef(!1),at=[];h.useEffect((function(){return function(){at.forEach((function(e){return clearTimeout(e)})),at.splice(0,at.length)}}),[]);var it,lt=h.useState(null),ct=(0,s.Z)(lt,2),st=ct[0],ut=ct[1],dt=h.useState({}),ft=(0,s.Z)(dt,2)[1];(0,y.Z)((function(){if(Ge){var e,t=Math.ceil(null===(e=Pe.current)||void 0===e?void 0:e.offsetWidth);st===t||Number.isNaN(t)||ut(t)}}),[Ge]),Ue&&(it=function(e){Xe(e)}),function(e,t,n,r){var o=h.useRef(null);o.current={open:t,triggerOpen:n,customizedTrigger:r},h.useEffect((function(){function t(t){var n;if(!(null===(n=o.current)||void 0===n?void 0:n.customizedTrigger)){var r=t.target;r.shadowRoot&&t.composed&&(r=t.composedPath()[0]||r),o.current.open&&e().filter((function(e){return e})).every((function(e){return!e.contains(r)&&e!==r}))&&o.current.triggerOpen(!1)}}return window.addEventListener("mousedown",t),function(){return window.removeEventListener("mousedown",t)}}),[])}((function(){var e;return[Pe.current,null===(e=Me.current)||void 0===e?void 0:e.getPopupElement()]}),Ge,Xe,!!Ue);var pt,ht,vt=h.useMemo((function(){return(0,c.Z)((0,c.Z)({},e),{},{notFoundContent:M,open:qe,triggerOpen:Ge,id:p,showSearch:Se,multiple:Ce,toggleOpen:Xe})}),[e,M,Ge,qe,p,Se,Ce,Xe]),mt=void 0!==ne?ne:R||!Ce&&"combobox"!==I;mt&&(pt=h.createElement(P,{className:i()("".concat(x,"-arrow"),(0,r.Z)({},"".concat(x,"-arrow-loading"),R)),customizeIcon:re,customizeIconProps:{loading:R,searchValue:ze,open:qe,focused:De,showSearch:Se}}));!A&&te&&(j.length||ze)&&(ht=h.createElement(P,{className:"".concat(x,"-clear"),onMouseDown:function(){null===T||void 0===T||T(),_([],{type:"clear",values:j}),Je("",!1,!1)},customizeIcon:oe},"\xd7"));var gt,yt=h.createElement(ae,{ref:Ie}),bt=i()(x,w,(a={},(0,r.Z)(a,"".concat(x,"-focused"),De),(0,r.Z)(a,"".concat(x,"-multiple"),Ce),(0,r.Z)(a,"".concat(x,"-single"),!Ce),(0,r.Z)(a,"".concat(x,"-allow-clear"),te),(0,r.Z)(a,"".concat(x,"-show-arrow"),mt),(0,r.Z)(a,"".concat(x,"-disabled"),A),(0,r.Z)(a,"".concat(x,"-loading"),R),(0,r.Z)(a,"".concat(x,"-open"),qe),(0,r.Z)(a,"".concat(x,"-customize-input"),Be),(0,r.Z)(a,"".concat(x,"-show-search"),Se),a)),xt=h.createElement(O,{ref:Me,disabled:A,prefixCls:x,visible:Ge,popupElement:yt,containerWidth:st,animation:ie,transitionName:le,dropdownStyle:ce,dropdownClassName:se,direction:S,dropdownMatchSelectWidth:ue,dropdownRender:de,dropdownAlign:fe,placement:pe,getPopupContainer:he,empty:N,getTriggerDOMNode:function(){return Ze.current},onPopupVisibleChange:it,onPopupMouseEnter:function(){ft({})}},Ue?h.cloneElement(Ue,{ref:Ve}):h.createElement(V,(0,o.Z)({},e,{domRef:Ze,prefixCls:x,inputElement:Be,ref:Te,id:p,showSearch:Se,mode:I,activeDescendantId:G,tagRender:C,values:j,open:qe,onToggleOpen:Xe,activeValue:q,searchValue:ze,onSearch:Je,onSearchSubmit:function(e){e&&e.trim()&&Q(e,{source:"submit"})},onRemove:function(e){var t=j.filter((function(t){return t!==e}));_(t,{type:"remove",values:[e]})},tokenWithEnter:Qe})));return gt=Ue?xt:h.createElement("div",(0,o.Z)({className:bt},Ee,{ref:Pe,onMouseDown:function(e){var t,n=e.target,r=null===(t=Me.current)||void 0===t?void 0:t.getPopupElement();if(r&&r.contains(n)){var o=setTimeout((function(){var e,t=at.indexOf(o);-1!==t&&at.splice(t,1),Fe(),_e||r.contains(document.activeElement)||null===(e=Te.current)||void 0===e||e.focus()}));at.push(o)}for(var a=arguments.length,i=new Array(a>1?a-1:0),l=1;l=0;i-=1){var c=o[i];if(!c.disabled){o.splice(i,1),a=c;break}}a&&_(o,{type:"remove",values:[a]})}for(var s=arguments.length,u=new Array(s>1?s-1:0),d=1;d1?t-1:0),r=1;r1&&void 0!==arguments[1]&&arguments[1];return(0,te.Z)(e).map((function(e,n){if(!h.isValidElement(e)||!e.type)return null;var r=e.type.isSelectOptGroup,o=e.key,a=e.props,i=a.children,l=(0,u.Z)(a,re);return t||!r?oe(e):(0,c.Z)((0,c.Z)({key:"__RC_SELECT_GRP__".concat(null===o?n:o,"__"),label:o},l),{},{options:ae(i)})})).filter((function(e){return e}))}function ie(e,t,n,r,o){return h.useMemo((function(){var a=e;!e&&(a=ae(t));var i=new Map,l=new Map,c=function(e,t,n){n&&"string"===typeof n&&e.set(t[n],t)};return function e(t){for(var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=0;s1&&void 0!==arguments[1]?arguments[1]:1,n=I.length,r=0;r1&&void 0!==arguments[1]&&arguments[1];U(e);var n={source:t?"keyboard":"mouse"},r=I[e];r?k(r.value,e,n):k(null,-1,n)};(0,h.useEffect)((function(){V(!1!==C?L(0):-1)}),[I.length,m]);var K=h.useCallback((function(e){return j.has(e)&&"combobox"!==p}),[p,(0,l.Z)(j).toString()]);(0,h.useEffect)((function(){var e,t=setTimeout((function(){if(!f&&d&&1===j.size){var e=Array.from(j)[0],t=I.findIndex((function(t){return t.data.value===e}));-1!==t&&(V(t),D(t))}}));d&&(null===(e=A.current)||void 0===e||e.scrollTo(void 0));return function(){return clearTimeout(t)}}),[d,m]);var W=function(e){void 0!==e&&S(e,{selected:!j.has(e)}),f||g(!1)};if(h.useImperativeHandle(t,(function(){return{onKeyDown:function(e){var t=e.which,n=e.ctrlKey;switch(t){case v.Z.N:case v.Z.P:case v.Z.UP:case v.Z.DOWN:var r=0;if(t===v.Z.UP?r=-1:t===v.Z.DOWN?r=1:/(mac\sos|macintosh)/i.test(navigator.appVersion)&&n&&(t===v.Z.N?r=1:t===v.Z.P&&(r=-1)),0!==r){var o=L(B+r,r);D(o),V(o,!0)}break;case v.Z.ENTER:var a=I[B];a&&!a.data.disabled?W(a.value):W(void 0),d&&e.preventDefault();break;case v.Z.ESC:g(!1),d&&e.stopPropagation()}},onKeyUp:function(){},scrollTo:function(e){D(e)}}})),0===I.length)return h.createElement("div",{role:"listbox",id:"".concat(c,"_list"),className:"".concat(T,"-empty"),onMouseDown:R},y);var Y=Object.keys(O).map((function(e){return O[e]})),q=function(e){return e.label},$=function(e){var t=I[e];if(!t)return null;var n=t.data||{},r=n.value,a=t.group,i=(0,_.Z)(n,!0),l=q(t);return t?h.createElement("div",(0,o.Z)({"aria-label":"string"!==typeof l||a?null:l},i,{key:e,role:a?"presentation":"option",id:"".concat(c,"_list_").concat(e),"aria-selected":K(r)}),r):null};return h.createElement(h.Fragment,null,h.createElement("div",{role:"listbox",id:"".concat(c,"_list"),style:{height:0,width:0,overflow:"hidden"}},$(B-1),$(B),$(B+1)),h.createElement(he.Z,{itemKey:"key",ref:A,data:I,height:Z,itemHeight:M,fullHeight:!1,onMouseDown:R,onScroll:b,virtual:N},(function(e,t){var n,a=e.group,l=e.groupOption,c=e.data,s=e.label,d=e.value,f=c.key;if(a){var p,v=null!==(p=c.title)&&void 0!==p?p:ge(s)?s.toString():void 0;return h.createElement("div",{className:i()(T,"".concat(T,"-group")),title:v},void 0!==s?s:f)}var m=c.disabled,g=c.title,y=(c.children,c.style),b=c.className,x=(0,u.Z)(c,me),w=(0,fe.Z)(x,Y),k=K(d),C="".concat(T,"-option"),S=i()(T,C,b,(n={},(0,r.Z)(n,"".concat(C,"-grouped"),l),(0,r.Z)(n,"".concat(C,"-active"),B===t&&!m),(0,r.Z)(n,"".concat(C,"-disabled"),m),(0,r.Z)(n,"".concat(C,"-selected"),k),n)),j=q(e),O=!E||"function"===typeof E||k,N="number"===typeof j?j:j||d,Z=ge(N)?N.toString():void 0;return void 0!==g&&(Z=g),h.createElement("div",(0,o.Z)({},(0,_.Z)(w),{"aria-selected":k,className:S,title:Z,onMouseMove:function(){B===t||m||V(t)},onClick:function(){m||W(d)},style:y}),h.createElement("div",{className:"".concat(C,"-content")},N),h.isValidElement(E)||k,O&&h.createElement(P,{className:"".concat(T,"-option-state"),customizeIcon:E,customizeIconProps:{isSelected:k}},k?"\u2713":null))})))},be=h.forwardRef(ye);be.displayName="OptionList";const xe=be;var we=["id","mode","prefixCls","backfill","fieldNames","inputValue","searchValue","onSearch","autoClearSearchValue","onSelect","onDeselect","dropdownMatchSelectWidth","filterOption","filterSort","optionFilterProp","optionLabelProp","options","children","defaultActiveFirstOption","menuItemSelectedIcon","virtual","listHeight","listItemHeight","value","defaultValue","labelInValue","onChange"],ke=["inputValue"];var Ce=h.forwardRef((function(e,t){var n=e.id,a=e.mode,i=e.prefixCls,p=void 0===i?"rc-select":i,v=e.backfill,m=e.fieldNames,g=e.inputValue,y=e.searchValue,b=e.onSearch,C=e.autoClearSearchValue,S=void 0===C||C,E=e.onSelect,j=e.onDeselect,O=e.dropdownMatchSelectWidth,_=void 0===O||O,N=e.filterOption,P=e.filterSort,Z=e.optionFilterProp,M=e.optionLabelProp,T=e.options,A=e.children,R=e.defaultActiveFirstOption,D=e.menuItemSelectedIcon,L=e.virtual,F=e.listHeight,z=void 0===F?200:F,B=e.listItemHeight,U=void 0===B?20:B,V=e.value,H=e.defaultValue,K=e.labelInValue,W=e.onChange,q=(0,u.Z)(e,we),X=ee(n),Q=Y(a),J=!(T||!A),te=h.useMemo((function(){return(void 0!==N||"combobox"!==a)&&N}),[N,a]),ne=h.useMemo((function(){return w(m,J)}),[JSON.stringify(m),J]),re=(0,f.Z)("",{value:void 0!==y?y:g,postState:function(e){return e||""}}),oe=(0,s.Z)(re,2),ae=oe[0],ce=oe[1],se=ie(T,A,ne,Z,M),ue=se.valueOptions,de=se.labelOptions,fe=se.options,pe=h.useCallback((function(e){return I(e).map((function(e){var t,n,r,o,a;(function(e){return!e||"object"!==(0,d.Z)(e)})(e)?t=e:(r=e.key,n=e.label,t=null!==(a=e.value)&&void 0!==a?a:r);var i,l=ue.get(t);l&&(void 0===n&&(n=null===l||void 0===l?void 0:l[M||ne.label]),void 0===r&&(r=null!==(i=null===l||void 0===l?void 0:l.key)&&void 0!==i?i:t),o=null===l||void 0===l?void 0:l.disabled);return{label:n,value:t,key:r,disabled:o}}))}),[ne,M,ue]),he=(0,f.Z)(H,{value:V}),me=(0,s.Z)(he,2),ge=me[0],ye=me[1],be=function(e,t){var n=h.useRef({values:new Map,options:new Map});return[h.useMemo((function(){var r=n.current,o=r.values,a=r.options,i=e.map((function(e){var t;return void 0===e.label?(0,c.Z)((0,c.Z)({},e),{},{label:null===(t=o.get(e.value))||void 0===t?void 0:t.label}):e})),l=new Map,s=new Map;return i.forEach((function(e){l.set(e.value,e),s.set(e.value,t.get(e.value)||a.get(e.value))})),n.current.values=l,n.current.options=s,i}),[e,t]),h.useCallback((function(e){return t.get(e)||n.current.options.get(e)}),[t])]}(h.useMemo((function(){var e,t=pe(ge);return"combobox"!==a||(null===(e=t[0])||void 0===e?void 0:e.value)?t:[]}),[ge,pe,a]),ue),Ce=(0,s.Z)(be,2),Se=Ce[0],Ee=Ce[1],je=h.useMemo((function(){if(!a&&1===Se.length){var e=Se[0];if(null===e.value&&(null===e.label||void 0===e.label))return[]}return Se.map((function(e){var t;return(0,c.Z)((0,c.Z)({},e),{},{label:null!==(t=e.label)&&void 0!==t?t:e.value})}))}),[a,Se]),Oe=h.useMemo((function(){return new Set(Se.map((function(e){return e.value})))}),[Se]);h.useEffect((function(){if("combobox"===a){var e,t=null===(e=Se[0])||void 0===e?void 0:e.value;void 0!==t&&null!==t&&ce(String(t))}}),[Se]);var _e=le((function(e,t){var n,o=null!==t&&void 0!==t?t:e;return n={},(0,r.Z)(n,ne.value,e),(0,r.Z)(n,ne.label,o),n})),Ne=function(e,t,n,o,a){return h.useMemo((function(){if(!n||!1===o)return e;var i=t.options,l=t.label,s=t.value,u=[],d="function"===typeof o,f=n.toUpperCase(),p=d?o:function(e,t){return a?G(t[a],f):t[i]?G(t["children"!==l?l:"label"],f):G(t[s],f)},h=d?function(e){return k(e)}:function(e){return e};return e.forEach((function(e){if(e[i])if(p(n,h(e)))u.push(e);else{var t=e[i].filter((function(e){return p(n,h(e))}));t.length&&u.push((0,c.Z)((0,c.Z)({},e),{},(0,r.Z)({},i,t)))}else p(n,h(e))&&u.push(e)})),u}),[e,o,a,n,t])}(h.useMemo((function(){if("tags"!==a)return fe;var e=(0,l.Z)(fe);return(0,l.Z)(Se).sort((function(e,t){return e.value1&&void 0!==arguments[1]?arguments[1]:{},n=t.fieldNames,r=t.childrenAsData,o=[],a=w(n,!1),i=a.label,l=a.value,c=a.options;function s(e,t){e.forEach((function(e){var n=e[i];if(t||!(c in e)){var a=e[l];o.push({key:x(e,o.length),groupOption:t,data:e,label:n,value:a})}else{var u=n;void 0===u&&r&&(u=e.label),o.push({key:x(e,o.length),group:!0,data:e,label:u}),s(e[c],!0)}}))}return s(e,!1),o}(Ze,{fieldNames:ne,childrenAsData:J})}),[Ze,ne,J]),Te=function(e){var t=pe(e);if(ye(t),W&&(t.length!==Se.length||t.some((function(e,t){var n;return(null===(n=Se[t])||void 0===n?void 0:n.value)!==(null===e||void 0===e?void 0:e.value)})))){var n=K?t:t.map((function(e){return e.value})),r=t.map((function(e){return k(Ee(e.value))}));W(Q?n:n[0],Q?r:r[0])}},Ie=h.useState(null),Ae=(0,s.Z)(Ie,2),Re=Ae[0],De=Ae[1],Le=h.useState(0),Fe=(0,s.Z)(Le,2),ze=Fe[0],Be=Fe[1],Ue=void 0!==R?R:"combobox"!==a,Ve=h.useCallback((function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.source,o=void 0===r?"keyboard":r;Be(t),v&&"combobox"===a&&null!==e&&"keyboard"===o&&De(String(e))}),[v,a]),He=function(e,t){var n=function(){var t,n=Ee(e);return[K?{label:null===n||void 0===n?void 0:n[ne.label],value:e,key:null!==(t=null===n||void 0===n?void 0:n.key)&&void 0!==t?t:e}:e,k(n)]};if(t&&E){var r=n(),o=(0,s.Z)(r,2),a=o[0],i=o[1];E(a,i)}else if(!t&&j){var l=n(),c=(0,s.Z)(l,2),u=c[0],d=c[1];j(u,d)}},Ke=le((function(e,t){var n,r=!Q||t.selected;n=r?Q?[].concat((0,l.Z)(Se),[e]):[e]:Se.filter((function(t){return t.value!==e})),Te(n),He(e,r),"combobox"===a?De(""):Y&&!S||(ce(""),De(""))})),We=h.useMemo((function(){var e=!1!==L&&!1!==_;return(0,c.Z)((0,c.Z)({},se),{},{flattenOptions:Me,onActiveValue:Ve,defaultActiveFirstOption:Ue,onSelect:Ke,menuItemSelectedIcon:D,rawValues:Oe,fieldNames:ne,virtual:e,listHeight:z,listItemHeight:U,childrenAsData:J})}),[se,Me,Ve,Ue,Ke,D,Oe,ne,L,_,z,U,J]);return h.createElement(ve.Provider,{value:We},h.createElement($,(0,o.Z)({},q,{id:X,prefixCls:p,ref:t,omitDomProps:ke,mode:a,displayValues:je,onDisplayValuesChange:function(e,t){Te(e),"remove"!==t.type&&"clear"!==t.type||t.values.forEach((function(e){He(e.value,!1)}))},searchValue:ae,onSearch:function(e,t){if(ce(e),De(null),"submit"!==t.source)"blur"!==t.source&&("combobox"===a&&Te(e),null===b||void 0===b||b(e));else{var n=(e||"").trim();if(n){var r=Array.from(new Set([].concat((0,l.Z)(Oe),[n])));Te(r),He(n,!0),ce("")}}},onSearchSplit:function(e){var t=e;"tags"!==a&&(t=e.map((function(e){var t=de.get(e);return null===t||void 0===t?void 0:t.value})).filter((function(e){return void 0!==e})));var n=Array.from(new Set([].concat((0,l.Z)(Oe),(0,l.Z)(t))));Te(n),n.forEach((function(e){He(e,!0)}))},dropdownMatchSelectWidth:_,OptionList:xe,emptyOptions:!Me.length,activeValue:Re,activeDescendantId:"".concat(X,"_list_").concat(ze)})))}));Ce.Option=de,Ce.OptGroup=se;const Se=Ce;var Ee=n(1742),je=n(2913),Oe=n(9842),_e=n(945),Ne=n(4549),Pe=n(405),Ze=n(4771),Me=n(8052),Te=n(3063),Ie=n(8107),Ae=n(9362),Re=n(7987),De=n(8399);var Le=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{u:()=>h,Z:()=>m});var r=n(7896),o=n(6666),a=n(6234),i=n(5667),l=n.n(i),c=n(2148),s=n(969),u=n(1742),d=n(5517);function f(e){var t=e.className,n=e.direction,a=e.index,i=e.marginDirection,l=e.children,c=e.split,u=e.wrap,d=s.useContext(h),f=d.horizontalSize,p=d.verticalSize,v=d.latestIndex,m={};return d.supportFlexGap||("vertical"===n?a{"use strict";n.d(t,{Z:()=>k});var r=n(7896),o=n(6666),a=n(9249),i=n(7371),l=n(8106),c=n(551),s=n(5667),u=n.n(s),d=n(7917),f=n.n(d),p=n(8870),h=n(969),v=n(1742),m=n(6530),g=n(4141),y=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{"use strict";n.d(t,{Z:()=>Qr});var r=n(6522),o=n(6666),a=n(6234),i=n(7896),l=n(5667),c=n.n(l),s=n(3028),u=n(8079),d=n(969),f=n(2523),p=n(605),h=n(7326),v=n(1806),m=n.n(v),g=n(5277),y=n(4480),b=n(3114);const x=function(e){return null};const w=function(e){return null};var k=n(2159),C=n(125);function S(e){return void 0===e||null===e?[]:Array.isArray(e)?e:[e]}function E(e,t){if(!t&&"number"!==typeof t)return e;for(var n=S(t),r=e,o=0;o=n}(n,p||1,null===e||void 0===e?void 0:e.startRow,null===e||void 0===e?void 0:e.endRow);return{onHover:null===e||void 0===e?void 0:e.onHover,hovering:t}})),v=h.onHover,g=h.hovering;return d.createElement(F,(0,i.Z)({},e,{colSpan:f,rowSpan:p,hovering:g,ref:t,onHover:v}))}));z.displayName="WrappedCell";const B=z;const U=d.createContext(null);function V(e,t,n,r,o){var a,i,l=n[e]||{},c=n[t]||{};"left"===l.fixed?a=r.left[e]:"right"===c.fixed&&(i=r.right[t]);var s=!1,u=!1,d=!1,f=!1,p=n[t+1],h=n[e-1];if("rtl"===o){if(void 0!==a)f=!(h&&"left"===h.fixed);else if(void 0!==i){d=!(p&&"right"===p.fixed)}}else if(void 0!==a){s=!(p&&"left"===p.fixed)}else if(void 0!==i){u=!(h&&"right"===h.fixed)}return{fixLeft:a,fixRight:i,lastFixLeft:s,firstFixRight:u,lastFixRight:d,firstFixLeft:f,isSticky:r.isSticky}}function H(e){var t,n=e.cells,r=e.stickyOffsets,o=e.flattenColumns,a=e.rowComponent,l=e.cellComponent,c=e.onHeaderRow,s=e.index,u=d.useContext(U),f=u.prefixCls,p=u.direction;c&&(t=c(n.map((function(e){return e.column})),s));var h=j(n.map((function(e){return e.column})));return d.createElement(a,t,n.map((function(e,t){var n,a=e.column,c=V(e.colStart,e.colEnd,o,r,p);return a&&a.onHeaderCell&&(n=e.column.onHeaderCell(a)),d.createElement(B,(0,i.Z)({},e,{ellipsis:a.ellipsis,align:a.align,component:l,prefixCls:f,key:h[t]},c,{additionalProps:n,rowType:"header"}))})))}H.displayName="HeaderRow";const K=H;const W=function(e){var t=e.stickyOffsets,n=e.columns,r=e.flattenColumns,o=e.onHeaderRow,a=d.useContext(U),i=a.prefixCls,l=a.getComponent,c=d.useMemo((function(){return function(e){var t=[];!function e(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;t[o]=t[o]||[];var a=r;return n.filter(Boolean).map((function(n){var r={key:n.key,className:n.className||"",children:n.title,column:n,colStart:a},i=1,l=n.children;return l&&l.length>0&&(i=e(l,a,o+1).reduce((function(e,t){return e+t}),0),r.hasSubColumns=!0),"colSpan"in n&&(i=n.colSpan),"rowSpan"in n&&(r.rowSpan=n.rowSpan),r.colSpan=i,r.colEnd=r.colStart+i-1,t[o].push(r),a+=i,i}))}(e,0);for(var n=t.length,r=function(e){t[e].forEach((function(t){"rowSpan"in t||t.hasSubColumns||(t.rowSpan=n-e)}))},o=0;o1?n-1:0),a=1;a0?[].concat((0,u.Z)(e),(0,u.Z)(de(o).map((function(e){return(0,s.Z)({fixed:r},e)})))):[].concat((0,u.Z)(e),[(0,s.Z)((0,s.Z)({},t),{},{fixed:r})])}),[])}const fe=function(e,t){var n=e.prefixCls,r=e.columns,a=e.children,i=e.expandable,l=e.expandedKeys,c=e.getRowKey,u=e.onTriggerExpand,f=e.expandIcon,p=e.rowExpandable,h=e.expandIconColumnIndex,v=e.direction,m=e.expandRowByClick,g=e.columnWidth,y=e.fixed,b=d.useMemo((function(){return r||ue(a)}),[r,a]),x=d.useMemo((function(){if(i){var e,t=b.slice();if(!t.includes(le)){var r=h||0;r>=0&&t.splice(r,0,le)}0;var a=t.indexOf(le);t=t.filter((function(e,t){return e!==le||t===a}));var s,v=b[a];s="left"!==y&&!y||h?"right"!==y&&!y||h!==b.length?v?v.fixed:null:"right":"left";var x=(e={},(0,o.Z)(e,ie,{className:"".concat(n,"-expand-icon-col"),columnType:"EXPAND_COLUMN"}),(0,o.Z)(e,"title",""),(0,o.Z)(e,"fixed",s),(0,o.Z)(e,"className","".concat(n,"-row-expand-icon-cell")),(0,o.Z)(e,"width",g),(0,o.Z)(e,"render",(function(e,t,r){var o=c(t,r),a=l.has(o),i=!p||p(t),s=f({prefixCls:n,expanded:a,expandable:i,record:t,onExpand:u});return m?d.createElement("span",{onClick:function(e){return e.stopPropagation()}},s):s})),e);return t.map((function(e){return e===le?x:e}))}return b.filter((function(e){return e!==le}))}),[i,b,c,l,f,v]),w=d.useMemo((function(){var e=x;return t&&(e=t(e)),e.length||(e=[{render:function(){return null}}]),e}),[t,x,v]),C=d.useMemo((function(){return"rtl"===v?function(e){return e.map((function(e){var t=e.fixed,n=(0,k.Z)(e,se),r=t;return"left"===t?r="right":"right"===t&&(r="left"),(0,s.Z)({fixed:r},n)}))}(de(w)):de(w)}),[w,v]);return[w,C]};function pe(e){var t=(0,d.useRef)(e),n=(0,d.useState)({}),r=(0,a.Z)(n,2)[1],o=(0,d.useRef)(null),i=(0,d.useRef)([]);return(0,d.useEffect)((function(){return function(){o.current=null}}),[]),[t.current,function(e){i.current.push(e);var n=Promise.resolve();o.current=n,n.then((function(){if(o.current===n){var e=i.current,a=t.current;i.current=[],e.forEach((function(e){t.current=e(t.current)})),o.current=null,a!==t.current&&r({})}}))}]}const he=function(e,t,n){return(0,d.useMemo)((function(){for(var r=[],o=[],a=0,i=0,l=0;l=0;a-=1){var l=t[a],c=n&&n[a],s=c&&c[ie];if(l||s||o){var u=s||{},f=(u.columnType,(0,k.Z)(u,ve));r.unshift(d.createElement("col",(0,i.Z)({key:a,style:{width:l}},f))),o=!0}}return d.createElement("colgroup",null,r)};const ge=function(e){var t=e.className,n=e.children;return d.createElement("div",{className:t},n)};const ye=d.createContext({});var be=["children"];function xe(e){return e.children}xe.Row=function(e){var t=e.children,n=(0,k.Z)(e,be);return d.createElement("tr",n,t)},xe.Cell=function(e){var t=e.className,n=e.index,r=e.children,o=e.colSpan,a=void 0===o?1:o,l=e.rowSpan,c=e.align,s=d.useContext(U),u=s.prefixCls,f=s.direction,p=d.useContext(ye),h=p.scrollColumnIndex,v=p.stickyOffsets,m=n+a-1+1===h?a+1:a,g=V(n,n+m-1,p.flattenColumns,v,f);return d.createElement(B,(0,i.Z)({className:t,index:n,component:"td",prefixCls:u,record:null,dataIndex:null,align:c,colSpan:m,rowSpan:l,render:function(){return r}},g))};const we=xe;const ke=function(e){var t=e.children,n=e.stickyOffsets,r=e.flattenColumns,o=d.useContext(U).prefixCls,a=r.length-1,i=r[a],l=d.useMemo((function(){return{stickyOffsets:n,flattenColumns:r,scrollColumnIndex:(null===i||void 0===i?void 0:i.scrollbar)?a:null}}),[i,r,a,n]);return d.createElement(ye.Provider,{value:l},d.createElement("tfoot",{className:"".concat(o,"-summary")},t))};var Ce=we;function Se(e){var t,n=e.prefixCls,r=e.record,a=e.onExpand,i=e.expanded,l=e.expandable,s="".concat(n,"-row-expand-icon");if(!l)return d.createElement("span",{className:c()(s,"".concat(n,"-row-spaced"))});return d.createElement("span",{className:c()(s,(t={},(0,o.Z)(t,"".concat(n,"-row-expanded"),i),(0,o.Z)(t,"".concat(n,"-row-collapsed"),!i),t)),onClick:function(e){a(r,e),e.stopPropagation()}})}var Ee=n(197);function je(e){var t=e.getBoundingClientRect(),n=document.documentElement;return{left:t.left+(window.pageXOffset||n.scrollLeft)-(n.clientLeft||document.body.clientLeft||0),top:t.top+(window.pageYOffset||n.scrollTop)-(n.clientTop||document.body.clientTop||0)}}var Oe=function(e,t){var n,r,i=e.scrollBodyRef,l=e.onScroll,u=e.offsetScroll,f=e.container,p=d.useContext(U).prefixCls,h=(null===(n=i.current)||void 0===n?void 0:n.scrollWidth)||0,v=(null===(r=i.current)||void 0===r?void 0:r.clientWidth)||0,m=h&&v*(v/h),g=d.useRef(),y=pe({scrollLeft:0,isHiddenScrollBar:!1}),x=(0,a.Z)(y,2),w=x[0],k=x[1],C=d.useRef({delta:0,x:0}),S=d.useState(!1),E=(0,a.Z)(S,2),j=E[0],O=E[1],_=function(){O(!1)},N=function(e){var t,n=(e||(null===(t=window)||void 0===t?void 0:t.event)).buttons;if(j&&0!==n){var r=C.current.x+e.pageX-C.current.x-C.current.delta;r<=0&&(r=0),r+m>=v&&(r=v-m),l({scrollLeft:r/v*(h+2)}),C.current.x=e.pageX}else j&&O(!1)},P=function(){if(i.current){var e=je(i.current).top,t=e+i.current.offsetHeight,n=f===window?document.documentElement.scrollTop+window.innerHeight:je(f).top+f.clientHeight;t-(0,b.Z)()<=n||e>=n-u?k((function(e){return(0,s.Z)((0,s.Z)({},e),{},{isHiddenScrollBar:!0})})):k((function(e){return(0,s.Z)((0,s.Z)({},e),{},{isHiddenScrollBar:!1})}))}},Z=function(e){k((function(t){return(0,s.Z)((0,s.Z)({},t),{},{scrollLeft:e/h*v||0})}))};return d.useImperativeHandle(t,(function(){return{setScrollLeft:Z}})),d.useEffect((function(){var e=(0,Ee.Z)(document.body,"mouseup",_,!1),t=(0,Ee.Z)(document.body,"mousemove",N,!1);return P(),function(){e.remove(),t.remove()}}),[m,j]),d.useEffect((function(){var e=(0,Ee.Z)(f,"scroll",P,!1),t=(0,Ee.Z)(window,"resize",P,!1);return function(){e.remove(),t.remove()}}),[f]),d.useEffect((function(){w.isHiddenScrollBar||k((function(e){var t=i.current;return t?(0,s.Z)((0,s.Z)({},e),{},{scrollLeft:t.scrollLeft/t.scrollWidth*t.clientWidth}):e}))}),[w.isHiddenScrollBar]),h<=v||!m||w.isHiddenScrollBar?null:d.createElement("div",{style:{height:(0,b.Z)(),width:v,bottom:u},className:"".concat(p,"-sticky-scroll")},d.createElement("div",{onMouseDown:function(e){e.persist(),C.current.delta=e.pageX-w.scrollLeft,C.current.x=0,O(!0),e.preventDefault()},ref:g,className:c()("".concat(p,"-sticky-scroll-bar"),(0,o.Z)({},"".concat(p,"-sticky-scroll-bar-active"),j)),style:{width:"".concat(m,"px"),transform:"translate3d(".concat(w.scrollLeft,"px, 0, 0)")}}))};const _e=d.forwardRef(Oe);var Ne=(0,n(3126).Z)()?window:null;var Pe=["className","noData","columns","flattenColumns","colWidths","columCount","stickyOffsets","direction","fixHeader","stickyTopOffset","stickyBottomOffset","stickyClassName","onScroll","maxContentScroll","children"];var Ze=d.forwardRef((function(e,t){var n=e.className,r=e.noData,a=e.columns,i=e.flattenColumns,l=e.colWidths,f=e.columCount,p=e.stickyOffsets,h=e.direction,v=e.fixHeader,m=e.stickyTopOffset,g=e.stickyBottomOffset,y=e.stickyClassName,b=e.onScroll,x=e.maxContentScroll,w=e.children,S=(0,k.Z)(e,Pe),E=d.useContext(U),j=E.prefixCls,O=E.scrollbarSize,_=E.isSticky,N=_&&!v?0:O,P=d.useRef(null),Z=d.useCallback((function(e){(0,C.mH)(t,e),(0,C.mH)(P,e)}),[]);d.useEffect((function(){var e;function t(e){var t=e.currentTarget,n=e.deltaX;n&&(b({currentTarget:t,scrollLeft:t.scrollLeft+n}),e.preventDefault())}return null===(e=P.current)||void 0===e||e.addEventListener("wheel",t),function(){var e;null===(e=P.current)||void 0===e||e.removeEventListener("wheel",t)}}),[]);var M=d.useMemo((function(){return i.every((function(e){return e.width>=0}))}),[i]),T=i[i.length-1],I={fixed:T?T.fixed:null,scrollbar:!0,onHeaderCell:function(){return{className:"".concat(j,"-cell-scrollbar")}}},A=(0,d.useMemo)((function(){return N?[].concat((0,u.Z)(a),[I]):a}),[N,a]),R=(0,d.useMemo)((function(){return N?[].concat((0,u.Z)(i),[I]):i}),[N,i]),D=(0,d.useMemo)((function(){var e=p.right,t=p.left;return(0,s.Z)((0,s.Z)({},p),{},{left:"rtl"===h?[].concat((0,u.Z)(t.map((function(e){return e+N}))),[0]):t,right:"rtl"===h?e:[].concat((0,u.Z)(e.map((function(e){return e+N}))),[0]),isSticky:_})}),[N,p,_]),L=function(e,t){return(0,d.useMemo)((function(){for(var n=[],r=0;r0)):(at(a>0),st(a1&&void 0!==arguments[1]?arguments[1]:{},n=t.getContainer,r=void 0===n?function(){return window}:n,o=t.callback,a=t.duration,i=void 0===a?450:a,l=r(),c=Ge(l,!0),s=Date.now(),u=function t(){var n=Date.now()-s,r=qe(n>i?i:n,c,e,i);$e(l)?l.scrollTo(window.pageXOffset,r):l instanceof HTMLDocument||"HTMLDocument"===l.constructor.name?l.documentElement.scrollTop=r:l.scrollTop=r,n1&&void 0!==arguments[1]?arguments[1]:null;return n.map((function(d,f){for(var p,h=Yt(r?r.pos:"0",f),v=Pt(d[a],h),m=0;m1&&void 0!==arguments[1]?arguments[1]:{},n=t.initWrapper,r=t.processEntity,o=t.onProcessFinished,a=t.externalGetKey,i=t.childrenPropName,l=t.fieldNames,c=arguments.length>2?arguments[2]:void 0,s=a||c,u={},d={},f={posEntities:u,keyEntities:d};return n&&(f=n(f)||f),It(e,(function(e){var t=e.node,n=e.index,o=e.pos,a=e.key,i=e.parentPos,l=e.level,c={node:t,nodes:e.nodes,index:n,key:a,pos:o,level:l},s=Pt(a,o);u[o]=c,d[s]=c,c.parent=u[i],c.parent&&(c.parent.children=c.parent.children||[],c.parent.children.push(c)),r&&r(c,f)}),{externalGetKey:s,childrenPropName:i,fieldNames:l}),o&&o(f),f}function Rt(e,t){var n=t.expandedKeys,r=t.selectedKeys,o=t.loadedKeys,a=t.loadingKeys,i=t.checkedKeys,l=t.halfCheckedKeys,c=t.dragOverNodeKey,s=t.dropPosition,u=t.keyEntities[e];return{eventKey:e,expanded:-1!==n.indexOf(e),selected:-1!==r.indexOf(e),loaded:-1!==o.indexOf(e),loading:-1!==a.indexOf(e),checked:-1!==i.indexOf(e),halfChecked:-1!==l.indexOf(e),pos:String(u?u.pos:""),dragOver:c===e&&0===s,dragOverGapTop:c===e&&-1===s,dragOverGapBottom:c===e&&1===s}}function Dt(e){var t=e.data,n=e.expanded,r=e.selected,o=e.checked,a=e.loaded,i=e.loading,l=e.halfChecked,c=e.dragOver,u=e.dragOverGapTop,d=e.dragOverGapBottom,f=e.pos,p=e.active,h=e.eventKey,v=(0,s.Z)((0,s.Z)({},t),{},{expanded:n,selected:r,checked:o,loaded:a,loading:i,halfChecked:l,dragOver:c,dragOverGapTop:u,dragOverGapBottom:d,pos:f,active:p,key:h});return"props"in v||Object.defineProperty(v,"props",{get:function(){return(0,g.ZP)(!1,"Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`."),e}}),v}var Lt=["eventKey","className","style","dragOver","dragOverGapTop","dragOverGapBottom","isLeaf","isStart","isEnd","expanded","selected","checked","halfChecked","loading","domRef","active","data","onMouseMove","selectable"],Ft="open",zt="close",Bt=function(e){(0,Ct.Z)(n,e);var t=(0,St.Z)(n);function n(){var e;(0,xt.Z)(this,n);for(var r=arguments.length,o=new Array(r),a=0;a=0&&n.splice(r,1),n}function Kt(e,t){var n=(e||[]).slice();return-1===n.indexOf(t)&&n.push(t),n}function Wt(e){return e.split("-")}function Yt(e,t){return"".concat(e,"-").concat(t)}function qt(e,t){var n=[];return function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];t.forEach((function(t){var r=t.key,o=t.children;n.push(r),e(o)}))}(t[e].children),n}function $t(e){if(e.parent){var t=Wt(e.pos);return Number(t[t.length-1])===e.parent.children.length-1}return!1}function Gt(e,t,n,r,o,a,i,l,c,s){var u,d=e.clientX,f=e.clientY,p=e.target.getBoundingClientRect(),h=p.top,v=p.height,m=(("rtl"===s?-1:1)*(((null===o||void 0===o?void 0:o.x)||0)-d)-12)/r,g=l[n.props.eventKey];if(f-1.5?a({dragNode:j,dropNode:O,dropPosition:1})?C=1:_=!1:a({dragNode:j,dropNode:O,dropPosition:0})?C=0:a({dragNode:j,dropNode:O,dropPosition:1})?C=1:_=!1:a({dragNode:j,dropNode:O,dropPosition:1})?C=1:_=!1,{dropPosition:C,dropLevelOffset:S,dropTargetKey:g.key,dropTargetPos:g.pos,dragOverNodeKey:k,dropContainerKey:0===C?null:(null===(u=g.parent)||void 0===u?void 0:u.key)||null,dropAllowed:_}}function Xt(e,t){if(e)return t.multiple?e.slice():e.length?[e[0]]:e}function Qt(e){if(!e)return null;var t;if(Array.isArray(e))t={checkedKeys:e,halfCheckedKeys:void 0};else{if("object"!==(0,r.Z)(e))return(0,g.ZP)(!1,"`checkedKeys` is not an array or an object"),null;t={checkedKeys:e.checked||void 0,halfCheckedKeys:e.halfChecked||void 0}}return t}function Jt(e,t){var n=new Set;function r(e){if(!n.has(e)){var o=t[e];if(o){n.add(e);var a=o.parent;o.node.disabled||a&&r(a.key)}}}return(e||[]).forEach((function(e){r(e)})),(0,u.Z)(n)}var en=n(7910),tn=n(8289),nn=["className","style","motion","motionNodes","motionType","onMotionStart","onMotionEnd","active","treeNodeRequiredProps"],rn=function(e,t){var n=e.className,r=e.style,o=e.motion,l=e.motionNodes,s=e.motionType,u=e.onMotionStart,f=e.onMotionEnd,p=e.active,h=e.treeNodeRequiredProps,v=(0,k.Z)(e,nn),m=d.useState(!0),g=(0,a.Z)(m,2),y=g[0],b=g[1],x=d.useContext(jt).prefixCls,w=d.useRef(!1),C=function(){w.current||f(),w.current=!0};return(0,d.useEffect)((function(){l&&"hide"===s&&y&&b(!1)}),[l]),(0,d.useEffect)((function(){return l&&u(),function(){l&&C()}}),[]),l?d.createElement(tn.Z,(0,i.Z)({ref:t,visible:y},o,{motionAppear:"show"===s,onAppearEnd:C,onLeaveEnd:C}),(function(e,t){var n=e.className,r=e.style;return d.createElement("div",{ref:t,className:c()("".concat(x,"-treenode-motion"),n),style:r},l.map((function(e){var t=(0,i.Z)({},e.data),n=e.title,r=e.key,o=e.isStart,a=e.isEnd;delete t.children;var l=Rt(r,h);return d.createElement(Vt,(0,i.Z)({},t,l,{title:n,active:p,data:e.data,key:r,isStart:o,isEnd:a}))})))})):d.createElement(Vt,(0,i.Z)({domRef:t,className:n,style:r},v,{active:p}))};rn.displayName="MotionTreeNode";const on=d.forwardRef(rn);function an(e,t,n){var r=e.findIndex((function(e){return e.key===n})),o=e[r+1],a=t.findIndex((function(e){return e.key===n}));if(o){var i=t.findIndex((function(e){return e.key===o.key}));return t.slice(a+1,i)}return t.slice(a+1)}var ln=["prefixCls","data","selectable","checkable","expandedKeys","selectedKeys","checkedKeys","loadedKeys","loadingKeys","halfCheckedKeys","keyEntities","disabled","dragging","dragOverNodeKey","dropPosition","motion","height","itemHeight","virtual","focusable","activeItem","focused","tabIndex","onKeyDown","onFocus","onBlur","onActiveChange","onListChangeStart","onListChangeEnd"],cn={width:0,height:0,display:"flex",overflow:"hidden",opacity:0,border:0,padding:0,margin:0},sn=function(){},un="RC_TREE_MOTION_".concat(Math.random()),dn={key:un},fn={key:un,level:0,index:0,pos:"0",node:dn,nodes:[dn]},pn={parent:null,children:[],pos:fn.pos,data:dn,title:null,key:un,isStart:[],isEnd:[]};function hn(e,t,n,r){return!1!==t&&n?e.slice(0,Math.ceil(n/r)+1):e}function vn(e){return Pt(e.key,e.pos)}var mn=d.forwardRef((function(e,t){var n=e.prefixCls,r=e.data,o=(e.selectable,e.checkable,e.expandedKeys),l=e.selectedKeys,c=e.checkedKeys,s=e.loadedKeys,u=e.loadingKeys,f=e.halfCheckedKeys,p=e.keyEntities,h=e.disabled,v=e.dragging,m=e.dragOverNodeKey,g=e.dropPosition,y=e.motion,b=e.height,x=e.itemHeight,w=e.virtual,C=e.focusable,S=e.activeItem,E=e.focused,j=e.tabIndex,O=e.onKeyDown,_=e.onFocus,N=e.onBlur,P=e.onActiveChange,Z=e.onListChangeStart,M=e.onListChangeEnd,T=(0,k.Z)(e,ln),I=d.useRef(null),A=d.useRef(null);d.useImperativeHandle(t,(function(){return{scrollTo:function(e){I.current.scrollTo(e)},getIndentWidth:function(){return A.current.offsetWidth}}}));var R=d.useState(o),D=(0,a.Z)(R,2),L=D[0],F=D[1],z=d.useState(r),B=(0,a.Z)(z,2),U=B[0],V=B[1],H=d.useState(r),K=(0,a.Z)(H,2),W=K[0],Y=K[1],q=d.useState([]),$=(0,a.Z)(q,2),G=$[0],X=$[1],Q=d.useState(null),J=(0,a.Z)(Q,2),ee=J[0],te=J[1],ne=d.useRef(r);function re(){var e=ne.current;V(e),Y(e),X([]),te(null),M()}ne.current=r,d.useEffect((function(){F(o);var e=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=e.length,r=t.length;if(1!==Math.abs(n-r))return{add:!1,key:null};function o(e,t){var n=new Map;e.forEach((function(e){n.set(e,!0)}));var r=t.filter((function(e){return!n.has(e)}));return 1===r.length?r[0]:null}return n ").concat(t);return t}(S)),d.createElement("div",null,d.createElement("input",{style:cn,disabled:!1===C||h,tabIndex:!1!==C?j:null,onKeyDown:O,onFocus:_,onBlur:N,value:"",onChange:sn,"aria-label":"for screen reader"})),d.createElement("div",{className:"".concat(n,"-treenode"),"aria-hidden":!0,style:{position:"absolute",pointerEvents:"none",visibility:"hidden",height:0,overflow:"hidden"}},d.createElement("div",{className:"".concat(n,"-indent")},d.createElement("div",{ref:A,className:"".concat(n,"-indent-unit")}))),d.createElement(en.Z,(0,i.Z)({},T,{data:oe,itemKey:vn,height:b,fullHeight:!1,virtual:w,itemHeight:x,prefixCls:"".concat(n,"-list"),ref:I,onVisibleChange:function(e,t){var n=new Set(e);t.filter((function(e){return!n.has(e)})).some((function(e){return vn(e)===un}))&&re()}}),(function(e){var t=e.pos,n=(0,i.Z)({},e.data),r=e.title,o=e.key,a=e.isStart,l=e.isEnd,c=Pt(o,t);delete n.key,delete n.children;var s=Rt(c,ae);return d.createElement(on,(0,i.Z)({},n,s,{title:r,active:!!S&&o===S.key,pos:t,data:e.data,isStart:a,isEnd:l,motion:y,motionNodes:o===un?G:null,motionType:ee,onMotionStart:Z,onMotionEnd:re,treeNodeRequiredProps:ae,onMouseMove:function(){P(null)}}))})))}));mn.displayName="NodeList";const gn=mn;function yn(e,t){var n=new Set;return e.forEach((function(e){t.has(e)||n.add(e)})),n}function bn(e){var t=e||{},n=t.disabled,r=t.disableCheckbox,o=t.checkable;return!(!n&&!r)||!1===o}function xn(e,t,n,r){var o,a=[];o=r||bn;var i,l=new Set(e.filter((function(e){var t=!!n[e];return t||a.push(e),t}))),c=new Map,s=0;return Object.keys(n).forEach((function(e){var t=n[e],r=t.level,o=c.get(r);o||(o=new Set,c.set(r,o)),o.add(t),s=Math.max(s,r)})),(0,g.ZP)(!a.length,"Tree missing follow keys: ".concat(a.slice(0,100).map((function(e){return"'".concat(e,"'")})).join(", "))),i=!0===t?function(e,t,n,r){for(var o=new Set(e),a=new Set,i=0;i<=n;i+=1)(t.get(i)||new Set).forEach((function(e){var t=e.key,n=e.node,a=e.children,i=void 0===a?[]:a;o.has(t)&&!r(n)&&i.filter((function(e){return!r(e.node)})).forEach((function(e){o.add(e.key)}))}));for(var l=new Set,c=n;c>=0;c-=1)(t.get(c)||new Set).forEach((function(e){var t=e.parent,n=e.node;if(!r(n)&&e.parent&&!l.has(e.parent.key))if(r(e.parent.node))l.add(t.key);else{var i=!0,c=!1;(t.children||[]).filter((function(e){return!r(e.node)})).forEach((function(e){var t=e.key,n=o.has(t);i&&!n&&(i=!1),c||!n&&!a.has(t)||(c=!0)})),i&&o.add(t.key),c&&a.add(t.key),l.add(t.key)}}));return{checkedKeys:Array.from(o),halfCheckedKeys:Array.from(yn(a,o))}}(l,c,s,o):function(e,t,n,r,o){for(var a=new Set(e),i=new Set(t),l=0;l<=r;l+=1)(n.get(l)||new Set).forEach((function(e){var t=e.key,n=e.node,r=e.children,l=void 0===r?[]:r;a.has(t)||i.has(t)||o(n)||l.filter((function(e){return!o(e.node)})).forEach((function(e){a.delete(e.key)}))}));i=new Set;for(var c=new Set,s=r;s>=0;s-=1)(n.get(s)||new Set).forEach((function(e){var t=e.parent,n=e.node;if(!o(n)&&e.parent&&!c.has(e.parent.key))if(o(e.parent.node))c.add(t.key);else{var r=!0,l=!1;(t.children||[]).filter((function(e){return!o(e.node)})).forEach((function(e){var t=e.key,n=a.has(t);r&&!n&&(r=!1),l||!n&&!i.has(t)||(l=!0)})),r||a.delete(t.key),l&&i.add(t.key),c.add(t.key)}}));return{checkedKeys:Array.from(a),halfCheckedKeys:Array.from(yn(i,a))}}(l,t.halfCheckedKeys,c,s,o),i}var wn=function(e){(0,Ct.Z)(n,e);var t=(0,St.Z)(n);function n(){var e;(0,xt.Z)(this,n);for(var r=arguments.length,o=new Array(r),a=0;a2&&void 0!==arguments[2]&&arguments[2],a=e.state,i=a.dragChildrenKeys,l=a.dropPosition,c=a.dropTargetKey,u=a.dropTargetPos,d=a.dropAllowed;if(d){var f=e.props.onDrop;if(e.setState({dragOverNodeKey:null}),e.cleanDragState(),null!==c){var p=(0,s.Z)((0,s.Z)({},Rt(c,e.getTreeNodeRequiredProps())),{},{active:(null===(r=e.getActiveItem())||void 0===r?void 0:r.key)===c,data:e.state.keyEntities[c].node}),h=-1!==i.indexOf(c);(0,g.ZP)(!h,"Can not drop to dragNode's children node. This is a bug of rc-tree. Please report an issue.");var v=Wt(u),m={event:t,node:Dt(p),dragNode:e.dragNode?Dt(e.dragNode.props):null,dragNodesKeys:[e.dragNode.props.eventKey].concat(i),dropToGap:0!==l,dropPosition:l+Number(v[v.length-1])};o||null===f||void 0===f||f(m),e.dragNode=null}}},e.cleanDragState=function(){null!==e.state.draggingNodeKey&&e.setState({draggingNodeKey:null,dropPosition:null,dropContainerKey:null,dropTargetKey:null,dropLevelOffset:null,dropAllowed:!0,dragOverNodeKey:null}),e.dragStartMousePosition=null,e.currentMouseOverDroppableNodeKey=null},e.triggerExpandActionExpand=function(t,n){var r=e.state,o=r.expandedKeys,a=r.flattenNodes,i=n.expanded,l=n.key;if(!(n.isLeaf||t.shiftKey||t.metaKey||t.ctrlKey)){var c=a.filter((function(e){return e.key===l}))[0],u=Dt((0,s.Z)((0,s.Z)({},Rt(l,e.getTreeNodeRequiredProps())),{},{data:c.data}));e.setExpandedKeys(i?Ht(o,l):Kt(o,l)),e.onNodeExpand(t,u)}},e.onNodeClick=function(t,n){var r=e.props,o=r.onClick;"click"===r.expandAction&&e.triggerExpandActionExpand(t,n),null===o||void 0===o||o(t,n)},e.onNodeDoubleClick=function(t,n){var r=e.props,o=r.onDoubleClick;"doubleClick"===r.expandAction&&e.triggerExpandActionExpand(t,n),null===o||void 0===o||o(t,n)},e.onNodeSelect=function(t,n){var r=e.state.selectedKeys,o=e.state,a=o.keyEntities,i=o.fieldNames,l=e.props,c=l.onSelect,s=l.multiple,u=n.selected,d=n[i.key],f=!u,p=(r=f?s?Kt(r,d):[d]:Ht(r,d)).map((function(e){var t=a[e];return t?t.node:null})).filter((function(e){return e}));e.setUncontrolledState({selectedKeys:r}),null===c||void 0===c||c(r,{event:"select",selected:f,node:n,selectedNodes:p,nativeEvent:t.nativeEvent})},e.onNodeCheck=function(t,n,r){var o,a=e.state,i=a.keyEntities,l=a.checkedKeys,c=a.halfCheckedKeys,s=e.props,d=s.checkStrictly,f=s.onCheck,p=n.key,h={event:"check",node:n,checked:r,nativeEvent:t.nativeEvent};if(d){var v=r?Kt(l,p):Ht(l,p);o={checked:v,halfChecked:Ht(c,p)},h.checkedNodes=v.map((function(e){return i[e]})).filter((function(e){return e})).map((function(e){return e.node})),e.setUncontrolledState({checkedKeys:v})}else{var m=xn([].concat((0,u.Z)(l),[p]),!0,i),g=m.checkedKeys,y=m.halfCheckedKeys;if(!r){var b=new Set(g);b.delete(p);var x=xn(Array.from(b),{checked:!1,halfCheckedKeys:y},i);g=x.checkedKeys,y=x.halfCheckedKeys}o=g,h.checkedNodes=[],h.checkedNodesPositions=[],h.halfCheckedKeys=y,g.forEach((function(e){var t=i[e];if(t){var n=t.node,r=t.pos;h.checkedNodes.push(n),h.checkedNodesPositions.push({node:n,pos:r})}})),e.setUncontrolledState({checkedKeys:g},!1,{halfCheckedKeys:y})}null===f||void 0===f||f(o,h)},e.onNodeLoad=function(t){var n=t.key,r=new Promise((function(r,o){e.setState((function(a){var i=a.loadedKeys,l=void 0===i?[]:i,c=a.loadingKeys,s=void 0===c?[]:c,u=e.props,d=u.loadData,f=u.onLoad;return d&&-1===l.indexOf(n)&&-1===s.indexOf(n)?(d(t).then((function(){var o=Kt(e.state.loadedKeys,n);null===f||void 0===f||f(o,{event:"load",node:t}),e.setUncontrolledState({loadedKeys:o}),e.setState((function(e){return{loadingKeys:Ht(e.loadingKeys,n)}})),r()})).catch((function(t){if(e.setState((function(e){return{loadingKeys:Ht(e.loadingKeys,n)}})),e.loadingRetryTimes[n]=(e.loadingRetryTimes[n]||0)+1,e.loadingRetryTimes[n]>=10){var a=e.state.loadedKeys;(0,g.ZP)(!1,"Retry for `loadData` many times but still failed. No more retry."),e.setUncontrolledState({loadedKeys:Kt(a,n)}),r()}o(t)})),{loadingKeys:Kt(s,n)}):null}))}));return r.catch((function(){})),r},e.onNodeMouseEnter=function(t,n){var r=e.props.onMouseEnter;null===r||void 0===r||r({event:t,node:n})},e.onNodeMouseLeave=function(t,n){var r=e.props.onMouseLeave;null===r||void 0===r||r({event:t,node:n})},e.onNodeContextMenu=function(t,n){var r=e.props.onRightClick;r&&(t.preventDefault(),r({event:t,node:n}))},e.onFocus=function(){var t=e.props.onFocus;e.setState({focused:!0});for(var n=arguments.length,r=new Array(n),o=0;o1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(!e.destroyed){var o=!1,a=!0,i={};Object.keys(t).forEach((function(n){n in e.props?a=!1:(o=!0,i[n]=t[n])})),!o||n&&!a||e.setState((0,s.Z)((0,s.Z)({},i),r))}},e.scrollTo=function(t){e.listRef.current.scrollTo(t)},e}return(0,wt.Z)(n,[{key:"componentDidMount",value:function(){this.destroyed=!1,this.onUpdated()}},{key:"componentDidUpdate",value:function(){this.onUpdated()}},{key:"onUpdated",value:function(){var e=this.props.activeKey;void 0!==e&&e!==this.state.activeKey&&(this.setState({activeKey:e}),null!==e&&this.scrollTo({key:e}))}},{key:"componentWillUnmount",value:function(){window.removeEventListener("dragend",this.onWindowDragEnd),this.destroyed=!0}},{key:"resetDragState",value:function(){this.setState({dragOverNodeKey:null,dropPosition:null,dropLevelOffset:null,dropTargetKey:null,dropContainerKey:null,dropTargetPos:null,dropAllowed:!1})}},{key:"render",value:function(){var e,t,n=this.state,a=n.focused,l=n.flattenNodes,s=n.keyEntities,u=n.draggingNodeKey,f=n.activeKey,h=n.dropLevelOffset,v=n.dropContainerKey,m=n.dropTargetKey,g=n.dropPosition,y=n.dragOverNodeKey,b=n.indent,x=this.props,w=x.prefixCls,k=x.className,C=x.style,S=x.showLine,E=x.focusable,j=x.tabIndex,O=void 0===j?0:j,_=x.selectable,N=x.showIcon,P=x.icon,Z=x.switcherIcon,M=x.draggable,T=x.checkable,I=x.checkStrictly,A=x.disabled,R=x.motion,D=x.loadData,L=x.filterTreeNode,F=x.height,z=x.itemHeight,B=x.virtual,U=x.titleRender,V=x.dropIndicatorRender,H=x.onContextMenu,K=x.onScroll,W=x.direction,Y=x.rootClassName,q=x.rootStyle,$=(0,p.Z)(this.props,{aria:!0,data:!0});return M&&(t="object"===(0,r.Z)(M)?M:"function"===typeof M?{nodeDraggable:M}:{}),d.createElement(jt.Provider,{value:{prefixCls:w,selectable:_,showIcon:N,icon:P,switcherIcon:Z,draggable:t,draggingNodeKey:u,checkable:T,checkStrictly:I,disabled:A,keyEntities:s,dropLevelOffset:h,dropContainerKey:v,dropTargetKey:m,dropPosition:g,dragOverNodeKey:y,indent:b,direction:W,dropIndicatorRender:V,loadData:D,filterTreeNode:L,titleRender:U,onNodeClick:this.onNodeClick,onNodeDoubleClick:this.onNodeDoubleClick,onNodeExpand:this.onNodeExpand,onNodeSelect:this.onNodeSelect,onNodeCheck:this.onNodeCheck,onNodeLoad:this.onNodeLoad,onNodeMouseEnter:this.onNodeMouseEnter,onNodeMouseLeave:this.onNodeMouseLeave,onNodeContextMenu:this.onNodeContextMenu,onNodeDragStart:this.onNodeDragStart,onNodeDragEnter:this.onNodeDragEnter,onNodeDragOver:this.onNodeDragOver,onNodeDragLeave:this.onNodeDragLeave,onNodeDragEnd:this.onNodeDragEnd,onNodeDrop:this.onNodeDrop}},d.createElement("div",{role:"tree",className:c()(w,k,Y,(e={},(0,o.Z)(e,"".concat(w,"-show-line"),S),(0,o.Z)(e,"".concat(w,"-focused"),a),(0,o.Z)(e,"".concat(w,"-active-focused"),null!==f),e)),style:q},d.createElement(gn,(0,i.Z)({ref:this.listRef,prefixCls:w,style:C,data:l,disabled:A,selectable:_,checkable:!!T,motion:R,dragging:null!==u,height:F,itemHeight:z,virtual:B,focusable:E,focused:a,tabIndex:O,activeItem:this.getActiveItem(),onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,onActiveChange:this.onActiveChange,onListChangeStart:this.onListChangeStart,onListChangeEnd:this.onListChangeEnd,onContextMenu:H,onScroll:K},this.getTreeNodeRequiredProps(),$))))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n,r=t.prevProps,a={prevProps:e};function i(t){return!r&&t in e||r&&r[t]!==e[t]}var l=t.fieldNames;if(i("fieldNames")&&(l=Zt(e.fieldNames),a.fieldNames=l),i("treeData")?n=e.treeData:i("children")&&((0,g.ZP)(!1,"`children` of Tree is deprecated. Please use `treeData` instead."),n=Mt(e.children)),n){a.treeData=n;var c=At(n,{fieldNames:l});a.keyEntities=(0,s.Z)((0,o.Z)({},un,fn),c.keyEntities)}var u,d=a.keyEntities||t.keyEntities;if(i("expandedKeys")||r&&i("autoExpandParent"))a.expandedKeys=e.autoExpandParent||!r&&e.defaultExpandParent?Jt(e.expandedKeys,d):e.expandedKeys;else if(!r&&e.defaultExpandAll){var f=(0,s.Z)({},d);delete f[un],a.expandedKeys=Object.keys(f).map((function(e){return f[e].key}))}else!r&&e.defaultExpandedKeys&&(a.expandedKeys=e.autoExpandParent||e.defaultExpandParent?Jt(e.defaultExpandedKeys,d):e.defaultExpandedKeys);if(a.expandedKeys||delete a.expandedKeys,n||a.expandedKeys){var p=Tt(n||t.treeData,a.expandedKeys||t.expandedKeys,l);a.flattenNodes=p}if((e.selectable&&(i("selectedKeys")?a.selectedKeys=Xt(e.selectedKeys,e):!r&&e.defaultSelectedKeys&&(a.selectedKeys=Xt(e.defaultSelectedKeys,e))),e.checkable)&&(i("checkedKeys")?u=Qt(e.checkedKeys)||{}:!r&&e.defaultCheckedKeys?u=Qt(e.defaultCheckedKeys)||{}:n&&(u=Qt(e.checkedKeys)||{checkedKeys:t.checkedKeys,halfCheckedKeys:t.halfCheckedKeys}),u)){var h=u,v=h.checkedKeys,m=void 0===v?[]:v,y=h.halfCheckedKeys,b=void 0===y?[]:y;if(!e.checkStrictly){var x=xn(m,!0,d);m=x.checkedKeys,b=x.halfCheckedKeys}a.checkedKeys=m,a.halfCheckedKeys=b}return i("loadedKeys")&&(a.loadedKeys=e.loadedKeys),a}}]),n}(d.Component);wn.defaultProps={prefixCls:"rc-tree",showLine:!1,showIcon:!0,selectable:!0,multiple:!1,checkable:!1,disabled:!1,checkStrictly:!1,draggable:!1,defaultExpandParent:!0,autoExpandParent:!1,defaultExpandAll:!1,defaultExpandedKeys:[],defaultCheckedKeys:[],defaultSelectedKeys:[],dropIndicatorRender:function(e){var t=e.dropPosition,n=e.dropLevelOffset,r=e.indent,o={pointerEvents:"none",position:"absolute",right:0,backgroundColor:"red",height:2};switch(t){case-1:o.top=0,o.left=-n*r;break;case 1:o.bottom=0,o.left=-n*r;break;case 0:o.bottom=0,o.left=r}return d.createElement("div",{style:o})},allowDrop:function(){return!0},expandAction:!1},wn.TreeNode=Vt;const kn=wn;var Cn=n(405);const Sn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494z"}}]},name:"file",theme:"outlined"};var En=function(e,t){return d.createElement(at.Z,(0,s.Z)((0,s.Z)({},e),{},{ref:t,icon:Sn}))};En.displayName="FileOutlined";const jn=d.forwardRef(En);const On={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 00-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"}}]},name:"folder-open",theme:"outlined"};var _n=function(e,t){return d.createElement(at.Z,(0,s.Z)((0,s.Z)({},e),{},{ref:t,icon:On}))};_n.displayName="FolderOpenOutlined";const Nn=d.forwardRef(_n);const Pn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 298.4H521L403.7 186.2a8.15 8.15 0 00-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z"}}]},name:"folder",theme:"outlined"};var Zn=function(e,t){return d.createElement(at.Z,(0,s.Z)((0,s.Z)({},e),{},{ref:t,icon:Pn}))};Zn.displayName="FolderOutlined";const Mn=d.forwardRef(Zn);var Tn;function In(e,t){e.forEach((function(e){var n=e.key,r=e.children;!1!==t(n,e)&&In(r||[],t)}))}function An(e){var t=e.treeData,n=e.expandedKeys,r=e.startKey,o=e.endKey,a=[],i=Tn.None;if(r&&r===o)return[r];if(!r||!o)return[];return In(t,(function(e){if(i===Tn.End)return!1;if(function(e){return e===r||e===o}(e)){if(a.push(e),i===Tn.None)i=Tn.Start;else if(i===Tn.Start)return i=Tn.End,!1}else i===Tn.Start&&a.push(e);return-1!==n.indexOf(e)})),a}function Rn(e,t){var n=(0,u.Z)(t),r=[];return In(e,(function(e,t){var o=n.indexOf(e);return-1!==o&&(r.push(t),n.splice(o,1)),!!n.length})),r}!function(e){e[e.None=0]="None",e[e.Start=1]="Start",e[e.End=2]="End"}(Tn||(Tn={}));var Dn=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o0&&void 0!==arguments[0]?arguments[0]:{confirm:!1,closeDropdown:!1},t=e.confirm,n=e.closeDropdown;t&&G([]),n&&P(!1),Y(""),R(C?(S||[]).map((function(e){return String(e)})):[])},J=c()((0,o.Z)({},"".concat(l,"-menu-without-submenu"),!(i.filters||[]).some((function(e){return e.children})))),ee=function(e){if(e.target.checked){var t=hr(null===i||void 0===i?void 0:i.filters).map((function(e){return String(e)}));R(t)}else R([])},te=function e(t){return(t.filters||[]).map((function(t,n){var r=String(t.value),o={title:t.text,key:void 0!==t.value?r:n};return t.children&&(o.children=e({filters:t.children})),o}))};if("function"===typeof i.filterDropdown)$=i.filterDropdown({prefixCls:"".concat(l,"-custom"),setSelectedKeys:function(e){return D({selectedKeys:e})},selectedKeys:A(),confirm:function(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{closeDropdown:!0}).closeDropdown&&P(!1),G(A())},clearFilters:Q,filters:i.filters,visible:Z});else if(i.filterDropdown)$=i.filterDropdown;else{var ne=A()||[];$=d.createElement(d.Fragment,null,0===(i.filters||[]).length?d.createElement(pt.Z,{image:pt.Z.PRESENTED_IMAGE_SIMPLE,description:y.filterEmptyText,imageStyle:{height:24},style:{margin:0,padding:"16px 0"}}):"tree"===p?d.createElement(d.Fragment,null,d.createElement(lr,{filterSearch:v,value:W,onChange:q,tablePrefixCls:n,locale:y}),d.createElement("div",{className:"".concat(n,"-filter-dropdown-tree")},u?d.createElement(dt.Z,{checked:ne.length===hr(i.filters).length,indeterminate:ne.length>0&&ne.length0?c:e}),m=Math.ceil((c||e)/v.pageSize);v.current>m&&(v.current=m||1);var g=function(e,t){h({current:null!==e&&void 0!==e?e:1,pageSize:t||v.pageSize})};return!1===t?[{},function(){}]:[(0,i.Z)((0,i.Z)({},v),{onChange:function(e,r){var o;t&&(null===(o=t.onChange)||void 0===o||o.call(t,e,r)),g(e,r),n(e,r||(null===v||void 0===v?void 0:v.pageSize))}}),g]}var xr=n(6840),wr=n(9362),kr=n(1978),Cr={},Sr="SELECT_ALL",Er="SELECT_INVERT",jr="SELECT_NONE",Or=[];function _r(e,t){var n=[];return(e||[]).forEach((function(e){n.push(e),e&&"object"===(0,r.Z)(e)&&t in e&&(n=[].concat((0,u.Z)(n),(0,u.Z)(_r(e[t],t))))})),n}function Nr(e,t){var n=e||{},r=n.preserveSelectedRowKeys,l=n.selectedRowKeys,c=n.defaultSelectedRowKeys,s=n.getCheckboxProps,f=n.onChange,p=n.onSelect,h=n.onSelectAll,v=n.onSelectInvert,m=n.onSelectNone,g=n.onSelectMultiple,y=n.columnWidth,b=n.type,x=n.selections,w=n.fixed,k=n.renderCell,C=n.hideSelectAll,S=n.checkStrictly,E=void 0===S||S,j=t.prefixCls,O=t.data,_=t.pageData,N=t.getRecordByKey,P=t.getRowKey,Z=t.expandType,M=t.childrenColumnName,T=t.locale,I=t.getPopupContainer,A=(0,kr.Z)(l||c||Or,{value:l}),R=(0,a.Z)(A,2),D=R[0],L=R[1],F=d.useRef(new Map),z=(0,d.useCallback)((function(e){if(r){var t=new Map;e.forEach((function(e){var n=N(e);!n&&F.current.has(e)&&(n=F.current.get(e)),t.set(e,n)})),F.current=t}}),[N,r]);d.useEffect((function(){z(D)}),[D]);var B=(0,d.useMemo)((function(){return E?{keyEntities:null}:At(O,{externalGetKey:P,childrenPropName:M})}),[O,P,E,M]).keyEntities,U=(0,d.useMemo)((function(){return _r(_,M)}),[_,M]),V=(0,d.useMemo)((function(){var e=new Map;return U.forEach((function(t,n){var r=P(t,n),o=(s?s(t):null)||{};e.set(r,o)})),e}),[U,P,s]),H=(0,d.useCallback)((function(e){var t;return!!(null===(t=V.get(P(e)))||void 0===t?void 0:t.disabled)}),[V,P]),K=(0,d.useMemo)((function(){if(E)return[D||[],[]];var e=xn(D,!0,B,H);return[e.checkedKeys||[],e.halfCheckedKeys]}),[D,E,B,H]),W=(0,a.Z)(K,2),Y=W[0],q=W[1],$=(0,d.useMemo)((function(){var e="radio"===b?Y.slice(0,1):Y;return new Set(e)}),[Y,b]),G=(0,d.useMemo)((function(){return"radio"===b?new Set:new Set(q)}),[q,b]),X=(0,d.useState)(null),Q=(0,a.Z)(X,2),J=Q[0],ee=Q[1];d.useEffect((function(){e||L(Or)}),[!!e]);var te=(0,d.useCallback)((function(e,t){var n,o;z(e),r?(n=e,o=e.map((function(e){return F.current.get(e)}))):(n=[],o=[],e.forEach((function(e){var t=N(e);void 0!==t&&(n.push(e),o.push(t))}))),L(n),null===f||void 0===f||f(n,o,{type:t})}),[L,N,f,r]),ne=(0,d.useCallback)((function(e,t,n,r){if(p){var o=n.map((function(e){return N(e)}));p(N(e),t,o,r)}te(n,"single")}),[p,N,te]),re=(0,d.useMemo)((function(){return!x||C?null:(!0===x?[Sr,Er,jr]:x).map((function(e){return e===Sr?{key:"all",text:T.selectionAll,onSelect:function(){te(O.map((function(e,t){return P(e,t)})).filter((function(e){var t=V.get(e);return!(null===t||void 0===t?void 0:t.disabled)||$.has(e)})),"all")}}:e===Er?{key:"invert",text:T.selectInvert,onSelect:function(){var e=new Set($);_.forEach((function(t,n){var r=P(t,n),o=V.get(r);(null===o||void 0===o?void 0:o.disabled)||(e.has(r)?e.delete(r):e.add(r))}));var t=Array.from(e);v&&v(t),te(t,"invert")}}:e===jr?{key:"none",text:T.selectNone,onSelect:function(){null===m||void 0===m||m(),te(Array.from($).filter((function(e){var t=V.get(e);return null===t||void 0===t?void 0:t.disabled})),"none")}}:e})).map((function(e){return(0,i.Z)((0,i.Z)({},e),{onSelect:function(){for(var t,n,r=arguments.length,o=new Array(r),a=0;a2&&void 0!==arguments[2]&&arguments[2],r=(0,i.Z)((0,i.Z)({},le),e);n&&(le.resetPagination(),r.pagination.current&&(r.pagination.current=1),m&&m.onChange&&m.onChange(1,r.pagination.pageSize)),Z&&!1!==Z.scrollToFirstRowOnChange&&re.body.current&&Xe(0,{getContainer:function(){return re.body.current}}),null===C||void 0===C||C(r.pagination,r.filters,r.sorter,{currentDataSource:mr(Kr($,r.sorterStates,te),r.filterStates),action:t})},se=Wr({prefixCls:X,mergedColumns:F,onSorterChange:function(e,t){ce({sorter:e,sorterStates:t},"sort",!1)},sortDirections:M||["ascend","descend"],tableLocale:q,showSorterTooltip:A}),de=(0,a.Z)(se,4),fe=de[0],pe=de[1],he=de[2],ve=de[3],me=d.useMemo((function(){return Kr($,pe,te)}),[$,pe]);le.sorter=ve(),le.sorterStates=pe;var ge=gr({prefixCls:X,locale:q,dropdownPrefixCls:Q,mergedColumns:F,onFilterChange:function(e,t){ce({filters:e,filterStates:t},"filter",!0)},getPopupContainer:S}),ye=(0,a.Z)(ge,3),be=ye[0],xe=ye[1],we=ye[2],ke=mr(me,xe);le.filters=we(),le.filterStates=xe;var Ce=qr(d.useMemo((function(){return(0,i.Z)({},he)}),[he])),Se=(0,a.Z)(Ce,1)[0],Ee=br(ke.length,m,(function(e,t){ce({pagination:(0,i.Z)((0,i.Z)({},le.pagination),{current:e,pageSize:t})},"paginate")})),je=(0,a.Z)(Ee,2),Oe=je[0],_e=je[1];le.pagination=!1===m?{}:function(e,t){var n={current:t.current,pageSize:t.pageSize},o=e&&"object"===(0,r.Z)(e)?e:{};return Object.keys(o).forEach((function(e){var r=t[e];"function"!==typeof r&&(n[e]=r)})),n}(m,Oe),le.resetPagination=_e;var Ne=d.useMemo((function(){if(!1===m||!Oe.pageSize)return ke;var e=Oe.current,t=void 0===e?1:e,n=Oe.total,r=Oe.pageSize,o=void 0===r?10:r;return ke.lengtho?ke.slice((t-1)*o,t*o):ke:ke.slice((t-1)*o,t*o)}),[!!m,ke,Oe&&Oe.current,Oe&&Oe.pageSize,Oe&&Oe.total]),Pe=Nr(g,{prefixCls:X,data:ke,pageData:Ne,getRowKey:oe,getRecordByKey:ie,expandType:ne,childrenColumnName:te,locale:q,getPopupContainer:S}),Ze=(0,a.Z)(Pe,2),Me=Ze[0],Te=Ze[1];J.__PARENT_RENDER_ICON__=J.expandIcon,J.expandIcon=J.expandIcon||j||et(q),"nest"===ne&&void 0===J.expandIconColumnIndex?J.expandIconColumnIndex=g?1:0:J.expandIconColumnIndex>0&&g&&(J.expandIconColumnIndex-=1),"number"!==typeof J.indentSize&&(J.indentSize="number"===typeof P?P:15);var Ie,Re,De,Ye=d.useCallback((function(e){return Se(Me(be(fe(e))))}),[fe,be,Me]);if(!1!==m&&(null===Oe||void 0===Oe?void 0:Oe.total)){var qe;qe=Oe.size?Oe.size:"small"===Y||"middle"===Y?"small":void 0;var $e=function(e){return d.createElement(Ke.Z,(0,i.Z)({},Oe,{className:c()("".concat(X,"-pagination ").concat(X,"-pagination-").concat(e),Oe.className),size:qe}))},Ge="rtl"===W?"left":"right",Qe=Oe.position;if(null!==Qe&&Array.isArray(Qe)){var Je=Qe.find((function(e){return-1!==e.indexOf("top")})),tt=Qe.find((function(e){return-1!==e.indexOf("bottom")})),nt=Qe.every((function(e){return"none"==="".concat(e)}));Je||tt||nt||(Re=$e(Ge)),Je&&(Ie=$e(Je.toLowerCase().replace("top",""))),tt&&(Re=$e(tt.toLowerCase().replace("bottom","")))}else Re=$e(Ge)}"boolean"===typeof E?De={spinning:E}:"object"===(0,r.Z)(E)&&(De=(0,i.Z)({spinning:!0},E));var rt=c()("".concat(X,"-wrapper"),(0,o.Z)({},"".concat(X,"-wrapper-rtl"),"rtl"===W),s);return d.createElement("div",{ref:t,className:rt,style:u},d.createElement(We.Z,(0,i.Z)({spinning:!1},De),Ie,d.createElement(Le,(0,i.Z)({},z,{columns:F,direction:W,expandable:J,prefixCls:X,className:c()((n={},(0,o.Z)(n,"".concat(X,"-middle"),"middle"===Y),(0,o.Z)(n,"".concat(X,"-small"),"small"===Y),(0,o.Z)(n,"".concat(X,"-bordered"),p),(0,o.Z)(n,"".concat(X,"-empty"),0===$.length),n)),data:Ne,rowKey:oe,rowClassName:function(e,t,n){var r;return r="function"===typeof b?c()(b(e,t,n)):c()(b),c()((0,o.Z)({},"".concat(X,"-row-selected"),Te.has(oe(e,t))),r)},emptyText:T&&T.emptyText||(K||Be.Z)("Table"),internalHooks:Ae,internalRefs:re,transformColumns:Ye})),Re))}var Xr=d.forwardRef(Gr);Xr.defaultProps={rowKey:"key"},Xr.SELECTION_COLUMN=Cr,Xr.EXPAND_COLUMN=Le.EXPAND_COLUMN,Xr.SELECTION_ALL=Sr,Xr.SELECTION_INVERT=Er,Xr.SELECTION_NONE=jr,Xr.Column=Qe,Xr.ColumnGroup=Je,Xr.Summary=Ce;const Qr=Xr},129:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r={placeholder:"Select time",rangePlaceholder:["Start time","End time"]}},6205:(e,t,n)=>{"use strict";n.d(t,{Z:()=>O});var r=n(6666),o=n(6234),a=n(7896),i=n(5667),l=n.n(i),c=n(6522),s=n(3028),u=n(2159),d=n(969),f=n(7218),p=n(1831);function h(e){var t=e.showArrow,n=e.arrowContent,r=e.children,o=e.prefixCls,a=e.id,i=e.overlayInnerStyle,c=e.className,s=e.style;return d.createElement("div",{className:l()("".concat(o,"-content"),c),style:s},!1!==t&&d.createElement("div",{className:"".concat(o,"-arrow"),key:"arrow"},n),d.createElement("div",{className:"".concat(o,"-inner"),id:a,role:"tooltip",style:i},"function"===typeof r?r():r))}var v=function(e,t){var n=e.overlayClassName,r=e.trigger,o=void 0===r?["hover"]:r,i=e.mouseEnterDelay,l=void 0===i?0:i,v=e.mouseLeaveDelay,m=void 0===v?.1:v,g=e.overlayStyle,y=e.prefixCls,b=void 0===y?"rc-tooltip":y,x=e.children,w=e.onVisibleChange,k=e.afterVisibleChange,C=e.transitionName,S=e.animation,E=e.motion,j=e.placement,O=void 0===j?"right":j,_=e.align,N=void 0===_?{}:_,P=e.destroyTooltipOnHide,Z=void 0!==P&&P,M=e.defaultVisible,T=e.getTooltipContainer,I=e.overlayInnerStyle,A=e.arrowContent,R=e.overlay,D=e.id,L=e.showArrow,F=(0,u.Z)(e,["overlayClassName","trigger","mouseEnterDelay","mouseLeaveDelay","overlayStyle","prefixCls","children","onVisibleChange","afterVisibleChange","transitionName","animation","motion","placement","align","destroyTooltipOnHide","defaultVisible","getTooltipContainer","overlayInnerStyle","arrowContent","overlay","id","showArrow"]),z=(0,d.useRef)(null);(0,d.useImperativeHandle)(t,(function(){return z.current}));var B=(0,s.Z)({},F);"visible"in e&&(B.popupVisible=e.visible);var U=!1,V=!1;if("boolean"===typeof Z)U=Z;else if(Z&&"object"===(0,c.Z)(Z)){var H=Z.keepParent;U=!0===H,V=!1===H}return d.createElement(f.Z,(0,a.Z)({popupClassName:n,prefixCls:b,popup:function(){return d.createElement(h,{showArrow:L,arrowContent:A,key:"content",prefixCls:b,id:D,overlayInnerStyle:I},R)},action:o,builtinPlacements:p.C,popupPlacement:O,ref:z,popupAlign:N,getPopupContainer:T,onPopupVisibleChange:w,afterPopupVisibleChange:k,popupTransitionName:C,popupAnimation:S,popupMotion:E,defaultPopupVisible:M,destroyPopupOnHide:U,autoDestroy:V,mouseLeaveDelay:m,popupStyle:g,mouseEnterDelay:l},B),x)};const m=(0,d.forwardRef)(v);var g=n(1978),y=n(1742),b=n(5750),x=n(405),w=n(4766),k=n(6530),C=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o=0||r.indexOf("Bottom")>=0?a.top="".concat(o.height-t.offset[1],"px"):(r.indexOf("Top")>=0||r.indexOf("bottom")>=0)&&(a.top="".concat(-t.offset[1],"px")),r.indexOf("left")>=0||r.indexOf("Right")>=0?a.left="".concat(o.width-t.offset[0],"px"):(r.indexOf("right")>=0||r.indexOf("Left")>=0)&&(a.left="".concat(-t.offset[0],"px")),e.style.transformOrigin="".concat(a.left," ").concat(a.top)}},overlayInnerStyle:H,arrowContent:d.createElement("span",{className:"".concat(R,"-arrow-content"),style:F}),motion:{motionName:(0,x.mL)(D,"zoom-big-fast",e.transitionName),motionDeadline:1e3}}),L?(0,k.Tm)(z,{className:U}):z)}));j.defaultProps={placement:"top",mouseEnterDelay:.1,mouseLeaveDelay:.1,arrowPointAtCenter:!1,autoAdjustOverflow:!0};const O=j},2365:(e,t,n)=>{"use strict";n.d(t,{Z:()=>_});var r=n(3028),o=n(6234),a=n(6666),i=n(2159),l=n(969),c=n(5667),s=n.n(c),u=n(1482),d=n(6522),f=n(1370),p=n(5277),h=n(5334);function v(e){return"object"===(0,d.Z)(e)&&"string"===typeof e.name&&"string"===typeof e.theme&&("object"===(0,d.Z)(e.icon)||"function"===typeof e.icon)}function m(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r=e[n];if("class"===n)t.className=r,delete t.class;else t[n]=r;return t}),{})}function g(e,t,n){return n?l.createElement(e.tag,(0,r.Z)((0,r.Z)({key:t},m(e.attrs)),n),(e.children||[]).map((function(n,r){return g(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):l.createElement(e.tag,(0,r.Z)({key:t},m(e.attrs)),(e.children||[]).map((function(n,r){return g(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function y(e){return(0,f.R_)(e)[0]}function b(e){return e?Array.isArray(e)?e:[e]:[]}var x="\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",w=["icon","className","onClick","style","primaryColor","secondaryColor"],k={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,o=e.icon,a=e.className,c=e.onClick,s=e.style,d=e.primaryColor,f=e.secondaryColor,m=(0,i.Z)(e,w),b=k;if(d&&(b={primaryColor:d,secondaryColor:f||y(d)}),function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,t=(0,l.useContext)(u.Z).csp;(0,l.useEffect)((function(){(0,h.hq)(e,"@ant-design-icons",{prepend:!0,csp:t})}),[])}(),t=v(o),n="icon should be icon definiton, but got ".concat(o),(0,p.ZP)(t,"[@ant-design/icons] ".concat(n)),!v(o))return null;var C=o;return C&&"function"===typeof C.icon&&(C=(0,r.Z)((0,r.Z)({},C),{},{icon:C.icon(b.primaryColor,b.secondaryColor)})),g(C.icon,"svg-".concat(C.name),(0,r.Z)({className:a,onClick:c,style:s,"data-icon":C.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},m))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,r.Z)({},k)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;k.primaryColor=t,k.secondaryColor=n||y(t),k.calculated=!!n};const S=C;function E(e){var t=b(e),n=(0,o.Z)(t,2),r=n[0],a=n[1];return S.setTwoToneColors({primaryColor:r,secondaryColor:a})}var j=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];E("#1890ff");var O=l.forwardRef((function(e,t){var n,c=e.className,d=e.icon,f=e.spin,p=e.rotate,h=e.tabIndex,v=e.onClick,m=e.twoToneColor,g=(0,i.Z)(e,j),y=l.useContext(u.Z).prefixCls,x=void 0===y?"anticon":y,w=s()(x,(n={},(0,a.Z)(n,"".concat(x,"-").concat(d.name),!!d.name),(0,a.Z)(n,"".concat(x,"-spin"),!!f||"loading"===d.name),n),c),k=h;void 0===k&&v&&(k=-1);var C=p?{msTransform:"rotate(".concat(p,"deg)"),transform:"rotate(".concat(p,"deg)")}:void 0,E=b(m),O=(0,o.Z)(E,2),_=O[0],N=O[1];return l.createElement("span",(0,r.Z)((0,r.Z)({role:"img","aria-label":d.name},g),{},{ref:t,tabIndex:k,onClick:v,className:w}),l.createElement(S,{icon:d,primaryColor:_,secondaryColor:N,style:C}))}));O.displayName="AntdIcon",O.getTwoToneColor=function(){var e=S.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},O.setTwoToneColor=E;const _=O},1482:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=(0,n(969).createContext)({})},315:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"}}]},name:"check-circle",theme:"filled"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CheckCircleFilled";const c=o.forwardRef(l)},3473:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0051.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z"}},{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"check-circle",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CheckCircleOutlined";const c=o.forwardRef(l)},8052:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 00-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"}}]},name:"check",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CheckOutlined";const c=o.forwardRef(l)},3063:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 01-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z"}}]},name:"close-circle",theme:"filled"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CloseCircleFilled";const c=o.forwardRef(l)},2665:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M685.4 354.8c0-4.4-3.6-8-8-8l-66 .3L512 465.6l-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155L340.5 670a8.32 8.32 0 00-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3L512 564.4l99.3 118.4 66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z"}},{tag:"path",attrs:{d:"M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"close-circle",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CloseCircleOutlined";const c=o.forwardRef(l)},8107:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"}}]},name:"close",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="CloseOutlined";const c=o.forwardRef(l)},9362:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"}}]},name:"down",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="DownOutlined";const c=o.forwardRef(l)},977:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"ellipsis",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="EllipsisOutlined";const c=o.forwardRef(l)},7949:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"}}]},name:"exclamation-circle",theme:"filled"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="ExclamationCircleFilled";const c=o.forwardRef(l)},4349:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"}}]},name:"exclamation-circle",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="ExclamationCircleOutlined";const c=o.forwardRef(l)},6963:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"}}]},name:"info-circle",theme:"filled"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="InfoCircleFilled";const c=o.forwardRef(l)},6902:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z"}}]},name:"info-circle",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="InfoCircleOutlined";const c=o.forwardRef(l)},7987:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z"}}]},name:"loading",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="LoadingOutlined";const c=o.forwardRef(l)},4620:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="RightOutlined";const c=o.forwardRef(l)},8399:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o=n(969);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0011.6 0l43.6-43.5a8.2 8.2 0 000-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z"}}]},name:"search",theme:"outlined"};var i=n(2365),l=function(e,t){return o.createElement(i.Z,(0,r.Z)((0,r.Z)({},e),{},{ref:t,icon:a}))};l.displayName="SearchOutlined";const c=o.forwardRef(l)},5667:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t{"use strict";var r=n(6973),o={"text/plain":"Text","text/html":"Url",default:"Text"};e.exports=function(e,t){var n,a,i,l,c,s,u=!1;t||(t={}),n=t.debug||!1;try{if(i=r(),l=document.createRange(),c=document.getSelection(),(s=document.createElement("span")).textContent=e,s.style.all="unset",s.style.position="fixed",s.style.top=0,s.style.clip="rect(0, 0, 0, 0)",s.style.whiteSpace="pre",s.style.webkitUserSelect="text",s.style.MozUserSelect="text",s.style.msUserSelect="text",s.style.userSelect="text",s.addEventListener("copy",(function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),"undefined"===typeof r.clipboardData){n&&console.warn("unable to use e.clipboardData"),n&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var a=o[t.format]||o.default;window.clipboardData.setData(a,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))})),document.body.appendChild(s),l.selectNodeContents(s),c.addRange(l),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");u=!0}catch(d){n&&console.error("unable to copy using execCommand: ",d),n&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(t.format||"text",e),t.onCopy&&t.onCopy(window.clipboardData),u=!0}catch(d){n&&console.error("unable to copy using clipboardData: ",d),n&&console.error("falling back to prompt"),a=function(e){var t=(/mac os x/i.test(navigator.userAgent)?"\u2318":"Ctrl")+"+C";return e.replace(/#{\s*key\s*}/g,t)}("message"in t?t.message:"Copy to clipboard: #{key}, Enter"),window.prompt(a,e)}}finally{c&&("function"==typeof c.removeRange?c.removeRange(l):c.removeAllRanges()),s&&document.body.removeChild(s),i()}return u}},4437:function(e,t,n){var r;!function(o){"use strict";var a,i=1e9,l={precision:20,rounding:4,toExpNeg:-7,toExpPos:21,LN10:"2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286"},c=!0,s="[DecimalError] ",u=s+"Invalid argument: ",d=s+"Exponent out of range: ",f=Math.floor,p=Math.pow,h=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,v=1e7,m=9007199254740991,g=f(1286742750677284.5),y={};function b(e,t){var n,r,o,a,i,l,s,u,d=e.constructor,f=d.precision;if(!e.s||!t.s)return t.s||(t=new d(e)),c?N(t,f):t;if(s=e.d,u=t.d,i=e.e,o=t.e,s=s.slice(),a=i-o){for(a<0?(r=s,a=-a,l=u.length):(r=u,o=i,l=s.length),a>(l=(i=Math.ceil(f/7))>l?i+1:l+1)&&(a=l,r.length=1),r.reverse();a--;)r.push(0);r.reverse()}for((l=s.length)-(a=u.length)<0&&(a=l,r=u,u=s,s=r),n=0;a;)n=(s[--a]=s[a]+u[a]+n)/v|0,s[a]%=v;for(n&&(s.unshift(n),++o),l=s.length;0==s[--l];)s.pop();return t.d=s,t.e=o,c?N(t,f):t}function x(e,t,n){if(e!==~~e||en)throw Error(u+e)}function w(e){var t,n,r,o=e.length-1,a="",i=e[0];if(o>0){for(a+=i,t=1;te.e^a.s<0?1:-1;for(t=0,n=(r=a.d.length)<(o=e.d.length)?r:o;te.d[t]^a.s<0?1:-1;return r===o?0:r>o^a.s<0?1:-1},y.decimalPlaces=y.dp=function(){var e=this,t=e.d.length-1,n=7*(t-e.e);if(t=e.d[t])for(;t%10==0;t/=10)n--;return n<0?0:n},y.dividedBy=y.div=function(e){return k(this,new this.constructor(e))},y.dividedToIntegerBy=y.idiv=function(e){var t=this.constructor;return N(k(this,new t(e),0,1),t.precision)},y.equals=y.eq=function(e){return!this.cmp(e)},y.exponent=function(){return S(this)},y.greaterThan=y.gt=function(e){return this.cmp(e)>0},y.greaterThanOrEqualTo=y.gte=function(e){return this.cmp(e)>=0},y.isInteger=y.isint=function(){return this.e>this.d.length-2},y.isNegative=y.isneg=function(){return this.s<0},y.isPositive=y.ispos=function(){return this.s>0},y.isZero=function(){return 0===this.s},y.lessThan=y.lt=function(e){return this.cmp(e)<0},y.lessThanOrEqualTo=y.lte=function(e){return this.cmp(e)<1},y.logarithm=y.log=function(e){var t,n=this,r=n.constructor,o=r.precision,i=o+5;if(void 0===e)e=new r(10);else if((e=new r(e)).s<1||e.eq(a))throw Error(s+"NaN");if(n.s<1)throw Error(s+(n.s?"NaN":"-Infinity"));return n.eq(a)?new r(0):(c=!1,t=k(O(n,i),O(e,i),i),c=!0,N(t,o))},y.minus=y.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?P(t,e):b(t,(e.s=-e.s,e))},y.modulo=y.mod=function(e){var t,n=this,r=n.constructor,o=r.precision;if(!(e=new r(e)).s)throw Error(s+"NaN");return n.s?(c=!1,t=k(n,e,0,1).times(e),c=!0,n.minus(t)):N(new r(n),o)},y.naturalExponential=y.exp=function(){return C(this)},y.naturalLogarithm=y.ln=function(){return O(this)},y.negated=y.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e},y.plus=y.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?b(t,e):P(t,(e.s=-e.s,e))},y.precision=y.sd=function(e){var t,n,r,o=this;if(void 0!==e&&e!==!!e&&1!==e&&0!==e)throw Error(u+e);if(t=S(o)+1,n=7*(r=o.d.length-1)+1,r=o.d[r]){for(;r%10==0;r/=10)n--;for(r=o.d[0];r>=10;r/=10)n++}return e&&t>n?t:n},y.squareRoot=y.sqrt=function(){var e,t,n,r,o,a,i,l=this,u=l.constructor;if(l.s<1){if(!l.s)return new u(0);throw Error(s+"NaN")}for(e=S(l),c=!1,0==(o=Math.sqrt(+l))||o==1/0?(((t=w(l.d)).length+e)%2==0&&(t+="0"),o=Math.sqrt(t),e=f((e+1)/2)-(e<0||e%2),r=new u(t=o==1/0?"5e"+e:(t=o.toExponential()).slice(0,t.indexOf("e")+1)+e)):r=new u(o.toString()),o=i=(n=u.precision)+3;;)if(r=(a=r).plus(k(l,a,i+2)).times(.5),w(a.d).slice(0,i)===(t=w(r.d)).slice(0,i)){if(t=t.slice(i-3,i+1),o==i&&"4999"==t){if(N(a,n+1,0),a.times(a).eq(l)){r=a;break}}else if("9999"!=t)break;i+=4}return c=!0,N(r,n)},y.times=y.mul=function(e){var t,n,r,o,a,i,l,s,u,d=this,f=d.constructor,p=d.d,h=(e=new f(e)).d;if(!d.s||!e.s)return new f(0);for(e.s*=d.s,n=d.e+e.e,(s=p.length)<(u=h.length)&&(a=p,p=h,h=a,i=s,s=u,u=i),a=[],r=i=s+u;r--;)a.push(0);for(r=u;--r>=0;){for(t=0,o=s+r;o>r;)l=a[o]+h[r]*p[o-r-1]+t,a[o--]=l%v|0,t=l/v|0;a[o]=(a[o]+t)%v|0}for(;!a[--i];)a.pop();return t?++n:a.shift(),e.d=a,e.e=n,c?N(e,f.precision):e},y.toDecimalPlaces=y.todp=function(e,t){var n=this,r=n.constructor;return n=new r(n),void 0===e?n:(x(e,0,i),void 0===t?t=r.rounding:x(t,0,8),N(n,e+S(n)+1,t))},y.toExponential=function(e,t){var n,r=this,o=r.constructor;return void 0===e?n=Z(r,!0):(x(e,0,i),void 0===t?t=o.rounding:x(t,0,8),n=Z(r=N(new o(r),e+1,t),!0,e+1)),n},y.toFixed=function(e,t){var n,r,o=this,a=o.constructor;return void 0===e?Z(o):(x(e,0,i),void 0===t?t=a.rounding:x(t,0,8),n=Z((r=N(new a(o),e+S(o)+1,t)).abs(),!1,e+S(r)+1),o.isneg()&&!o.isZero()?"-"+n:n)},y.toInteger=y.toint=function(){var e=this,t=e.constructor;return N(new t(e),S(e)+1,t.rounding)},y.toNumber=function(){return+this},y.toPower=y.pow=function(e){var t,n,r,o,i,l,u=this,d=u.constructor,p=+(e=new d(e));if(!e.s)return new d(a);if(!(u=new d(u)).s){if(e.s<1)throw Error(s+"Infinity");return u}if(u.eq(a))return u;if(r=d.precision,e.eq(a))return N(u,r);if(l=(t=e.e)>=(n=e.d.length-1),i=u.s,l){if((n=p<0?-p:p)<=m){for(o=new d(a),t=Math.ceil(r/7+4),c=!1;n%2&&M((o=o.times(u)).d,t),0!==(n=f(n/2));)M((u=u.times(u)).d,t);return c=!0,e.s<0?new d(a).div(o):N(o,r)}}else if(i<0)throw Error(s+"NaN");return i=i<0&&1&e.d[Math.max(t,n)]?-1:1,u.s=1,c=!1,o=e.times(O(u,r+12)),c=!0,(o=C(o)).s=i,o},y.toPrecision=function(e,t){var n,r,o=this,a=o.constructor;return void 0===e?r=Z(o,(n=S(o))<=a.toExpNeg||n>=a.toExpPos):(x(e,1,i),void 0===t?t=a.rounding:x(t,0,8),r=Z(o=N(new a(o),e,t),e<=(n=S(o))||n<=a.toExpNeg,e)),r},y.toSignificantDigits=y.tosd=function(e,t){var n=this.constructor;return void 0===e?(e=n.precision,t=n.rounding):(x(e,1,i),void 0===t?t=n.rounding:x(t,0,8)),N(new n(this),e,t)},y.toString=y.valueOf=y.val=y.toJSON=function(){var e=this,t=S(e),n=e.constructor;return Z(e,t<=n.toExpNeg||t>=n.toExpPos)};var k=function(){function e(e,t){var n,r=0,o=e.length;for(e=e.slice();o--;)n=e[o]*t+r,e[o]=n%v|0,r=n/v|0;return r&&e.unshift(r),e}function t(e,t,n,r){var o,a;if(n!=r)a=n>r?1:-1;else for(o=a=0;ot[o]?1:-1;break}return a}function n(e,t,n){for(var r=0;n--;)e[n]-=r,r=e[n]1;)e.shift()}return function(r,o,a,i){var l,c,u,d,f,p,h,m,g,y,b,x,w,k,C,E,j,O,_=r.constructor,P=r.s==o.s?1:-1,Z=r.d,M=o.d;if(!r.s)return new _(r);if(!o.s)throw Error(s+"Division by zero");for(c=r.e-o.e,j=M.length,C=Z.length,m=(h=new _(P)).d=[],u=0;M[u]==(Z[u]||0);)++u;if(M[u]>(Z[u]||0)&&--c,(x=null==a?a=_.precision:i?a+(S(r)-S(o))+1:a)<0)return new _(0);if(x=x/7+2|0,u=0,1==j)for(d=0,M=M[0],x++;(u1&&(M=e(M,d),Z=e(Z,d),j=M.length,C=Z.length),k=j,y=(g=Z.slice(0,j)).length;y=v/2&&++E;do{d=0,(l=t(M,g,j,y))<0?(b=g[0],j!=y&&(b=b*v+(g[1]||0)),(d=b/E|0)>1?(d>=v&&(d=v-1),1==(l=t(f=e(M,d),g,p=f.length,y=g.length))&&(d--,n(f,j16)throw Error(d+S(e));if(!e.s)return new f(a);for(null==t?(c=!1,l=h):l=t,i=new f(.03125);e.abs().gte(.1);)e=e.times(i),u+=5;for(l+=Math.log(p(2,u))/Math.LN10*2+5|0,n=r=o=new f(a),f.precision=l;;){if(r=N(r.times(e),l),n=n.times(++s),w((i=o.plus(k(r,n,l))).d).slice(0,l)===w(o.d).slice(0,l)){for(;u--;)o=N(o.times(o),l);return f.precision=h,null==t?(c=!0,N(o,h)):o}o=i}}function S(e){for(var t=7*e.e,n=e.d[0];n>=10;n/=10)t++;return t}function E(e,t,n){if(t>e.LN10.sd())throw c=!0,n&&(e.precision=n),Error(s+"LN10 precision limit exceeded");return N(new e(e.LN10),t)}function j(e){for(var t="";e--;)t+="0";return t}function O(e,t){var n,r,o,i,l,u,d,f,p,h=1,v=e,m=v.d,g=v.constructor,y=g.precision;if(v.s<1)throw Error(s+(v.s?"NaN":"-Infinity"));if(v.eq(a))return new g(0);if(null==t?(c=!1,f=y):f=t,v.eq(10))return null==t&&(c=!0),E(g,f);if(f+=10,g.precision=f,r=(n=w(m)).charAt(0),i=S(v),!(Math.abs(i)<15e14))return d=E(g,f+2,y).times(i+""),v=O(new g(r+"."+n.slice(1)),f-10).plus(d),g.precision=y,null==t?(c=!0,N(v,y)):v;for(;r<7&&1!=r||1==r&&n.charAt(1)>3;)r=(n=w((v=v.times(e)).d)).charAt(0),h++;for(i=S(v),r>1?(v=new g("0."+n),i++):v=new g(r+"."+n.slice(1)),u=l=v=k(v.minus(a),v.plus(a),f),p=N(v.times(v),f),o=3;;){if(l=N(l.times(p),f),w((d=u.plus(k(l,new g(o),f))).d).slice(0,f)===w(u.d).slice(0,f))return u=u.times(2),0!==i&&(u=u.plus(E(g,f+2,y).times(i+""))),u=k(u,new g(h),f),g.precision=y,null==t?(c=!0,N(u,y)):u;u=d,o+=2}}function _(e,t){var n,r,o;for((n=t.indexOf("."))>-1&&(t=t.replace(".","")),(r=t.search(/e/i))>0?(n<0&&(n=r),n+=+t.slice(r+1),t=t.substring(0,r)):n<0&&(n=t.length),r=0;48===t.charCodeAt(r);)++r;for(o=t.length;48===t.charCodeAt(o-1);)--o;if(t=t.slice(r,o)){if(o-=r,n=n-r-1,e.e=f(n/7),e.d=[],r=(n+1)%7,n<0&&(r+=7),rg||e.e<-g))throw Error(d+n)}else e.s=0,e.e=0,e.d=[0];return e}function N(e,t,n){var r,o,a,i,l,s,u,h,m=e.d;for(i=1,a=m[0];a>=10;a/=10)i++;if((r=t-i)<0)r+=7,o=t,u=m[h=0];else{if((h=Math.ceil((r+1)/7))>=(a=m.length))return e;for(u=a=m[h],i=1;a>=10;a/=10)i++;o=(r%=7)-7+i}if(void 0!==n&&(l=u/(a=p(10,i-o-1))%10|0,s=t<0||void 0!==m[h+1]||u%a,s=n<4?(l||s)&&(0==n||n==(e.s<0?3:2)):l>5||5==l&&(4==n||s||6==n&&(r>0?o>0?u/p(10,i-o):0:m[h-1])%10&1||n==(e.s<0?8:7))),t<1||!m[0])return s?(a=S(e),m.length=1,t=t-a-1,m[0]=p(10,(7-t%7)%7),e.e=f(-t/7)||0):(m.length=1,m[0]=e.e=e.s=0),e;if(0==r?(m.length=h,a=1,h--):(m.length=h+1,a=p(10,7-r),m[h]=o>0?(u/p(10,i-o)%p(10,o)|0)*a:0),s)for(;;){if(0==h){(m[0]+=a)==v&&(m[0]=1,++e.e);break}if(m[h]+=a,m[h]!=v)break;m[h--]=0,a=1}for(r=m.length;0===m[--r];)m.pop();if(c&&(e.e>g||e.e<-g))throw Error(d+S(e));return e}function P(e,t){var n,r,o,a,i,l,s,u,d,f,p=e.constructor,h=p.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new p(e),c?N(t,h):t;if(s=e.d,f=t.d,r=t.e,u=e.e,s=s.slice(),i=u-r){for((d=i<0)?(n=s,i=-i,l=f.length):(n=f,r=u,l=s.length),i>(o=Math.max(Math.ceil(h/7),l)+2)&&(i=o,n.length=1),n.reverse(),o=i;o--;)n.push(0);n.reverse()}else{for((d=(o=s.length)<(l=f.length))&&(l=o),o=0;o0;--o)s[l++]=0;for(o=f.length;o>i;){if(s[--o]0?a=a.charAt(0)+"."+a.slice(1)+j(r):i>1&&(a=a.charAt(0)+"."+a.slice(1)),a=a+(o<0?"e":"e+")+o):o<0?(a="0."+j(-o-1)+a,n&&(r=n-i)>0&&(a+=j(r))):o>=i?(a+=j(o+1-i),n&&(r=n-o-1)>0&&(a=a+"."+j(r))):((r=o+1)0&&(o+1===i&&(a+="."),a+=j(r))),e.s<0?"-"+a:a}function M(e,t){if(e.length>t)return e.length=t,!0}function T(e){if(!e||"object"!==typeof e)throw Error(s+"Object expected");var t,n,r,o=["precision",1,i,"rounding",0,8,"toExpNeg",-1/0,0,"toExpPos",0,1/0];for(t=0;t=o[t+1]&&r<=o[t+2]))throw Error(u+n+": "+r);this[n]=r}if(void 0!==(r=e[n="LN10"])){if(r!=Math.LN10)throw Error(u+n+": "+r);this[n]=new this(r)}return this}l=function e(t){var n,r,o;function a(e){var t=this;if(!(t instanceof a))return new a(e);if(t.constructor=a,e instanceof a)return t.s=e.s,t.e=e.e,void(t.d=(e=e.d)?e.slice():e);if("number"===typeof e){if(0*e!==0)throw Error(u+e);if(e>0)t.s=1;else{if(!(e<0))return t.s=0,t.e=0,void(t.d=[0]);e=-e,t.s=-1}return e===~~e&&e<1e7?(t.e=0,void(t.d=[e])):_(t,e.toString())}if("string"!==typeof e)throw Error(u+e);if(45===e.charCodeAt(0)?(e=e.slice(1),t.s=-1):t.s=1,!h.test(e))throw Error(u+e);_(t,e)}if(a.prototype=y,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=e,a.config=a.set=T,void 0===t&&(t={}),t)for(o=["precision","rounding","toExpNeg","toExpPos","LN10"],n=0;n{"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function a(e,t,r,a,i){if("function"!==typeof r)throw new TypeError("The listener must be a function");var l=new o(r,a||e,i),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],l]:e._events[c].push(l):(e._events[c]=l,e._eventsCount++),e}function i(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function l(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),l.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},l.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,a=r.length,i=new Array(a);o{var r=n(9519)(n(5498),"DataView");e.exports=r},3210:(e,t,n)=>{var r=n(3793),o=n(44),a=n(5427),i=n(2720),l=n(1249);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(3910),o=n(9515),a=n(2267),i=n(9008),l=n(5035);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(9519)(n(5498),"Map");e.exports=r},9365:(e,t,n)=>{var r=n(9789),o=n(2052),a=n(7940),i=n(6467),l=n(5188);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t{var r=n(9519)(n(5498),"Promise");e.exports=r},5889:(e,t,n)=>{var r=n(9519)(n(5498),"Set");e.exports=r},1294:(e,t,n)=>{var r=n(9365),o=n(7162),a=n(4456);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t{var r=n(1864),o=n(6960),a=n(4265),i=n(2468),l=n(8866),c=n(2822);function s(e){var t=this.__data__=new r(e);this.size=t.size}s.prototype.clear=o,s.prototype.delete=a,s.prototype.get=i,s.prototype.has=l,s.prototype.set=c,e.exports=s},5435:(e,t,n)=>{var r=n(5498).Symbol;e.exports=r},6343:(e,t,n)=>{var r=n(5498).Uint8Array;e.exports=r},1963:(e,t,n)=>{var r=n(9519)(n(5498),"WeakMap");e.exports=r},8280:e=>{e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},7098:e=>{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,a=[];++n{var r=n(2830);e.exports=function(e,t){return!!(null==e?0:e.length)&&r(e,t,0)>-1}},3528:e=>{e.exports=function(e,t,n){for(var r=-1,o=null==e?0:e.length;++r{var r=n(191),o=n(2824),a=n(9756),i=n(5377),l=n(790),c=n(9239),s=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=a(e),u=!n&&o(e),d=!n&&!u&&i(e),f=!n&&!u&&!d&&c(e),p=n||u||d||f,h=p?r(e.length,String):[],v=h.length;for(var m in e)!t&&!s.call(e,m)||p&&("length"==m||d&&("offset"==m||"parent"==m)||f&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||l(m,v))||h.push(m);return h}},6306:e=>{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n{e.exports=function(e,t){for(var n=-1,r=t.length,o=e.length;++n{e.exports=function(e,t,n,r){var o=-1,a=null==e?0:e.length;for(r&&a&&(n=e[++o]);++o{e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n{e.exports=function(e){return e.split("")}},1308:e=>{var t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=function(e){return e.match(t)||[]}},4402:(e,t,n)=>{var r=n(6170);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},6232:(e,t,n)=>{var r=n(3079);e.exports=function(e,t,n){"__proto__"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},6051:(e,t,n)=>{var r=n(993),o=n(8849)(r);e.exports=o},9634:(e,t,n)=>{var r=n(6051);e.exports=function(e,t){var n=!0;return r(e,(function(e,r,o){return n=!!t(e,r,o)})),n}},2802:(e,t,n)=>{var r=n(5100);e.exports=function(e,t,n){for(var o=-1,a=e.length;++o{e.exports=function(e,t,n,r){for(var o=e.length,a=n+(r?1:-1);r?a--:++a{var r=n(4013),o=n(7530);e.exports=function e(t,n,a,i,l){var c=-1,s=t.length;for(a||(a=o),l||(l=[]);++c0&&a(u)?n>1?e(u,n-1,a,i,l):r(l,u):i||(l[l.length]=u)}return l}},6540:(e,t,n)=>{var r=n(6583)();e.exports=r},993:(e,t,n)=>{var r=n(6540),o=n(3675);e.exports=function(e,t){return e&&r(e,t,o)}},2374:(e,t,n)=>{var r=n(6729),o=n(239);e.exports=function(e,t){for(var n=0,a=(t=r(t,e)).length;null!=e&&n{var r=n(4013),o=n(9756);e.exports=function(e,t,n){var a=t(e);return o(e)?a:r(a,n(e))}},1602:(e,t,n)=>{var r=n(5435),o=n(4745),a=n(4363),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):a(e)}},2106:e=>{e.exports=function(e,t){return e>t}},7201:e=>{e.exports=function(e,t){return null!=e&&t in Object(e)}},2830:(e,t,n)=>{var r=n(8453),o=n(5307),a=n(1821);e.exports=function(e,t,n){return t===t?a(e,t,n):r(e,o,n)}},9801:(e,t,n)=>{var r=n(1602),o=n(7126);e.exports=function(e){return o(e)&&"[object Arguments]"==r(e)}},8247:(e,t,n)=>{var r=n(4329),o=n(7126);e.exports=function e(t,n,a,i,l){return t===n||(null==t||null==n||!o(t)&&!o(n)?t!==t&&n!==n:r(t,n,a,i,e,l))}},4329:(e,t,n)=>{var r=n(9155),o=n(2951),a=n(9691),i=n(4037),l=n(8342),c=n(9756),s=n(5377),u=n(9239),d="[object Arguments]",f="[object Array]",p="[object Object]",h=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,v,m,g){var y=c(e),b=c(t),x=y?f:l(e),w=b?f:l(t),k=(x=x==d?p:x)==p,C=(w=w==d?p:w)==p,S=x==w;if(S&&s(e)){if(!s(t))return!1;y=!0,k=!1}if(S&&!k)return g||(g=new r),y||u(e)?o(e,t,n,v,m,g):a(e,t,x,n,v,m,g);if(!(1&n)){var E=k&&h.call(e,"__wrapped__"),j=C&&h.call(t,"__wrapped__");if(E||j){var O=E?e.value():e,_=j?t.value():t;return g||(g=new r),m(O,_,n,v,g)}}return!!S&&(g||(g=new r),i(e,t,n,v,m,g))}},46:(e,t,n)=>{var r=n(9155),o=n(8247);e.exports=function(e,t,n,a){var i=n.length,l=i,c=!a;if(null==e)return!l;for(e=Object(e);i--;){var s=n[i];if(c&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++i{e.exports=function(e){return e!==e}},8273:(e,t,n)=>{var r=n(8776),o=n(8758),a=n(4274),i=n(6512),l=/^\[object .+?Constructor\]$/,c=Function.prototype,s=Object.prototype,u=c.toString,d=s.hasOwnProperty,f=RegExp("^"+u.call(d).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!a(e)||o(e))&&(r(e)?f:l).test(i(e))}},1967:(e,t,n)=>{var r=n(1602),o=n(8465),a=n(7126),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!i[r(e)]}},8311:(e,t,n)=>{var r=n(4844),o=n(3219),a=n(4308),i=n(9756),l=n(9679);e.exports=function(e){return"function"==typeof e?e:null==e?a:"object"==typeof e?i(e)?o(e[0],e[1]):r(e):l(e)}},3746:(e,t,n)=>{var r=n(1121),o=n(2633),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=[];for(var n in Object(e))a.call(e,n)&&"constructor"!=n&&t.push(n);return t}},2676:e=>{e.exports=function(e,t){return e{var r=n(6051),o=n(6274);e.exports=function(e,t){var n=-1,a=o(e)?Array(e.length):[];return r(e,(function(e,r,o){a[++n]=t(e,r,o)})),a}},4844:(e,t,n)=>{var r=n(46),o=n(6123),a=n(7711);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},3219:(e,t,n)=>{var r=n(8247),o=n(6292),a=n(3415),i=n(1057),l=n(8802),c=n(7711),s=n(239);e.exports=function(e,t){return i(e)&&l(t)?c(s(e),t):function(n){var i=o(n,e);return void 0===i&&i===t?a(n,e):r(t,i,3)}}},8770:(e,t,n)=>{var r=n(6306),o=n(2374),a=n(8311),i=n(7774),l=n(9473),c=n(5098),s=n(957),u=n(4308),d=n(9756);e.exports=function(e,t,n){t=t.length?r(t,(function(e){return d(e)?function(t){return o(t,1===e.length?e[0]:e)}:e})):[u];var f=-1;t=r(t,c(a));var p=i(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++f,value:e}}));return l(p,(function(e,t){return s(e,t,n)}))}},215:e=>{e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},7139:(e,t,n)=>{var r=n(2374);e.exports=function(e){return function(t){return r(t,e)}}},8829:e=>{e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},7839:e=>{var t=Math.ceil,n=Math.max;e.exports=function(e,r,o,a){for(var i=-1,l=n(t((r-e)/(o||1)),0),c=Array(l);l--;)c[a?l:++i]=e,e+=o;return c}},280:(e,t,n)=>{var r=n(4308),o=n(8868),a=n(4886);e.exports=function(e,t){return a(o(e,t,r),e+"")}},7913:(e,t,n)=>{var r=n(8923),o=n(3079),a=n(4308),i=o?function(e,t){return o(e,"toString",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:a;e.exports=i},2111:e=>{e.exports=function(e,t,n){var r=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var a=Array(o);++r{var r=n(6051);e.exports=function(e,t){var n;return r(e,(function(e,r,o){return!(n=t(e,r,o))})),!!n}},9473:e=>{e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},191:e=>{e.exports=function(e,t){for(var n=-1,r=Array(e);++n{var r=n(5435),o=n(6306),a=n(9756),i=n(5100),l=r?r.prototype:void 0,c=l?l.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(a(t))return o(t,e)+"";if(i(t))return c?c.call(t):"";var n=t+"";return"0"==n&&1/t==-Infinity?"-0":n}},7559:(e,t,n)=>{var r=n(2710),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},5098:e=>{e.exports=function(e){return function(t){return e(t)}}},3970:(e,t,n)=>{var r=n(1294),o=n(4918),a=n(3528),i=n(2195),l=n(598),c=n(2761);e.exports=function(e,t,n){var s=-1,u=o,d=e.length,f=!0,p=[],h=p;if(n)f=!1,u=a;else if(d>=200){var v=t?null:l(e);if(v)return c(v);f=!1,u=i,h=new r}else h=t?[]:p;e:for(;++s{e.exports=function(e,t){return e.has(t)}},6729:(e,t,n)=>{var r=n(9756),o=n(1057),a=n(7476),i=n(1361);e.exports=function(e,t){return r(e)?e:o(e,t)?[e]:a(i(e))}},105:(e,t,n)=>{var r=n(2111);e.exports=function(e,t,n){var o=e.length;return n=void 0===n?o:n,!t&&n>=o?e:r(e,t,n)}},9955:(e,t,n)=>{var r=n(5100);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,a=e===e,i=r(e),l=void 0!==t,c=null===t,s=t===t,u=r(t);if(!c&&!u&&!i&&e>t||i&&l&&s&&!c&&!u||o&&l&&s||!n&&s||!a)return 1;if(!o&&!i&&!u&&e{var r=n(9955);e.exports=function(e,t,n){for(var o=-1,a=e.criteria,i=t.criteria,l=a.length,c=n.length;++o=c?s:s*("desc"==n[o]?-1:1)}return e.index-t.index}},78:(e,t,n)=>{var r=n(5498)["__core-js_shared__"];e.exports=r},8849:(e,t,n)=>{var r=n(6274);e.exports=function(e,t){return function(n,o){if(null==n)return n;if(!r(n))return e(n,o);for(var a=n.length,i=t?a:-1,l=Object(n);(t?i--:++i{e.exports=function(e){return function(t,n,r){for(var o=-1,a=Object(t),i=r(t),l=i.length;l--;){var c=i[e?l:++o];if(!1===n(a[c],c,a))break}return t}}},6865:(e,t,n)=>{var r=n(105),o=n(1911),a=n(9167),i=n(1361);e.exports=function(e){return function(t){t=i(t);var n=o(t)?a(t):void 0,l=n?n[0]:t.charAt(0),c=n?r(n,1).join(""):t.slice(1);return l[e]()+c}}},3374:(e,t,n)=>{var r=n(3529),o=n(8723),a=n(5826),i=RegExp("['\u2019]","g");e.exports=function(e){return function(t){return r(a(o(t).replace(i,"")),e,"")}}},1591:(e,t,n)=>{var r=n(8311),o=n(6274),a=n(3675);e.exports=function(e){return function(t,n,i){var l=Object(t);if(!o(t)){var c=r(n,3);t=a(t),n=function(e){return c(l[e],e,l)}}var s=e(t,n,i);return s>-1?l[c?t[s]:s]:void 0}}},881:(e,t,n)=>{var r=n(7839),o=n(9193),a=n(1465);e.exports=function(e){return function(t,n,i){return i&&"number"!=typeof i&&o(t,n,i)&&(n=i=void 0),t=a(t),void 0===n?(n=t,t=0):n=a(n),i=void 0===i?t{var r=n(5889),o=n(1398),a=n(2761),i=r&&1/a(new r([,-0]))[1]==1/0?function(e){return new r(e)}:o;e.exports=i},4521:(e,t,n)=>{var r=n(8829)({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"});e.exports=r},3079:(e,t,n)=>{var r=n(9519),o=function(){try{var e=r(Object,"defineProperty");return e({},"",{}),e}catch(t){}}();e.exports=o},2951:(e,t,n)=>{var r=n(1294),o=n(3964),a=n(2195);e.exports=function(e,t,n,i,l,c){var s=1&n,u=e.length,d=t.length;if(u!=d&&!(s&&d>u))return!1;var f=c.get(e),p=c.get(t);if(f&&p)return f==t&&p==e;var h=-1,v=!0,m=2&n?new r:void 0;for(c.set(e,t),c.set(t,e);++h{var r=n(5435),o=n(6343),a=n(6170),i=n(2951),l=n(2107),c=n(2761),s=r?r.prototype:void 0,u=s?s.valueOf:void 0;e.exports=function(e,t,n,r,s,d,f){switch(n){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!d(new o(e),new o(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return a(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var p=l;case"[object Set]":var h=1&r;if(p||(p=c),e.size!=t.size&&!h)return!1;var v=f.get(e);if(v)return v==t;r|=2,f.set(e,t);var m=i(p(e),p(t),r,s,d,f);return f.delete(e),m;case"[object Symbol]":if(u)return u.call(e)==u.call(t)}return!1}},4037:(e,t,n)=>{var r=n(337),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,a,i,l){var c=1&n,s=r(e),u=s.length;if(u!=r(t).length&&!c)return!1;for(var d=u;d--;){var f=s[d];if(!(c?f in t:o.call(t,f)))return!1}var p=l.get(e),h=l.get(t);if(p&&h)return p==t&&h==e;var v=!0;l.set(e,t),l.set(t,e);for(var m=c;++d{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;e.exports=r},337:(e,t,n)=>{var r=n(4151),o=n(6578),a=n(3675);e.exports=function(e){return r(e,a,o)}},8690:(e,t,n)=>{var r=n(5136);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},6123:(e,t,n)=>{var r=n(8802),o=n(3675);e.exports=function(e){for(var t=o(e),n=t.length;n--;){var a=t[n],i=e[a];t[n]=[a,i,r(i)]}return t}},9519:(e,t,n)=>{var r=n(8273),o=n(4959);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},2661:(e,t,n)=>{var r=n(4102)(Object.getPrototypeOf,Object);e.exports=r},4745:(e,t,n)=>{var r=n(5435),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,l=r?r.toStringTag:void 0;e.exports=function(e){var t=a.call(e,l),n=e[l];try{e[l]=void 0;var r=!0}catch(c){}var o=i.call(e);return r&&(t?e[l]=n:delete e[l]),o}},6578:(e,t,n)=>{var r=n(8047),o=n(7759),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,l=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return a.call(e,t)})))}:o;e.exports=l},8342:(e,t,n)=>{var r=n(3107),o=n(8553),a=n(2445),i=n(5889),l=n(1963),c=n(1602),s=n(6512),u="[object Map]",d="[object Promise]",f="[object Set]",p="[object WeakMap]",h="[object DataView]",v=s(r),m=s(o),g=s(a),y=s(i),b=s(l),x=c;(r&&x(new r(new ArrayBuffer(1)))!=h||o&&x(new o)!=u||a&&x(a.resolve())!=d||i&&x(new i)!=f||l&&x(new l)!=p)&&(x=function(e){var t=c(e),n="[object Object]"==t?e.constructor:void 0,r=n?s(n):"";if(r)switch(r){case v:return h;case m:return u;case g:return d;case y:return f;case b:return p}return t}),e.exports=x},4959:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},2735:(e,t,n)=>{var r=n(6729),o=n(2824),a=n(9756),i=n(790),l=n(8465),c=n(239);e.exports=function(e,t,n){for(var s=-1,u=(t=r(t,e)).length,d=!1;++s{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},1711:e=>{var t=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return t.test(e)}},3793:(e,t,n)=>{var r=n(811);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},44:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},5427:(e,t,n)=>{var r=n(811),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return"__lodash_hash_undefined__"===n?void 0:n}return o.call(t,e)?t[e]:void 0}},2720:(e,t,n)=>{var r=n(811),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:o.call(t,e)}},1249:(e,t,n)=>{var r=n(811);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?"__lodash_hash_undefined__":t,this}},7530:(e,t,n)=>{var r=n(5435),o=n(2824),a=n(9756),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return a(e)||o(e)||!!(i&&e&&e[i])}},790:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,n){var r=typeof e;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&t.test(e))&&e>-1&&e%1==0&&e{var r=n(6170),o=n(6274),a=n(790),i=n(4274);e.exports=function(e,t,n){if(!i(n))return!1;var l=typeof t;return!!("number"==l?o(n)&&a(t,n.length):"string"==l&&t in n)&&r(n[t],e)}},1057:(e,t,n)=>{var r=n(9756),o=n(5100),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},5136:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},8758:(e,t,n)=>{var r=n(78),o=function(){var e=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();e.exports=function(e){return!!o&&o in e}},1121:e=>{var t=Object.prototype;e.exports=function(e){var n=e&&e.constructor;return e===("function"==typeof n&&n.prototype||t)}},8802:(e,t,n)=>{var r=n(4274);e.exports=function(e){return e===e&&!r(e)}},3910:e=>{e.exports=function(){this.__data__=[],this.size=0}},9515:(e,t,n)=>{var r=n(4402),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():o.call(t,n,1),--this.size,!0)}},2267:(e,t,n)=>{var r=n(4402);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},9008:(e,t,n)=>{var r=n(4402);e.exports=function(e){return r(this.__data__,e)>-1}},5035:(e,t,n)=>{var r=n(4402);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},9789:(e,t,n)=>{var r=n(3210),o=n(1864),a=n(8553);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},2052:(e,t,n)=>{var r=n(8690);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},7940:(e,t,n)=>{var r=n(8690);e.exports=function(e){return r(this,e).get(e)}},6467:(e,t,n)=>{var r=n(8690);e.exports=function(e){return r(this,e).has(e)}},5188:(e,t,n)=>{var r=n(8690);e.exports=function(e,t){var n=r(this,e),o=n.size;return n.set(e,t),this.size+=n.size==o?0:1,this}},2107:e=>{e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},7711:e=>{e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},6400:(e,t,n)=>{var r=n(2198);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},811:(e,t,n)=>{var r=n(9519)(Object,"create");e.exports=r},2633:(e,t,n)=>{var r=n(4102)(Object.keys,Object);e.exports=r},1495:(e,t,n)=>{e=n.nmd(e);var r=n(1363),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,i=a&&a.exports===o&&r.process,l=function(){try{var e=a&&a.require&&a.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(t){}}();e.exports=l},4363:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},4102:e=>{e.exports=function(e,t){return function(n){return e(t(n))}}},8868:(e,t,n)=>{var r=n(8280),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var a=arguments,i=-1,l=o(a.length-t,0),c=Array(l);++i{var r=n(1363),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},7162:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},4456:e=>{e.exports=function(e){return this.__data__.has(e)}},2761:e=>{e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},4886:(e,t,n)=>{var r=n(7913),o=n(9445)(r);e.exports=o},9445:e=>{var t=Date.now;e.exports=function(e){var n=0,r=0;return function(){var o=t(),a=16-(o-r);if(r=o,a>0){if(++n>=800)return arguments[0]}else n=0;return e.apply(void 0,arguments)}}},6960:(e,t,n)=>{var r=n(1864);e.exports=function(){this.__data__=new r,this.size=0}},4265:e=>{e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},2468:e=>{e.exports=function(e){return this.__data__.get(e)}},8866:e=>{e.exports=function(e){return this.__data__.has(e)}},2822:(e,t,n)=>{var r=n(1864),o=n(8553),a=n(9365);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(i)}return n.set(e,t),this.size=n.size,this}},1821:e=>{e.exports=function(e,t,n){for(var r=n-1,o=e.length;++r{var r=n(5692),o=n(1911),a=n(9809);e.exports=function(e){return o(e)?a(e):r(e)}},7476:(e,t,n)=>{var r=n(6400),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(o,(function(e,n,r,o){t.push(r?o.replace(a,"$1"):n||e)})),t}));e.exports=i},239:(e,t,n)=>{var r=n(5100);e.exports=function(e){if("string"==typeof e||r(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t}},6512:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(n){}try{return e+""}catch(n){}}return""}},2710:e=>{var t=/\s/;e.exports=function(e){for(var n=e.length;n--&&t.test(e.charAt(n)););return n}},9809:e=>{var t="[\\ud800-\\udfff]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",r="\\ud83c[\\udffb-\\udfff]",o="[^\\ud800-\\udfff]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",i="[\\ud800-\\udbff][\\udc00-\\udfff]",l="(?:"+n+"|"+r+")"+"?",c="[\\ufe0e\\ufe0f]?",s=c+l+("(?:\\u200d(?:"+[o,a,i].join("|")+")"+c+l+")*"),u="(?:"+[o+n+"?",n,a,i,t].join("|")+")",d=RegExp(r+"(?="+r+")|"+u+s,"g");e.exports=function(e){return e.match(d)||[]}},3786:e=>{var t="\\u2700-\\u27bf",n="a-z\\xdf-\\xf6\\xf8-\\xff",r="A-Z\\xc0-\\xd6\\xd8-\\xde",o="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",a="["+o+"]",i="\\d+",l="[\\u2700-\\u27bf]",c="["+n+"]",s="[^\\ud800-\\udfff"+o+i+t+n+r+"]",u="(?:\\ud83c[\\udde6-\\uddff]){2}",d="[\\ud800-\\udbff][\\udc00-\\udfff]",f="["+r+"]",p="(?:"+c+"|"+s+")",h="(?:"+f+"|"+s+")",v="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",m="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",g="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",y="[\\ufe0e\\ufe0f]?",b=y+g+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",u,d].join("|")+")"+y+g+")*"),x="(?:"+[l,u,d].join("|")+")"+b,w=RegExp([f+"?"+c+"+"+v+"(?="+[a,f,"$"].join("|")+")",h+"+"+m+"(?="+[a,f+p,"$"].join("|")+")",f+"?"+p+"+"+v,f+"+"+m,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",i,x].join("|"),"g");e.exports=function(e){return e.match(w)||[]}},2208:(e,t,n)=>{var r=n(1877),o=n(3374)((function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)}));e.exports=o},1877:(e,t,n)=>{var r=n(1361),o=n(93);e.exports=function(e){return o(r(e).toLowerCase())}},8923:e=>{e.exports=function(e){return function(){return e}}},7917:(e,t,n)=>{var r=n(4274),o=n(8257),a=n(4378),i=Math.max,l=Math.min;e.exports=function(e,t,n){var c,s,u,d,f,p,h=0,v=!1,m=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function y(t){var n=c,r=s;return c=s=void 0,h=t,d=e.apply(r,n)}function b(e){return h=e,f=setTimeout(w,t),v?y(e):d}function x(e){var n=e-p;return void 0===p||n>=t||n<0||m&&e-h>=u}function w(){var e=o();if(x(e))return k(e);f=setTimeout(w,function(e){var n=t-(e-p);return m?l(n,u-(e-h)):n}(e))}function k(e){return f=void 0,g&&c?y(e):(c=s=void 0,d)}function C(){var e=o(),n=x(e);if(c=arguments,s=this,p=e,n){if(void 0===f)return b(p);if(m)return clearTimeout(f),f=setTimeout(w,t),y(p)}return void 0===f&&(f=setTimeout(w,t)),d}return t=a(t)||0,r(n)&&(v=!!n.leading,u=(m="maxWait"in n)?i(a(n.maxWait)||0,t):u,g="trailing"in n?!!n.trailing:g),C.cancel=function(){void 0!==f&&clearTimeout(f),h=0,c=p=s=f=void 0},C.flush=function(){return void 0===f?d:k(o())},C}},8723:(e,t,n)=>{var r=n(4521),o=n(1361),a=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,i=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=function(e){return(e=o(e))&&e.replace(a,r).replace(i,"")}},6170:e=>{e.exports=function(e,t){return e===t||e!==e&&t!==t}},1992:(e,t,n)=>{var r=n(7098),o=n(9634),a=n(8311),i=n(9756),l=n(9193);e.exports=function(e,t,n){var c=i(e)?r:o;return n&&l(e,t,n)&&(t=void 0),c(e,a(t,3))}},2288:(e,t,n)=>{var r=n(1591)(n(9874));e.exports=r},9874:(e,t,n)=>{var r=n(8453),o=n(8311),a=n(4596),i=Math.max;e.exports=function(e,t,n){var l=null==e?0:e.length;if(!l)return-1;var c=null==n?0:a(n);return c<0&&(c=i(l+c,0)),r(e,o(t,3),c)}},4410:(e,t,n)=>{var r=n(3937),o=n(5488);e.exports=function(e,t){return r(o(e,t),1)}},6292:(e,t,n)=>{var r=n(2374);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},3415:(e,t,n)=>{var r=n(7201),o=n(2735);e.exports=function(e,t){return null!=e&&o(e,t,r)}},4308:e=>{e.exports=function(e){return e}},2824:(e,t,n)=>{var r=n(9801),o=n(7126),a=Object.prototype,i=a.hasOwnProperty,l=a.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(e){return o(e)&&i.call(e,"callee")&&!l.call(e,"callee")};e.exports=c},9756:e=>{var t=Array.isArray;e.exports=t},6274:(e,t,n)=>{var r=n(8776),o=n(8465);e.exports=function(e){return null!=e&&o(e.length)&&!r(e)}},9091:(e,t,n)=>{var r=n(1602),o=n(7126);e.exports=function(e){return!0===e||!1===e||o(e)&&"[object Boolean]"==r(e)}},5377:(e,t,n)=>{e=n.nmd(e);var r=n(5498),o=n(8364),a=t&&!t.nodeType&&t,i=a&&e&&!e.nodeType&&e,l=i&&i.exports===a?r.Buffer:void 0,c=(l?l.isBuffer:void 0)||o;e.exports=c},5888:(e,t,n)=>{var r=n(8247);e.exports=function(e,t){return r(e,t)}},8776:(e,t,n)=>{var r=n(1602),o=n(4274);e.exports=function(e){if(!o(e))return!1;var t=r(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},8465:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},8694:(e,t,n)=>{var r=n(4164);e.exports=function(e){return r(e)&&e!=+e}},523:e=>{e.exports=function(e){return null==e}},4164:(e,t,n)=>{var r=n(1602),o=n(7126);e.exports=function(e){return"number"==typeof e||o(e)&&"[object Number]"==r(e)}},4274:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7126:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},7722:(e,t,n)=>{var r=n(1602),o=n(2661),a=n(7126),i=Function.prototype,l=Object.prototype,c=i.toString,s=l.hasOwnProperty,u=c.call(Object);e.exports=function(e){if(!a(e)||"[object Object]"!=r(e))return!1;var t=o(e);if(null===t)return!0;var n=s.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==u}},6446:(e,t,n)=>{var r=n(1602),o=n(9756),a=n(7126);e.exports=function(e){return"string"==typeof e||!o(e)&&a(e)&&"[object String]"==r(e)}},5100:(e,t,n)=>{var r=n(1602),o=n(7126);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},9239:(e,t,n)=>{var r=n(1967),o=n(5098),a=n(1495),i=a&&a.isTypedArray,l=i?o(i):r;e.exports=l},3675:(e,t,n)=>{var r=n(774),o=n(3746),a=n(6274);e.exports=function(e){return a(e)?r(e):o(e)}},9985:e=>{e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},5488:(e,t,n)=>{var r=n(6306),o=n(8311),a=n(7774),i=n(9756);e.exports=function(e,t){return(i(e)?r:a)(e,o(t,3))}},9227:(e,t,n)=>{var r=n(6232),o=n(993),a=n(8311);e.exports=function(e,t){var n={};return t=a(t,3),o(e,(function(e,o,a){r(n,o,t(e,o,a))})),n}},3486:(e,t,n)=>{var r=n(2802),o=n(2106),a=n(4308);e.exports=function(e){return e&&e.length?r(e,a,o):void 0}},2198:(e,t,n)=>{var r=n(9365);function o(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(o.Cache||r),n}o.Cache=r,e.exports=o},4179:(e,t,n)=>{var r=n(2802),o=n(2676),a=n(4308);e.exports=function(e){return e&&e.length?r(e,a,o):void 0}},1398:e=>{e.exports=function(){}},8257:(e,t,n)=>{var r=n(5498);e.exports=function(){return r.Date.now()}},9679:(e,t,n)=>{var r=n(215),o=n(7139),a=n(1057),i=n(239);e.exports=function(e){return a(e)?r(i(e)):o(e)}},4932:(e,t,n)=>{var r=n(881)();e.exports=r},5770:(e,t,n)=>{var r=n(3964),o=n(8311),a=n(636),i=n(9756),l=n(9193);e.exports=function(e,t,n){var c=i(e)?r:a;return n&&l(e,t,n)&&(t=void 0),c(e,o(t,3))}},8941:(e,t,n)=>{var r=n(3937),o=n(8770),a=n(280),i=n(9193),l=a((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=l},7759:e=>{e.exports=function(){return[]}},8364:e=>{e.exports=function(){return!1}},2356:(e,t,n)=>{var r=n(7917),o=n(4274);e.exports=function(e,t,n){var a=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return o(n)&&(a="leading"in n?!!n.leading:a,i="trailing"in n?!!n.trailing:i),r(e,t,{leading:a,maxWait:t,trailing:i})}},1465:(e,t,n)=>{var r=n(4378),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}},4596:(e,t,n)=>{var r=n(1465);e.exports=function(e){var t=r(e),n=t%1;return t===t?n?t-n:t:0}},4378:(e,t,n)=>{var r=n(7559),o=n(4274),a=n(5100),i=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,c=/^0o[0-7]+$/i,s=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(a(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var n=l.test(e);return n||c.test(e)?s(e.slice(2),n?2:8):i.test(e)?NaN:+e}},1361:(e,t,n)=>{var r=n(4991);e.exports=function(e){return null==e?"":r(e)}},2700:(e,t,n)=>{var r=n(8311),o=n(3970);e.exports=function(e,t){return e&&e.length?o(e,r(t,2)):[]}},93:(e,t,n)=>{var r=n(6865)("toUpperCase");e.exports=r},5826:(e,t,n)=>{var r=n(1308),o=n(1711),a=n(1361),i=n(3786);e.exports=function(e,t,n){return e=a(e),void 0===(t=n?void 0:t)?o(e)?i(e):r(e):e.match(t)||[]}},2426:function(e,t,n){(e=n.nmd(e)).exports=function(){"use strict";var t,n;function r(){return t.apply(null,arguments)}function o(e){t=e}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function c(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(l(e,t))return!1;return!0}function s(e){return void 0===e}function u(e){return"number"===typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,r=[],o=e.length;for(n=0;n>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+r}var R=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,D=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,L={},F={};function z(e,t,n,r){var o=r;"string"===typeof r&&(o=function(){return this[r]()}),e&&(F[e]=o),t&&(F[t[0]]=function(){return A(o.apply(this,arguments),t[1],t[2])}),n&&(F[n]=function(){return this.localeData().ordinal(o.apply(this,arguments),e)})}function B(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function U(e){var t,n,r=e.match(R);for(t=0,n=r.length;t=0&&D.test(e);)e=e.replace(D,r),D.lastIndex=0,n-=1;return e}var K={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function W(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(R).map((function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e})).join(""),this._longDateFormat[e])}var Y="Invalid date";function q(){return this._invalidDate}var $="%d",G=/\d{1,2}/;function X(e){return this._ordinal.replace("%d",e)}var Q={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function J(e,t,n,r){var o=this._relativeTime[n];return N(o)?o(e,t,n,r):o.replace(/%d/i,e)}function ee(e,t){var n=this._relativeTime[e>0?"future":"past"];return N(n)?n(t):n.replace(/%s/i,t)}var te={};function ne(e,t){var n=e.toLowerCase();te[n]=te[n+"s"]=te[t]=e}function re(e){return"string"===typeof e?te[e]||te[e.toLowerCase()]:void 0}function oe(e){var t,n,r={};for(n in e)l(e,n)&&(t=re(n))&&(r[t]=e[n]);return r}var ae={};function ie(e,t){ae[e]=t}function le(e){var t,n=[];for(t in e)l(e,t)&&n.push({unit:t,priority:ae[t]});return n.sort((function(e,t){return e.priority-t.priority})),n}function ce(e){return e%4===0&&e%100!==0||e%400===0}function se(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function ue(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=se(t)),n}function de(e,t){return function(n){return null!=n?(pe(this,e,n),r.updateOffset(this,t),this):fe(this,e)}}function fe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function pe(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&ce(e.year())&&1===e.month()&&29===e.date()?(n=ue(n),e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Je(n,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function he(e){return N(this[e=re(e)])?this[e]():this}function ve(e,t){if("object"===typeof e){var n,r=le(e=oe(e)),o=r.length;for(n=0;n68?1900:2e3)};var mt=de("FullYear",!0);function gt(){return ce(this.year())}function yt(e,t,n,r,o,a,i){var l;return e<100&&e>=0?(l=new Date(e+400,t,n,r,o,a,i),isFinite(l.getFullYear())&&l.setFullYear(e)):l=new Date(e,t,n,r,o,a,i),l}function bt(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function xt(e,t,n){var r=7+t-n;return-(7+bt(e,0,r).getUTCDay()-t)%7+r-1}function wt(e,t,n,r,o){var a,i,l=1+7*(t-1)+(7+n-r)%7+xt(e,r,o);return l<=0?i=vt(a=e-1)+l:l>vt(e)?(a=e+1,i=l-vt(e)):(a=e,i=l),{year:a,dayOfYear:i}}function kt(e,t,n){var r,o,a=xt(e.year(),t,n),i=Math.floor((e.dayOfYear()-a-1)/7)+1;return i<1?r=i+Ct(o=e.year()-1,t,n):i>Ct(e.year(),t,n)?(r=i-Ct(e.year(),t,n),o=e.year()+1):(o=e.year(),r=i),{week:r,year:o}}function Ct(e,t,n){var r=xt(e,t,n),o=xt(e+1,t,n);return(vt(e)-r+o)/7}function St(e){return kt(e,this._week.dow,this._week.doy).week}z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),ne("week","w"),ne("isoWeek","W"),ie("week",5),ie("isoWeek",5),Ie("w",ke),Ie("ww",ke,ye),Ie("W",ke),Ie("WW",ke,ye),ze(["w","ww","W","WW"],(function(e,t,n,r){t[r.substr(0,1)]=ue(e)}));var Et={dow:0,doy:6};function jt(){return this._week.dow}function Ot(){return this._week.doy}function _t(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function Nt(e){var t=kt(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function Pt(e,t){return"string"!==typeof e?e:isNaN(e)?"number"===typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}function Zt(e,t){return"string"===typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Mt(e,t){return e.slice(t,7).concat(e.slice(0,t))}z("d",0,"do","day"),z("dd",0,0,(function(e){return this.localeData().weekdaysMin(this,e)})),z("ddd",0,0,(function(e){return this.localeData().weekdaysShort(this,e)})),z("dddd",0,0,(function(e){return this.localeData().weekdays(this,e)})),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),ne("day","d"),ne("weekday","e"),ne("isoWeekday","E"),ie("day",11),ie("weekday",11),ie("isoWeekday",11),Ie("d",ke),Ie("e",ke),Ie("E",ke),Ie("dd",(function(e,t){return t.weekdaysMinRegex(e)})),Ie("ddd",(function(e,t){return t.weekdaysShortRegex(e)})),Ie("dddd",(function(e,t){return t.weekdaysRegex(e)})),ze(["dd","ddd","dddd"],(function(e,t,n,r){var o=n._locale.weekdaysParse(e,r,n._strict);null!=o?t.d=o:m(n).invalidWeekday=e})),ze(["d","e","E"],(function(e,t,n,r){t[r]=ue(e)}));var Tt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),It="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),At="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Rt=Te,Dt=Te,Lt=Te;function Ft(e,t){var n=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?Mt(n,this._week.dow):e?n[e.day()]:n}function zt(e){return!0===e?Mt(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Bt(e){return!0===e?Mt(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Ut(e,t,n){var r,o,a,i=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)a=h([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(o=Ue.call(this._weekdaysParse,i))?o:null:"ddd"===t?-1!==(o=Ue.call(this._shortWeekdaysParse,i))?o:null:-1!==(o=Ue.call(this._minWeekdaysParse,i))?o:null:"dddd"===t?-1!==(o=Ue.call(this._weekdaysParse,i))||-1!==(o=Ue.call(this._shortWeekdaysParse,i))||-1!==(o=Ue.call(this._minWeekdaysParse,i))?o:null:"ddd"===t?-1!==(o=Ue.call(this._shortWeekdaysParse,i))||-1!==(o=Ue.call(this._weekdaysParse,i))||-1!==(o=Ue.call(this._minWeekdaysParse,i))?o:null:-1!==(o=Ue.call(this._minWeekdaysParse,i))||-1!==(o=Ue.call(this._weekdaysParse,i))||-1!==(o=Ue.call(this._shortWeekdaysParse,i))?o:null}function Vt(e,t,n){var r,o,a;if(this._weekdaysParseExact)return Ut.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(o=h([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(o,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(o,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(o,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(a="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[r]=new RegExp(a.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function Ht(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=Pt(e,this.localeData()),this.add(e-t,"d")):t}function Kt(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function Wt(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=Zt(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function Yt(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Gt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=Rt),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function qt(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Gt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Dt),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function $t(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Gt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Lt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function e(e,t){return t.length-e.length}var t,n,r,o,a,i=[],l=[],c=[],s=[];for(t=0;t<7;t++)n=h([2e3,1]).day(t),r=De(this.weekdaysMin(n,"")),o=De(this.weekdaysShort(n,"")),a=De(this.weekdays(n,"")),i.push(r),l.push(o),c.push(a),s.push(r),s.push(o),s.push(a);i.sort(e),l.sort(e),c.sort(e),s.sort(e),this._weekdaysRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+c.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function Xt(){return this.hours()%12||12}function Qt(){return this.hours()||24}function Jt(e,t){z(e,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)}))}function en(e,t){return t._meridiemParse}function tn(e){return"p"===(e+"").toLowerCase().charAt(0)}z("H",["HH",2],0,"hour"),z("h",["hh",2],0,Xt),z("k",["kk",2],0,Qt),z("hmm",0,0,(function(){return""+Xt.apply(this)+A(this.minutes(),2)})),z("hmmss",0,0,(function(){return""+Xt.apply(this)+A(this.minutes(),2)+A(this.seconds(),2)})),z("Hmm",0,0,(function(){return""+this.hours()+A(this.minutes(),2)})),z("Hmmss",0,0,(function(){return""+this.hours()+A(this.minutes(),2)+A(this.seconds(),2)})),Jt("a",!0),Jt("A",!1),ne("hour","h"),ie("hour",13),Ie("a",en),Ie("A",en),Ie("H",ke),Ie("h",ke),Ie("k",ke),Ie("HH",ke,ye),Ie("hh",ke,ye),Ie("kk",ke,ye),Ie("hmm",Ce),Ie("hmmss",Se),Ie("Hmm",Ce),Ie("Hmmss",Se),Fe(["H","HH"],We),Fe(["k","kk"],(function(e,t,n){var r=ue(e);t[We]=24===r?0:r})),Fe(["a","A"],(function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e})),Fe(["h","hh"],(function(e,t,n){t[We]=ue(e),m(n).bigHour=!0})),Fe("hmm",(function(e,t,n){var r=e.length-2;t[We]=ue(e.substr(0,r)),t[Ye]=ue(e.substr(r)),m(n).bigHour=!0})),Fe("hmmss",(function(e,t,n){var r=e.length-4,o=e.length-2;t[We]=ue(e.substr(0,r)),t[Ye]=ue(e.substr(r,2)),t[qe]=ue(e.substr(o)),m(n).bigHour=!0})),Fe("Hmm",(function(e,t,n){var r=e.length-2;t[We]=ue(e.substr(0,r)),t[Ye]=ue(e.substr(r))})),Fe("Hmmss",(function(e,t,n){var r=e.length-4,o=e.length-2;t[We]=ue(e.substr(0,r)),t[Ye]=ue(e.substr(r,2)),t[qe]=ue(e.substr(o))}));var nn=/[ap]\.?m?\.?/i,rn=de("Hours",!0);function on(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}var an,ln={calendar:T,longDateFormat:K,invalidDate:Y,ordinal:$,dayOfMonthOrdinalParse:G,relativeTime:Q,months:et,monthsShort:tt,week:Et,weekdays:Tt,weekdaysMin:At,weekdaysShort:It,meridiemParse:nn},cn={},sn={};function un(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n0;){if(r=hn(o.slice(0,t).join("-")))return r;if(n&&n.length>=t&&un(o,n)>=t-1)break;t--}a++}return an}function pn(e){return null!=e.match("^[^/\\\\]*$")}function hn(t){var n=null;if(void 0===cn[t]&&e&&e.exports&&pn(t))try{n=an._abbr,Object(function(){var e=new Error("Cannot find module 'undefined'");throw e.code="MODULE_NOT_FOUND",e}()),vn(n)}catch(r){cn[t]=null}return cn[t]}function vn(e,t){var n;return e&&((n=s(t)?yn(e):mn(e,t))?an=n:"undefined"!==typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),an._abbr}function mn(e,t){if(null!==t){var n,r=ln;if(t.abbr=e,null!=cn[e])_("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=cn[e]._config;else if(null!=t.parentLocale)if(null!=cn[t.parentLocale])r=cn[t.parentLocale]._config;else{if(null==(n=hn(t.parentLocale)))return sn[t.parentLocale]||(sn[t.parentLocale]=[]),sn[t.parentLocale].push({name:e,config:t}),null;r=n._config}return cn[e]=new M(Z(r,t)),sn[e]&&sn[e].forEach((function(e){mn(e.name,e.config)})),vn(e),cn[e]}return delete cn[e],null}function gn(e,t){if(null!=t){var n,r,o=ln;null!=cn[e]&&null!=cn[e].parentLocale?cn[e].set(Z(cn[e]._config,t)):(null!=(r=hn(e))&&(o=r._config),t=Z(o,t),null==r&&(t.abbr=e),(n=new M(t)).parentLocale=cn[e],cn[e]=n),vn(e)}else null!=cn[e]&&(null!=cn[e].parentLocale?(cn[e]=cn[e].parentLocale,e===vn()&&vn(e)):null!=cn[e]&&delete cn[e]);return cn[e]}function yn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return an;if(!a(e)){if(t=hn(e))return t;e=[e]}return fn(e)}function bn(){return j(cn)}function xn(e){var t,n=e._a;return n&&-2===m(e).overflow&&(t=n[He]<0||n[He]>11?He:n[Ke]<1||n[Ke]>Je(n[Ve],n[He])?Ke:n[We]<0||n[We]>24||24===n[We]&&(0!==n[Ye]||0!==n[qe]||0!==n[$e])?We:n[Ye]<0||n[Ye]>59?Ye:n[qe]<0||n[qe]>59?qe:n[$e]<0||n[$e]>999?$e:-1,m(e)._overflowDayOfYear&&(tKe)&&(t=Ke),m(e)._overflowWeeks&&-1===t&&(t=Ge),m(e)._overflowWeekday&&-1===t&&(t=Xe),m(e).overflow=t),e}var wn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,kn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Cn=/Z|[+-]\d\d(?::?\d\d)?/,Sn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],En=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],jn=/^\/?Date\((-?\d+)/i,On=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,_n={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Nn(e){var t,n,r,o,a,i,l=e._i,c=wn.exec(l)||kn.exec(l),s=Sn.length,u=En.length;if(c){for(m(e).iso=!0,t=0,n=s;tvt(a)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),n=bt(a,0,e._dayOfYear),e._a[He]=n.getUTCMonth(),e._a[Ke]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=i[t]=r[t];for(;t<7;t++)e._a[t]=i[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[We]&&0===e._a[Ye]&&0===e._a[qe]&&0===e._a[$e]&&(e._nextDay=!0,e._a[We]=0),e._d=(e._useUTC?bt:yt).apply(null,i),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[We]=24),e._w&&"undefined"!==typeof e._w.d&&e._w.d!==o&&(m(e).weekdayMismatch=!0)}}function zn(e){var t,n,r,o,a,i,l,c,s;null!=(t=e._w).GG||null!=t.W||null!=t.E?(a=1,i=4,n=Dn(t.GG,e._a[Ve],kt($n(),1,4).year),r=Dn(t.W,1),((o=Dn(t.E,1))<1||o>7)&&(c=!0)):(a=e._locale._week.dow,i=e._locale._week.doy,s=kt($n(),a,i),n=Dn(t.gg,e._a[Ve],s.year),r=Dn(t.w,s.week),null!=t.d?((o=t.d)<0||o>6)&&(c=!0):null!=t.e?(o=t.e+a,(t.e<0||t.e>6)&&(c=!0)):o=a),r<1||r>Ct(n,a,i)?m(e)._overflowWeeks=!0:null!=c?m(e)._overflowWeekday=!0:(l=wt(n,r,o,a,i),e._a[Ve]=l.year,e._dayOfYear=l.dayOfYear)}function Bn(e){if(e._f!==r.ISO_8601)if(e._f!==r.RFC_2822){e._a=[],m(e).empty=!0;var t,n,o,a,i,l,c,s=""+e._i,u=s.length,d=0;for(c=(o=H(e._f,e._locale).match(R)||[]).length,t=0;t0&&m(e).unusedInput.push(i),s=s.slice(s.indexOf(n)+n.length),d+=n.length),F[a]?(n?m(e).empty=!1:m(e).unusedTokens.push(a),Be(a,n,e)):e._strict&&!n&&m(e).unusedTokens.push(a);m(e).charsLeftOver=u-d,s.length>0&&m(e).unusedInput.push(s),e._a[We]<=12&&!0===m(e).bigHour&&e._a[We]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[We]=Un(e._locale,e._a[We],e._meridiem),null!==(l=m(e).era)&&(e._a[Ve]=e._locale.erasConvertYear(l,e._a[Ve])),Fn(e),xn(e)}else An(e);else Nn(e)}function Un(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((r=e.isPM(n))&&t<12&&(t+=12),r||12!==t||(t=0),t):t}function Vn(e){var t,n,r,o,a,i,l=!1,c=e._f.length;if(0===c)return m(e).invalidFormat=!0,void(e._d=new Date(NaN));for(o=0;othis?this:e:y()}));function Qn(e,t){var n,r;if(1===t.length&&a(t[0])&&(t=t[0]),!t.length)return $n();for(n=t[0],r=1;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function kr(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e,t={};return w(t,this),(t=Wn(t))._a?(e=t._isUTC?h(t._a):$n(t._a),this._isDSTShifted=this.isValid()&&sr(t._a,e.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function Cr(){return!!this.isValid()&&!this._isUTC}function Sr(){return!!this.isValid()&&this._isUTC}function Er(){return!!this.isValid()&&this._isUTC&&0===this._offset}r.updateOffset=function(){};var jr=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Or=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function _r(e,t){var n,r,o,a=e,i=null;return lr(e)?a={ms:e._milliseconds,d:e._days,M:e._months}:u(e)||!isNaN(+e)?(a={},t?a[t]=+e:a.milliseconds=+e):(i=jr.exec(e))?(n="-"===i[1]?-1:1,a={y:0,d:ue(i[Ke])*n,h:ue(i[We])*n,m:ue(i[Ye])*n,s:ue(i[qe])*n,ms:ue(cr(1e3*i[$e]))*n}):(i=Or.exec(e))?(n="-"===i[1]?-1:1,a={y:Nr(i[2],n),M:Nr(i[3],n),w:Nr(i[4],n),d:Nr(i[5],n),h:Nr(i[6],n),m:Nr(i[7],n),s:Nr(i[8],n)}):null==a?a={}:"object"===typeof a&&("from"in a||"to"in a)&&(o=Zr($n(a.from),$n(a.to)),(a={}).ms=o.milliseconds,a.M=o.months),r=new ir(a),lr(e)&&l(e,"_locale")&&(r._locale=e._locale),lr(e)&&l(e,"_isValid")&&(r._isValid=e._isValid),r}function Nr(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Pr(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function Zr(e,t){var n;return e.isValid()&&t.isValid()?(t=pr(t,e),e.isBefore(t)?n=Pr(e,t):((n=Pr(t,e)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function Mr(e,t){return function(n,r){var o;return null===r||isNaN(+r)||(_(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=r,r=o),Tr(this,_r(n,r),e),this}}function Tr(e,t,n,o){var a=t._milliseconds,i=cr(t._days),l=cr(t._months);e.isValid()&&(o=null==o||o,l&&st(e,fe(e,"Month")+l*n),i&&pe(e,"Date",fe(e,"Date")+i*n),a&&e._d.setTime(e._d.valueOf()+a*n),o&&r.updateOffset(e,i||l))}_r.fn=ir.prototype,_r.invalid=ar;var Ir=Mr(1,"add"),Ar=Mr(-1,"subtract");function Rr(e){return"string"===typeof e||e instanceof String}function Dr(e){return C(e)||d(e)||Rr(e)||u(e)||Fr(e)||Lr(e)||null===e||void 0===e}function Lr(e){var t,n,r=i(e)&&!c(e),o=!1,a=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],s=a.length;for(t=0;tn.valueOf():n.valueOf()9999?V(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):N(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",V(n,"Z")):V(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function eo(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,r,o="moment",a="";return this.isLocal()||(o=0===this.utcOffset()?"moment.utc":"moment.parseZone",a="Z"),e="["+o+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n="-MM-DD[T]HH:mm:ss.SSS",r=a+'[")]',this.format(e+t+n+r)}function to(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=V(this,e);return this.localeData().postformat(t)}function no(e,t){return this.isValid()&&(C(e)&&e.isValid()||$n(e).isValid())?_r({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ro(e){return this.from($n(),e)}function oo(e,t){return this.isValid()&&(C(e)&&e.isValid()||$n(e).isValid())?_r({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ao(e){return this.to($n(),e)}function io(e){var t;return void 0===e?this._locale._abbr:(null!=(t=yn(e))&&(this._locale=t),this)}r.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",r.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var lo=E("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(e){return void 0===e?this.localeData():this.locale(e)}));function co(){return this._locale}var so=1e3,uo=60*so,fo=60*uo,po=3506328*fo;function ho(e,t){return(e%t+t)%t}function vo(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-po:new Date(e,t,n).valueOf()}function mo(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-po:Date.UTC(e,t,n)}function go(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?mo:vo,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=ho(t+(this._isUTC?0:this.utcOffset()*uo),fo);break;case"minute":t=this._d.valueOf(),t-=ho(t,uo);break;case"second":t=this._d.valueOf(),t-=ho(t,so)}return this._d.setTime(t),r.updateOffset(this,!0),this}function yo(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?mo:vo,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=fo-ho(t+(this._isUTC?0:this.utcOffset()*uo),fo)-1;break;case"minute":t=this._d.valueOf(),t+=uo-ho(t,uo)-1;break;case"second":t=this._d.valueOf(),t+=so-ho(t,so)-1}return this._d.setTime(t),r.updateOffset(this,!0),this}function bo(){return this._d.valueOf()-6e4*(this._offset||0)}function xo(){return Math.floor(this.valueOf()/1e3)}function wo(){return new Date(this.valueOf())}function ko(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Co(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function So(){return this.isValid()?this.toISOString():null}function Eo(){return g(this)}function jo(){return p({},m(this))}function Oo(){return m(this).overflow}function _o(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function No(e,t){var n,o,a,i=this._eras||yn("en")._eras;for(n=0,o=i.length;n=0)return c[r]}function Zo(e,t){var n=e.since<=e.until?1:-1;return void 0===t?r(e.since).year():r(e.since).year()+(t-e.offset)*n}function Mo(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e(a=Ct(e,r,o))&&(t=a),Qo.call(this,e,t,n,r,o))}function Qo(e,t,n,r,o){var a=wt(e,t,n,r,o),i=bt(a.year,0,a.dayOfYear);return this.year(i.getUTCFullYear()),this.month(i.getUTCMonth()),this.date(i.getUTCDate()),this}function Jo(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}z("N",0,0,"eraAbbr"),z("NN",0,0,"eraAbbr"),z("NNN",0,0,"eraAbbr"),z("NNNN",0,0,"eraName"),z("NNNNN",0,0,"eraNarrow"),z("y",["y",1],"yo","eraYear"),z("y",["yy",2],0,"eraYear"),z("y",["yyy",3],0,"eraYear"),z("y",["yyyy",4],0,"eraYear"),Ie("N",Fo),Ie("NN",Fo),Ie("NNN",Fo),Ie("NNNN",zo),Ie("NNNNN",Bo),Fe(["N","NN","NNN","NNNN","NNNNN"],(function(e,t,n,r){var o=n._locale.erasParse(e,r,n._strict);o?m(n).era=o:m(n).invalidEra=e})),Ie("y",_e),Ie("yy",_e),Ie("yyy",_e),Ie("yyyy",_e),Ie("yo",Uo),Fe(["y","yy","yyy","yyyy"],Ve),Fe(["yo"],(function(e,t,n,r){var o;n._locale._eraYearOrdinalRegex&&(o=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[Ve]=n._locale.eraYearOrdinalParse(e,o):t[Ve]=parseInt(e,10)})),z(0,["gg",2],0,(function(){return this.weekYear()%100})),z(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Ho("gggg","weekYear"),Ho("ggggg","weekYear"),Ho("GGGG","isoWeekYear"),Ho("GGGGG","isoWeekYear"),ne("weekYear","gg"),ne("isoWeekYear","GG"),ie("weekYear",1),ie("isoWeekYear",1),Ie("G",Ne),Ie("g",Ne),Ie("GG",ke,ye),Ie("gg",ke,ye),Ie("GGGG",je,xe),Ie("gggg",je,xe),Ie("GGGGG",Oe,we),Ie("ggggg",Oe,we),ze(["gggg","ggggg","GGGG","GGGGG"],(function(e,t,n,r){t[r.substr(0,2)]=ue(e)})),ze(["gg","GG"],(function(e,t,n,o){t[o]=r.parseTwoDigitYear(e)})),z("Q",0,"Qo","quarter"),ne("quarter","Q"),ie("quarter",7),Ie("Q",ge),Fe("Q",(function(e,t){t[He]=3*(ue(e)-1)})),z("D",["DD",2],"Do","date"),ne("date","D"),ie("date",9),Ie("D",ke),Ie("DD",ke,ye),Ie("Do",(function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient})),Fe(["D","DD"],Ke),Fe("Do",(function(e,t){t[Ke]=ue(e.match(ke)[0])}));var ea=de("Date",!0);function ta(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}z("DDD",["DDDD",3],"DDDo","dayOfYear"),ne("dayOfYear","DDD"),ie("dayOfYear",4),Ie("DDD",Ee),Ie("DDDD",be),Fe(["DDD","DDDD"],(function(e,t,n){n._dayOfYear=ue(e)})),z("m",["mm",2],0,"minute"),ne("minute","m"),ie("minute",14),Ie("m",ke),Ie("mm",ke,ye),Fe(["m","mm"],Ye);var na=de("Minutes",!1);z("s",["ss",2],0,"second"),ne("second","s"),ie("second",15),Ie("s",ke),Ie("ss",ke,ye),Fe(["s","ss"],qe);var ra,oa,aa=de("Seconds",!1);for(z("S",0,0,(function(){return~~(this.millisecond()/100)})),z(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),z(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),z(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),z(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),z(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),z(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),ne("millisecond","ms"),ie("millisecond",16),Ie("S",Ee,ge),Ie("SS",Ee,ye),Ie("SSS",Ee,be),ra="SSSS";ra.length<=9;ra+="S")Ie(ra,_e);function ia(e,t){t[$e]=ue(1e3*("0."+e))}for(ra="S";ra.length<=9;ra+="S")Fe(ra,ia);function la(){return this._isUTC?"UTC":""}function ca(){return this._isUTC?"Coordinated Universal Time":""}oa=de("Milliseconds",!1),z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var sa=k.prototype;function ua(e){return $n(1e3*e)}function da(){return $n.apply(null,arguments).parseZone()}function fa(e){return e}sa.add=Ir,sa.calendar=Ur,sa.clone=Vr,sa.diff=Gr,sa.endOf=yo,sa.format=to,sa.from=no,sa.fromNow=ro,sa.to=oo,sa.toNow=ao,sa.get=he,sa.invalidAt=Oo,sa.isAfter=Hr,sa.isBefore=Kr,sa.isBetween=Wr,sa.isSame=Yr,sa.isSameOrAfter=qr,sa.isSameOrBefore=$r,sa.isValid=Eo,sa.lang=lo,sa.locale=io,sa.localeData=co,sa.max=Xn,sa.min=Gn,sa.parsingFlags=jo,sa.set=ve,sa.startOf=go,sa.subtract=Ar,sa.toArray=ko,sa.toObject=Co,sa.toDate=wo,sa.toISOString=Jr,sa.inspect=eo,"undefined"!==typeof Symbol&&null!=Symbol.for&&(sa[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),sa.toJSON=So,sa.toString=Qr,sa.unix=xo,sa.valueOf=bo,sa.creationData=_o,sa.eraName=Mo,sa.eraNarrow=To,sa.eraAbbr=Io,sa.eraYear=Ao,sa.year=mt,sa.isLeapYear=gt,sa.weekYear=Ko,sa.isoWeekYear=Wo,sa.quarter=sa.quarters=Jo,sa.month=ut,sa.daysInMonth=dt,sa.week=sa.weeks=_t,sa.isoWeek=sa.isoWeeks=Nt,sa.weeksInYear=$o,sa.weeksInWeekYear=Go,sa.isoWeeksInYear=Yo,sa.isoWeeksInISOWeekYear=qo,sa.date=ea,sa.day=sa.days=Ht,sa.weekday=Kt,sa.isoWeekday=Wt,sa.dayOfYear=ta,sa.hour=sa.hours=rn,sa.minute=sa.minutes=na,sa.second=sa.seconds=aa,sa.millisecond=sa.milliseconds=oa,sa.utcOffset=vr,sa.utc=gr,sa.local=yr,sa.parseZone=br,sa.hasAlignedHourOffset=xr,sa.isDST=wr,sa.isLocal=Cr,sa.isUtcOffset=Sr,sa.isUtc=Er,sa.isUTC=Er,sa.zoneAbbr=la,sa.zoneName=ca,sa.dates=E("dates accessor is deprecated. Use date instead.",ea),sa.months=E("months accessor is deprecated. Use month instead",ut),sa.years=E("years accessor is deprecated. Use year instead",mt),sa.zone=E("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",mr),sa.isDSTShifted=E("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",kr);var pa=M.prototype;function ha(e,t,n,r){var o=yn(),a=h().set(r,t);return o[n](a,e)}function va(e,t,n){if(u(e)&&(t=e,e=void 0),e=e||"",null!=t)return ha(e,t,n,"month");var r,o=[];for(r=0;r<12;r++)o[r]=ha(e,r,n,"month");return o}function ma(e,t,n,r){"boolean"===typeof e?(u(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,u(t)&&(n=t,t=void 0),t=t||"");var o,a=yn(),i=e?a._week.dow:0,l=[];if(null!=n)return ha(t,(n+i)%7,r,"day");for(o=0;o<7;o++)l[o]=ha(t,(o+i)%7,r,"day");return l}function ga(e,t){return va(e,t,"months")}function ya(e,t){return va(e,t,"monthsShort")}function ba(e,t,n){return ma(e,t,n,"weekdays")}function xa(e,t,n){return ma(e,t,n,"weekdaysShort")}function wa(e,t,n){return ma(e,t,n,"weekdaysMin")}pa.calendar=I,pa.longDateFormat=W,pa.invalidDate=q,pa.ordinal=X,pa.preparse=fa,pa.postformat=fa,pa.relativeTime=J,pa.pastFuture=ee,pa.set=P,pa.eras=No,pa.erasParse=Po,pa.erasConvertYear=Zo,pa.erasAbbrRegex=Do,pa.erasNameRegex=Ro,pa.erasNarrowRegex=Lo,pa.months=at,pa.monthsShort=it,pa.monthsParse=ct,pa.monthsRegex=pt,pa.monthsShortRegex=ft,pa.week=St,pa.firstDayOfYear=Ot,pa.firstDayOfWeek=jt,pa.weekdays=Ft,pa.weekdaysMin=Bt,pa.weekdaysShort=zt,pa.weekdaysParse=Vt,pa.weekdaysRegex=Yt,pa.weekdaysShortRegex=qt,pa.weekdaysMinRegex=$t,pa.isPM=tn,pa.meridiem=on,vn("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===ue(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=E("moment.lang is deprecated. Use moment.locale instead.",vn),r.langData=E("moment.langData is deprecated. Use moment.localeData instead.",yn);var ka=Math.abs;function Ca(){var e=this._data;return this._milliseconds=ka(this._milliseconds),this._days=ka(this._days),this._months=ka(this._months),e.milliseconds=ka(e.milliseconds),e.seconds=ka(e.seconds),e.minutes=ka(e.minutes),e.hours=ka(e.hours),e.months=ka(e.months),e.years=ka(e.years),this}function Sa(e,t,n,r){var o=_r(t,n);return e._milliseconds+=r*o._milliseconds,e._days+=r*o._days,e._months+=r*o._months,e._bubble()}function Ea(e,t){return Sa(this,e,t,1)}function ja(e,t){return Sa(this,e,t,-1)}function Oa(e){return e<0?Math.floor(e):Math.ceil(e)}function _a(){var e,t,n,r,o,a=this._milliseconds,i=this._days,l=this._months,c=this._data;return a>=0&&i>=0&&l>=0||a<=0&&i<=0&&l<=0||(a+=864e5*Oa(Pa(l)+i),i=0,l=0),c.milliseconds=a%1e3,e=se(a/1e3),c.seconds=e%60,t=se(e/60),c.minutes=t%60,n=se(t/60),c.hours=n%24,i+=se(n/24),l+=o=se(Na(i)),i-=Oa(Pa(o)),r=se(l/12),l%=12,c.days=i,c.months=l,c.years=r,this}function Na(e){return 4800*e/146097}function Pa(e){return 146097*e/4800}function Za(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if("month"===(e=re(e))||"quarter"===e||"year"===e)switch(t=this._days+r/864e5,n=this._months+Na(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Pa(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}}function Ma(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*ue(this._months/12):NaN}function Ta(e){return function(){return this.as(e)}}var Ia=Ta("ms"),Aa=Ta("s"),Ra=Ta("m"),Da=Ta("h"),La=Ta("d"),Fa=Ta("w"),za=Ta("M"),Ba=Ta("Q"),Ua=Ta("y");function Va(){return _r(this)}function Ha(e){return e=re(e),this.isValid()?this[e+"s"]():NaN}function Ka(e){return function(){return this.isValid()?this._data[e]:NaN}}var Wa=Ka("milliseconds"),Ya=Ka("seconds"),qa=Ka("minutes"),$a=Ka("hours"),Ga=Ka("days"),Xa=Ka("months"),Qa=Ka("years");function Ja(){return se(this.days()/7)}var ei=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function ni(e,t,n,r,o){return o.relativeTime(t||1,!!n,e,r)}function ri(e,t,n,r){var o=_r(e).abs(),a=ei(o.as("s")),i=ei(o.as("m")),l=ei(o.as("h")),c=ei(o.as("d")),s=ei(o.as("M")),u=ei(o.as("w")),d=ei(o.as("y")),f=a<=n.ss&&["s",a]||a0,f[4]=r,ni.apply(null,f)}function oi(e){return void 0===e?ei:"function"===typeof e&&(ei=e,!0)}function ai(e,t){return void 0!==ti[e]&&(void 0===t?ti[e]:(ti[e]=t,"s"===e&&(ti.ss=t-1),!0))}function ii(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,r,o=!1,a=ti;return"object"===typeof e&&(t=e,e=!1),"boolean"===typeof e&&(o=e),"object"===typeof t&&(a=Object.assign({},ti,t),null!=t.s&&null==t.ss&&(a.ss=t.s-1)),r=ri(this,!o,a,n=this.localeData()),o&&(r=n.pastFuture(+this,r)),n.postformat(r)}var li=Math.abs;function ci(e){return(e>0)-(e<0)||+e}function si(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,r,o,a,i,l,c=li(this._milliseconds)/1e3,s=li(this._days),u=li(this._months),d=this.asSeconds();return d?(e=se(c/60),t=se(e/60),c%=60,e%=60,n=se(u/12),u%=12,r=c?c.toFixed(3).replace(/\.?0+$/,""):"",o=d<0?"-":"",a=ci(this._months)!==ci(d)?"-":"",i=ci(this._days)!==ci(d)?"-":"",l=ci(this._milliseconds)!==ci(d)?"-":"",o+"P"+(n?a+n+"Y":"")+(u?a+u+"M":"")+(s?i+s+"D":"")+(t||e||c?"T":"")+(t?l+t+"H":"")+(e?l+e+"M":"")+(c?l+r+"S":"")):"P0D"}var ui=ir.prototype;return ui.isValid=or,ui.abs=Ca,ui.add=Ea,ui.subtract=ja,ui.as=Za,ui.asMilliseconds=Ia,ui.asSeconds=Aa,ui.asMinutes=Ra,ui.asHours=Da,ui.asDays=La,ui.asWeeks=Fa,ui.asMonths=za,ui.asQuarters=Ba,ui.asYears=Ua,ui.valueOf=Ma,ui._bubble=_a,ui.clone=Va,ui.get=Ha,ui.milliseconds=Wa,ui.seconds=Ya,ui.minutes=qa,ui.hours=$a,ui.days=Ga,ui.weeks=Ja,ui.months=Xa,ui.years=Qa,ui.humanize=ii,ui.toISOString=si,ui.toString=si,ui.toJSON=si,ui.locale=io,ui.localeData=co,ui.toIsoString=E("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",si),ui.lang=lo,z("X",0,0,"unix"),z("x",0,0,"valueOf"),Ie("x",Ne),Ie("X",Me),Fe("X",(function(e,t,n){n._d=new Date(1e3*parseFloat(e))})),Fe("x",(function(e,t,n){n._d=new Date(ue(e))})),r.version="2.29.4",o($n),r.fn=sa,r.min=Jn,r.max=er,r.now=tr,r.utc=h,r.unix=ua,r.months=ga,r.isDate=d,r.locale=vn,r.invalid=y,r.duration=_r,r.isMoment=C,r.weekdays=ba,r.parseZone=da,r.localeData=yn,r.isDuration=lr,r.monthsShort=ya,r.weekdaysMin=wa,r.defineLocale=mn,r.updateLocale=gn,r.locales=bn,r.weekdaysShort=xa,r.normalizeUnits=re,r.relativeTimeRounding=oi,r.relativeTimeThreshold=ai,r.calendarFormat=Br,r.prototype=sa,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},r}()},8457:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},4756:(e,t,n)=>{var r=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,r={},o={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);C+=k.value.length,k=k.next){var S=k.value;if(t.length>e.length)return;if(!(S instanceof a)){var E,j=1;if(y){if(!(E=i(w,C,e,g))||E.index>=e.length)break;var O=E.index,_=E.index+E[0].length,N=C;for(N+=k.value.length;O>=N;)N+=(k=k.next).value.length;if(C=N-=k.value.length,k.value instanceof a)continue;for(var P=k;P!==t.tail&&(N<_||"string"===typeof P.value);P=P.next)j++,N+=P.value.length;j--,S=e.slice(C,N),E.index-=C}else if(!(E=i(w,0,S,g)))continue;O=E.index;var Z=E[0],M=S.slice(0,O),T=S.slice(O+Z.length),I=C+S.length;d&&I>d.reach&&(d.reach=I);var A=k.prev;if(M&&(A=s(t,A,M),C+=M.length),u(t,A,j),k=s(t,A,new a(f,m?o.tokenize(Z,m):Z,b,Z)),T&&s(t,k,T),j>1){var R={cause:f+","+h,reach:I};l(e,t,n,k.prev,C,R),d&&R.reach>d.reach&&(d.reach=R.reach)}}}}}}function c(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function u(e,t,n){for(var r=t.next,o=0;o"+a.content+""},!e.document)return e.addEventListener?(o.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),r=n.language,a=n.code,i=n.immediateClose;e.postMessage(o.highlight(a,o.languages[r],r)),i&&e.close()}),!1),o):o;var d=o.util.currentScript();function f(){o.manual||o.highlightAll()}if(d&&(o.filename=d.src,d.hasAttribute("data-manual")&&(o.manual=!0)),!o.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return o}("undefined"!==typeof window?window:"undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=r),"undefined"!==typeof n.g&&(n.g.Prism=r),r.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:n}};o["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:o},r.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(){if("undefined"!==typeof r&&"undefined"!==typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},t="data-src-status",n="loading",o="loaded",a='pre[data-src]:not([data-src-status="loaded"]):not([data-src-status="loading"])';r.hooks.add("before-highlightall",(function(e){e.selector+=", "+a})),r.hooks.add("before-sanity-check",(function(i){var l=i.element;if(l.matches(a)){i.code="",l.setAttribute(t,n);var c=l.appendChild(document.createElement("CODE"));c.textContent="Loading\u2026";var s=l.getAttribute("data-src"),u=i.language;if("none"===u){var d=(/\.(\w+)$/.exec(s)||[,"none"])[1];u=e[d]||d}r.util.setLanguage(c,u),r.util.setLanguage(l,u);var f=r.plugins.autoloader;f&&f.loadLanguages(u),function(e,t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?t(r.responseText):r.status>=400?n("\u2716 Error "+r.status+" while fetching file: "+r.statusText):n("\u2716 Error: File does not exist or is empty"))},r.send(null)}(s,(function(e){l.setAttribute(t,o);var n=function(e){var t=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"");if(t){var n=Number(t[1]),r=t[2],o=t[3];return r?o?[n,Number(o)]:[n,void 0]:[n,n]}}(l.getAttribute("data-range"));if(n){var a=e.split(/\r\n?|\n/g),i=n[0],s=null==n[1]?a.length:n[1];i<0&&(i+=a.length),i=Math.max(0,Math.min(i-1,a.length)),s<0&&(s+=a.length),s=Math.max(0,Math.min(s,a.length)),e=a.slice(i,s).join("\n"),l.hasAttribute("data-start")||l.setAttribute("data-start",String(i+1))}c.textContent=e,r.highlightElement(c)}),(function(e){l.setAttribute(t,"failed"),c.textContent=e}))}})),r.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(a),o=0;t=n[o++];)r.highlightElement(t)}};var i=!1;r.fileHighlight=function(){i||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),i=!0),r.plugins.fileHighlight.highlight.apply(this,arguments)}}}()},2102:(e,t,n)=>{"use strict";var r=n(1369);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},4974:(e,t,n)=>{e.exports=n(2102)()},1369:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4786:(e,t,n)=>{"use strict";n.d(t,{Z:()=>v});var r=n(7896),o=n(6666),a=n(2159),i=n(3028),l=n(9249),c=n(7371),s=n(8106),u=n(551),d=n(969),f=n(5667),p=n.n(f),h=function(e){(0,s.Z)(n,e);var t=(0,u.Z)(n);function n(e){var r;(0,l.Z)(this,n),(r=t.call(this,e)).handleChange=function(e){var t=r.props,n=t.disabled,o=t.onChange;n||("checked"in r.props||r.setState({checked:e.target.checked}),o&&o({target:(0,i.Z)((0,i.Z)({},r.props),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e.nativeEvent}))},r.saveInput=function(e){r.input=e};var o="checked"in e?e.checked:e.defaultChecked;return r.state={checked:o},r}return(0,c.Z)(n,[{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,i=t.className,l=t.style,c=t.name,s=t.id,u=t.type,f=t.disabled,h=t.readOnly,v=t.tabIndex,m=t.onClick,g=t.onFocus,y=t.onBlur,b=t.onKeyDown,x=t.onKeyPress,w=t.onKeyUp,k=t.autoFocus,C=t.value,S=t.required,E=(0,a.Z)(t,["prefixCls","className","style","name","id","type","disabled","readOnly","tabIndex","onClick","onFocus","onBlur","onKeyDown","onKeyPress","onKeyUp","autoFocus","value","required"]),j=Object.keys(E).reduce((function(e,t){return"aria-"!==t.substr(0,5)&&"data-"!==t.substr(0,5)&&"role"!==t||(e[t]=E[t]),e}),{}),O=this.state.checked,_=p()(n,i,(e={},(0,o.Z)(e,"".concat(n,"-checked"),O),(0,o.Z)(e,"".concat(n,"-disabled"),f),e));return d.createElement("span",{className:_,style:l},d.createElement("input",(0,r.Z)({name:c,id:s,type:u,required:S,readOnly:h,disabled:f,tabIndex:v,className:"".concat(n,"-input"),checked:!!O,onClick:m,onFocus:g,onBlur:y,onKeyUp:w,onKeyDown:b,onKeyPress:x,onChange:this.handleChange,autoFocus:k,ref:this.saveInput,value:C},j)),d.createElement("span",{className:"".concat(n,"-inner")}))}}],[{key:"getDerivedStateFromProps",value:function(e,t){return"checked"in e?(0,i.Z)((0,i.Z)({},t),{},{checked:e.checked}):null}}]),n}(d.Component);h.defaultProps={prefixCls:"rc-checkbox",className:"",style:{},type:"checkbox",defaultChecked:!1,onFocus:function(){},onBlur:function(){},onChange:function(){},onKeyDown:function(){},onKeyPress:function(){},onKeyUp:function(){}};const v=h},4175:(e,t,n)=>{"use strict";n.d(t,{Z:()=>w});var r=n(6666),o=n(3028),a=n(6234),i=n(2159),l=n(969),c=n(7218),s=n(5667),u=n.n(s),d={adjustX:1,adjustY:1},f=[0,0];const p={topLeft:{points:["bl","tl"],overflow:d,offset:[0,-4],targetOffset:f},topCenter:{points:["bc","tc"],overflow:d,offset:[0,-4],targetOffset:f},topRight:{points:["br","tr"],overflow:d,offset:[0,-4],targetOffset:f},bottomLeft:{points:["tl","bl"],overflow:d,offset:[0,4],targetOffset:f},bottomCenter:{points:["tc","bc"],overflow:d,offset:[0,4],targetOffset:f},bottomRight:{points:["tr","br"],overflow:d,offset:[0,4],targetOffset:f}};var h=n(4184),v=n(3076),m=n(4500),g=h.Z.ESC,y=h.Z.TAB;var b=["arrow","prefixCls","transitionName","animation","align","placement","placements","getPopupContainer","showAction","hideAction","overlayClassName","overlayStyle","visible","trigger","autoFocus"];function x(e,t){var n=e.arrow,s=void 0!==n&&n,d=e.prefixCls,f=void 0===d?"rc-dropdown":d,h=e.transitionName,x=e.animation,w=e.align,k=e.placement,C=void 0===k?"bottomLeft":k,S=e.placements,E=void 0===S?p:S,j=e.getPopupContainer,O=e.showAction,_=e.hideAction,N=e.overlayClassName,P=e.overlayStyle,Z=e.visible,M=e.trigger,T=void 0===M?["hover"]:M,I=e.autoFocus,A=(0,i.Z)(e,b),R=l.useState(),D=(0,a.Z)(R,2),L=D[0],F=D[1],z="visible"in e?Z:L,B=l.useRef(null);l.useImperativeHandle(t,(function(){return B.current})),function(e){var t=e.visible,n=e.setTriggerVisible,r=e.triggerRef,o=e.onVisibleChange,a=e.autoFocus,i=l.useRef(!1),c=function(){var e,a,i,l;t&&r.current&&(null===(e=r.current)||void 0===e||null===(a=e.triggerRef)||void 0===a||null===(i=a.current)||void 0===i||null===(l=i.focus)||void 0===l||l.call(i),n(!1),"function"===typeof o&&o(!1))},s=function(){var e,t,n,o,a=(0,m.tS)(null===(e=r.current)||void 0===e||null===(t=e.popupRef)||void 0===t||null===(n=t.current)||void 0===n||null===(o=n.getElement)||void 0===o?void 0:o.call(n))[0];return!!(null===a||void 0===a?void 0:a.focus)&&(a.focus(),i.current=!0,!0)},u=function(e){switch(e.keyCode){case g:c();break;case y:var t=!1;i.current||(t=s()),t?e.preventDefault():c()}};l.useEffect((function(){return t?(window.addEventListener("keydown",u),a&&(0,v.Z)(s,3),function(){window.removeEventListener("keydown",u),i.current=!1}):function(){i.current=!1}}),[t])}({visible:z,setTriggerVisible:F,triggerRef:B,onVisibleChange:e.onVisibleChange,autoFocus:I});var U=function(){var t=function(){var t=e.overlay;return"function"===typeof t?t():t}();return l.createElement(l.Fragment,null,s&&l.createElement("div",{className:"".concat(f,"-arrow")}),t)},V=_;return V||-1===T.indexOf("contextMenu")||(V=["click"]),l.createElement(c.Z,(0,o.Z)((0,o.Z)({builtinPlacements:E},A),{},{prefixCls:f,ref:B,popupClassName:u()(N,(0,r.Z)({},"".concat(f,"-show-arrow"),s)),popupStyle:P,action:T,showAction:O,hideAction:V||[],popupPlacement:C,popupAlign:w,popupTransitionName:h,popupAnimation:x,popupVisible:z,stretch:function(){var t=e.minOverlayWidthMatchTrigger,n=e.alignPoint;return"minOverlayWidthMatchTrigger"in e?t:!n}()?"minWidth":"",popup:"function"===typeof e.overlay?U:U(),onPopupVisibleChange:function(t){var n=e.onVisibleChange;F(t),"function"===typeof n&&n(t)},onPopupClick:function(t){var n=e.onOverlayClick;F(!1),n&&n(t)},getPopupContainer:j}),function(){var t=e.children,n=t.props?t.props:{},r=u()(n.className,function(){var t=e.openClassName;return void 0!==t?t:"".concat(f,"-open")}());return z&&t?l.cloneElement(t,{className:r}):t}())}const w=l.forwardRef(x)},7056:(e,t,n)=>{"use strict";n.d(t,{gN:()=>je,zb:()=>y,RV:()=>Le,aV:()=>_e,ZM:()=>Oe,ZP:()=>Ke,cI:()=>Re,qo:()=>Ve});var r=n(969),o=n(7896),a=n(2159),i=n(6666),l=n(3028),c=n(8079),s=n(9249),u=n(7371),d=n(753),f=n(8106),p=n(551),h=n(2148),v=n(5277),m="RC_FORM_INTERNAL_HOOKS",g=function(){(0,v.ZP)(!1,"Can not find FormContext. Please make sure you wrap Field under Form.")};const y=r.createContext({getFieldValue:g,getFieldsValue:g,getFieldError:g,getFieldWarning:g,getFieldsError:g,isFieldsTouched:g,isFieldTouched:g,isFieldValidating:g,isFieldsValidating:g,resetFields:g,setFields:g,setFieldValue:g,setFieldsValue:g,validateFields:g,submit:g,getInternalHooks:function(){return g(),{dispatch:g,initEntityValue:g,registerField:g,useSubscribe:g,setInitialValues:g,destroyForm:g,setCallbacks:g,registerWatch:g,getFields:g,setValidateMessages:g,setPreserve:g,getInitialValue:g}}});function b(e){return void 0===e||null===e?[]:Array.isArray(e)?e:[e]}var x=n(2723),w=n(4795);function k(){return k=Object.assign?Object.assign.bind():function(e){for(var t=1;t1?t-1:0),r=1;r=a)return e;switch(e){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch(t){return"[Circular]"}break;default:return e}}));return i}return e}function Z(e,t){return void 0===e||null===e||(!("array"!==t||!Array.isArray(e)||e.length)||!(!function(e){return"string"===e||"url"===e||"hex"===e||"email"===e||"date"===e||"pattern"===e}(t)||"string"!==typeof e||e))}function M(e,t,n){var r=0,o=e.length;!function a(i){if(i&&i.length)n(i);else{var l=r;r+=1,l()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,z=/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i,B={integer:function(e){return B.number(e)&&parseInt(e,10)===e},float:function(e){return B.number(e)&&!B.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(t){return!1}},date:function(e){return"function"===typeof e.getTime&&"function"===typeof e.getMonth&&"function"===typeof e.getYear&&!isNaN(e.getTime())},number:function(e){return!isNaN(e)&&"number"===typeof e},object:function(e){return"object"===typeof e&&!B.array(e)},method:function(e){return"function"===typeof e},email:function(e){return"string"===typeof e&&e.length<=320&&!!e.match(F)},url:function(e){return"string"===typeof e&&e.length<=2048&&!!e.match(function(){if(D)return D;var e="[a-fA-F\\d:]",t=function(t){return t&&t.includeBoundaries?"(?:(?<=\\s|^)(?="+e+")|(?<="+e+")(?=\\s|$))":""},n="(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}",r="[a-fA-F\\d]{1,4}",o=("\n(?:\n(?:"+r+":){7}(?:"+r+"|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:"+r+":){6}(?:"+n+"|:"+r+"|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:"+r+":){5}(?::"+n+"|(?::"+r+"){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:"+r+":){4}(?:(?::"+r+"){0,1}:"+n+"|(?::"+r+"){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:"+r+":){3}(?:(?::"+r+"){0,2}:"+n+"|(?::"+r+"){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:"+r+":){2}(?:(?::"+r+"){0,3}:"+n+"|(?::"+r+"){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:"+r+":){1}(?:(?::"+r+"){0,4}:"+n+"|(?::"+r+"){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::"+r+"){0,5}:"+n+"|(?::"+r+"){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n").replace(/\s*\/\/.*$/gm,"").replace(/\n/g,"").trim(),a=new RegExp("(?:^"+n+"$)|(?:^"+o+"$)"),i=new RegExp("^"+n+"$"),l=new RegExp("^"+o+"$"),c=function(e){return e&&e.exact?a:new RegExp("(?:"+t(e)+n+t(e)+")|(?:"+t(e)+o+t(e)+")","g")};c.v4=function(e){return e&&e.exact?i:new RegExp(""+t(e)+n+t(e),"g")},c.v6=function(e){return e&&e.exact?l:new RegExp(""+t(e)+o+t(e),"g")};var s=c.v4().source,u=c.v6().source;return D=new RegExp("(?:^(?:(?:(?:[a-z]+:)?//)|www\\.)(?:\\S+(?::\\S*)?@)?(?:localhost|"+s+"|"+u+'|(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:[/?#][^\\s"]*)?$)',"i")}())},hex:function(e){return"string"===typeof e&&!!e.match(z)}},U={required:L,whitespace:function(e,t,n,r,o){(/^\s+$/.test(t)||""===t)&&r.push(P(o.messages.whitespace,e.fullField))},type:function(e,t,n,r,o){if(e.required&&void 0===t)L(e,t,n,r,o);else{var a=e.type;["integer","float","array","regexp","object","method","email","number","date","url","hex"].indexOf(a)>-1?B[a](t)||r.push(P(o.messages.types[a],e.fullField,e.type)):a&&typeof t!==e.type&&r.push(P(o.messages.types[a],e.fullField,e.type))}},range:function(e,t,n,r,o){var a="number"===typeof e.len,i="number"===typeof e.min,l="number"===typeof e.max,c=t,s=null,u="number"===typeof t,d="string"===typeof t,f=Array.isArray(t);if(u?s="number":d?s="string":f&&(s="array"),!s)return!1;f&&(c=t.length),d&&(c=t.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length),a?c!==e.len&&r.push(P(o.messages[s].len,e.fullField,e.len)):i&&!l&&ce.max?r.push(P(o.messages[s].max,e.fullField,e.max)):i&&l&&(ce.max)&&r.push(P(o.messages[s].range,e.fullField,e.min,e.max))},enum:function(e,t,n,r,o){e.enum=Array.isArray(e.enum)?e.enum:[],-1===e.enum.indexOf(t)&&r.push(P(o.messages.enum,e.fullField,e.enum.join(", ")))},pattern:function(e,t,n,r,o){if(e.pattern)if(e.pattern instanceof RegExp)e.pattern.lastIndex=0,e.pattern.test(t)||r.push(P(o.messages.pattern.mismatch,e.fullField,t,e.pattern));else if("string"===typeof e.pattern){new RegExp(e.pattern).test(t)||r.push(P(o.messages.pattern.mismatch,e.fullField,t,e.pattern))}}},V=function(e,t,n,r,o){var a=e.type,i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t,a)&&!e.required)return n();U.required(e,t,r,i,o,a),Z(t,a)||U.type(e,t,r,i,o)}n(i)},H={string:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t,"string")&&!e.required)return n();U.required(e,t,r,a,o,"string"),Z(t,"string")||(U.type(e,t,r,a,o),U.range(e,t,r,a,o),U.pattern(e,t,r,a,o),!0===e.whitespace&&U.whitespace(e,t,r,a,o))}n(a)},method:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&U.type(e,t,r,a,o)}n(a)},number:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(""===t&&(t=void 0),Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&(U.type(e,t,r,a,o),U.range(e,t,r,a,o))}n(a)},boolean:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&U.type(e,t,r,a,o)}n(a)},regexp:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),Z(t)||U.type(e,t,r,a,o)}n(a)},integer:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&(U.type(e,t,r,a,o),U.range(e,t,r,a,o))}n(a)},float:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&(U.type(e,t,r,a,o),U.range(e,t,r,a,o))}n(a)},array:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if((void 0===t||null===t)&&!e.required)return n();U.required(e,t,r,a,o,"array"),void 0!==t&&null!==t&&(U.type(e,t,r,a,o),U.range(e,t,r,a,o))}n(a)},object:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&U.type(e,t,r,a,o)}n(a)},enum:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o),void 0!==t&&U.enum(e,t,r,a,o)}n(a)},pattern:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t,"string")&&!e.required)return n();U.required(e,t,r,a,o),Z(t,"string")||U.pattern(e,t,r,a,o)}n(a)},date:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t,"date")&&!e.required)return n();var i;if(U.required(e,t,r,a,o),!Z(t,"date"))i=t instanceof Date?t:new Date(t),U.type(e,i,r,a,o),i&&U.range(e,i.getTime(),r,a,o)}n(a)},url:V,hex:V,email:V,required:function(e,t,n,r,o){var a=[],i=Array.isArray(t)?"array":typeof t;U.required(e,t,r,a,o,i),n(a)},any:function(e,t,n,r,o){var a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(Z(t)&&!e.required)return n();U.required(e,t,r,a,o)}n(a)}};function K(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}var W=K(),Y=function(){function e(e){this.rules=null,this._messages=W,this.define(e)}var t=e.prototype;return t.define=function(e){var t=this;if(!e)throw new Error("Cannot configure a schema with no rules");if("object"!==typeof e||Array.isArray(e))throw new Error("Rules must be an object");this.rules={},Object.keys(e).forEach((function(n){var r=e[n];t.rules[n]=Array.isArray(r)?r:[r]}))},t.messages=function(e){return e&&(this._messages=R(K(),e)),this._messages},t.validate=function(t,n,r){var o=this;void 0===n&&(n={}),void 0===r&&(r=function(){});var a=t,i=n,l=r;if("function"===typeof i&&(l=i,i={}),!this.rules||0===Object.keys(this.rules).length)return l&&l(null,a),Promise.resolve(a);if(i.messages){var c=this.messages();c===W&&(c=K()),R(c,i.messages),i.messages=c}else i.messages=this.messages();var s={};(i.keys||Object.keys(this.rules)).forEach((function(e){var n=o.rules[e],r=a[e];n.forEach((function(n){var i=n;"function"===typeof i.transform&&(a===t&&(a=k({},a)),r=a[e]=i.transform(r)),(i="function"===typeof i?{validator:i}:k({},i)).validator=o.getValidationMethod(i),i.validator&&(i.field=e,i.fullField=i.fullField||e,i.type=o.getType(i),s[e]=s[e]||[],s[e].push({rule:i,value:r,source:a,field:e}))}))}));var u={};return I(s,i,(function(t,n){var r,o=t.rule,l=("object"===o.type||"array"===o.type)&&("object"===typeof o.fields||"object"===typeof o.defaultField);function c(e,t){return k({},t,{fullField:o.fullField+"."+e,fullFields:o.fullFields?[].concat(o.fullFields,[e]):[e]})}function s(r){void 0===r&&(r=[]);var s=Array.isArray(r)?r:[r];!i.suppressWarning&&s.length&&e.warning("async-validator:",s),s.length&&void 0!==o.message&&(s=[].concat(o.message));var d=s.map(A(o,a));if(i.first&&d.length)return u[o.field]=1,n(d);if(l){if(o.required&&!t.value)return void 0!==o.message?d=[].concat(o.message).map(A(o,a)):i.error&&(d=[i.error(o,P(i.messages.required,o.field))]),n(d);var f={};o.defaultField&&Object.keys(t.value).map((function(e){f[e]=o.defaultField})),f=k({},f,t.rule.fields);var p={};Object.keys(f).forEach((function(e){var t=f[e],n=Array.isArray(t)?t:[t];p[e]=n.map(c.bind(null,e))}));var h=new e(p);h.messages(i.messages),t.rule.options&&(t.rule.options.messages=i.messages,t.rule.options.error=i.error),h.validate(t.value,t.rule.options||i,(function(e){var t=[];d&&d.length&&t.push.apply(t,d),e&&e.length&&t.push.apply(t,e),n(t.length?t:null)}))}else n(d)}if(l=l&&(o.required||!o.required&&t.value),o.field=t.field,o.asyncValidator)r=o.asyncValidator(o,t.value,s,t.source,i);else if(o.validator){try{r=o.validator(o,t.value,s,t.source,i)}catch(d){null==console.error||console.error(d),i.suppressValidatorError||setTimeout((function(){throw d}),0),s(d.message)}!0===r?s():!1===r?s("function"===typeof o.message?o.message(o.fullField||o.field):o.message||(o.fullField||o.field)+" fails"):r instanceof Array?s(r):r instanceof Error&&s(r.message)}r&&r.then&&r.then((function(){return s()}),(function(e){return s(e)}))}),(function(e){!function(e){var t=[],n={};function r(e){var n;Array.isArray(e)?t=(n=t).concat.apply(n,e):t.push(e)}for(var o=0;o3&&void 0!==arguments[3]&&arguments[3];return t.length&&r&&void 0===n&&!X(e,t.slice(0,-1))?e:J(e,t,n,r)}function te(e){return Array.isArray(e)?function(e){return e.map((function(e){return te(e)}))}(e):"object"===(0,G.Z)(e)&&null!==e?function(e){if(Object.getPrototypeOf(e)===Object.prototype){var t={};for(var n in e)t[n]=te(e[n]);return t}return e}(e):e}const ne=te;function re(e){return b(e)}function oe(e,t){return X(e,t)}function ae(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=ee(e,t,n,r);return o}function ie(e,t){var n={};return t.forEach((function(t){var r=oe(e,t);n=ae(n,t,r)})),n}function le(e,t){return e&&e.some((function(e){return de(e,t)}))}function ce(e){return"object"===(0,G.Z)(e)&&null!==e&&Object.getPrototypeOf(e)===Object.prototype}function se(e,t){var n=Array.isArray(e)?(0,c.Z)(e):(0,l.Z)({},e);return t?(Object.keys(t).forEach((function(e){var r=n[e],o=t[e],a=ce(r)&&ce(o);n[e]=a?se(r,o||{}):ne(o)})),n):n}function ue(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=r||n<0||n>=r)return e;var o=e[t],a=t-n;return a>0?[].concat((0,c.Z)(e.slice(0,n)),[o],(0,c.Z)(e.slice(n,t)),(0,c.Z)(e.slice(t+1,r))):a<0?[].concat((0,c.Z)(e.slice(0,t)),(0,c.Z)(e.slice(t+1,n+1)),[o],(0,c.Z)(e.slice(n+1,r))):e}var he=Y;function ve(e,t){return e.replace(/\$\{\w+\}/g,(function(e){var n=e.slice(2,-1);return t[n]}))}var me="CODE_LOGIC_ERROR";function ge(e,t,n,r,o){return ye.apply(this,arguments)}function ye(){return ye=(0,w.Z)((0,x.Z)().mark((function e(t,n,o,a,s){var u,d,f,p,h,v,m,g,y;return(0,x.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return delete(u=(0,l.Z)({},o)).ruleIndex,u.validator&&(d=u.validator,u.validator=function(){try{return d.apply(void 0,arguments)}catch(e){return console.error(e),Promise.reject(me)}}),f=null,u&&"array"===u.type&&u.defaultField&&(f=u.defaultField,delete u.defaultField),p=new he((0,i.Z)({},t,[u])),h=ue({},$,a.validateMessages),p.messages(h),v=[],e.prev=9,e.next=12,Promise.resolve(p.validate((0,i.Z)({},t,n),(0,l.Z)({},a)));case 12:e.next=17;break;case 14:e.prev=14,e.t0=e.catch(9),e.t0.errors&&(v=e.t0.errors.map((function(e,t){var n=e.message,o=n===me?h.default:n;return r.isValidElement(o)?r.cloneElement(o,{key:"error_".concat(t)}):o})));case 17:if(v.length||!f){e.next=22;break}return e.next=20,Promise.all(n.map((function(e,n){return ge("".concat(t,".").concat(n),e,f,a,s)})));case 20:return m=e.sent,e.abrupt("return",m.reduce((function(e,t){return[].concat((0,c.Z)(e),(0,c.Z)(t))}),[]));case 22:return g=(0,l.Z)((0,l.Z)({},o),{},{name:t,enum:(o.enum||[]).join(", ")},s),y=v.map((function(e){return"string"===typeof e?ve(e,g):e})),e.abrupt("return",y);case 25:case"end":return e.stop()}}),e,null,[[9,14]])}))),ye.apply(this,arguments)}function be(e,t,n,r,o,a){var i,c=e.join("."),s=n.map((function(e,t){var n=e.validator,r=(0,l.Z)((0,l.Z)({},e),{},{ruleIndex:t});return n&&(r.validator=function(e,t,r){var o=!1,a=n(e,t,(function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:Ce;if(o.validatePromise===r){var t;o.validatePromise=null;var n=[],a=[];null===(t=e.forEach)||void 0===t||t.call(e,(function(e){var t=e.rule.warningOnly,r=e.errors,o=void 0===r?Ce:r;t?a.push.apply(a,(0,c.Z)(o)):n.push.apply(n,(0,c.Z)(o))})),o.errors=n,o.warnings=a,o.triggerMetaEvent(),o.reRender()}})),f}));return o.validatePromise=r,o.dirty=!0,o.errors=Ce,o.warnings=Ce,o.triggerMetaEvent(),o.reRender(),r},o.isFieldValidating=function(){return!!o.validatePromise},o.isFieldTouched=function(){return o.touched},o.isFieldDirty=function(){return!(!o.dirty&&void 0===o.props.initialValue)||void 0!==(0,o.props.fieldContext.getInternalHooks(m).getInitialValue)(o.getNamePath())},o.getErrors=function(){return o.errors},o.getWarnings=function(){return o.warnings},o.isListField=function(){return o.props.isListField},o.isList=function(){return o.props.isList},o.isPreserve=function(){return o.props.preserve},o.getMeta=function(){return o.prevValidating=o.isFieldValidating(),{touched:o.isFieldTouched(),validating:o.prevValidating,errors:o.errors,warnings:o.warnings,name:o.getNamePath()}},o.getOnlyChild=function(e){if("function"===typeof e){var t=o.getMeta();return(0,l.Z)((0,l.Z)({},o.getOnlyChild(e(o.getControlled(),t,o.props.fieldContext))),{},{isFunction:!0})}var n=(0,h.Z)(e);return 1===n.length&&r.isValidElement(n[0])?{child:n[0],isFunction:!1}:{child:n,isFunction:!1}},o.getValue=function(e){var t=o.props.fieldContext.getFieldsValue,n=o.getNamePath();return oe(e||t(!0),n)},o.getControlled=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=o.props,n=t.trigger,r=t.validateTrigger,a=t.getValueFromEvent,c=t.normalize,s=t.valuePropName,u=t.getValueProps,d=t.fieldContext,f=void 0!==r?r:d.validateTrigger,p=o.getNamePath(),h=d.getInternalHooks,v=d.getFieldsValue,g=h(m),y=g.dispatch,x=o.getValue(),w=u||function(e){return(0,i.Z)({},s,e)},k=e[n],C=(0,l.Z)((0,l.Z)({},e),w(x));C[n]=function(){var e;o.touched=!0,o.dirty=!0,o.triggerMetaEvent();for(var t=arguments.length,n=new Array(t),r=0;r=0&&t<=n.length?(u.keys=[].concat((0,c.Z)(u.keys.slice(0,t)),[u.id],(0,c.Z)(u.keys.slice(t))),a([].concat((0,c.Z)(n.slice(0,t)),[e],(0,c.Z)(n.slice(t))))):(u.keys=[].concat((0,c.Z)(u.keys),[u.id]),a([].concat((0,c.Z)(n),[e]))),u.id+=1},remove:function(e){var t=l(),n=new Set(Array.isArray(e)?e:[e]);n.size<=0||(u.keys=u.keys.filter((function(e,t){return!n.has(t)})),a(t.filter((function(e,t){return!n.has(t)}))))},move:function(e,t){if(e!==t){var n=l();e<0||e>=n.length||t<0||t>=n.length||(u.keys=pe(u.keys,e,t),a(pe(n,e,t)))}}},p=r||[];return Array.isArray(p)||(p=[]),o(p.map((function(e,t){var n=u.keys[t];return void 0===n&&(u.keys[t]=u.id,n=u.keys[t],u.id+=1),{name:t,key:n,isListField:!0}})),f,t)}))))};var Ne=n(6234);var Pe="__@field_split__";function Ze(e){return e.map((function(e){return"".concat((0,G.Z)(e),":").concat(e)})).join(Pe)}var Me=function(){function e(){(0,s.Z)(this,e),this.kvs=new Map}return(0,u.Z)(e,[{key:"set",value:function(e,t){this.kvs.set(Ze(e),t)}},{key:"get",value:function(e){return this.kvs.get(Ze(e))}},{key:"update",value:function(e,t){var n=t(this.get(e));n?this.set(e,n):this.delete(e)}},{key:"delete",value:function(e){this.kvs.delete(Ze(e))}},{key:"map",value:function(e){return(0,c.Z)(this.kvs.entries()).map((function(t){var n=(0,Ne.Z)(t,2),r=n[0],o=n[1],a=r.split(Pe);return e({key:a.map((function(e){var t=e.match(/^([^:]*):(.*)$/),n=(0,Ne.Z)(t,3),r=n[1],o=n[2];return"number"===r?Number(o):o})),value:o})}))}},{key:"toJSON",value:function(){var e={};return this.map((function(t){var n=t.key,r=t.value;return e[n.join(".")]=r,null})),e}}]),e}();const Te=Me;var Ie=["name","errors"],Ae=(0,u.Z)((function e(t){var n=this;(0,s.Z)(this,e),this.formHooked=!1,this.forceRootUpdate=void 0,this.subscribable=!0,this.store={},this.fieldEntities=[],this.initialValues={},this.callbacks={},this.validateMessages=null,this.preserve=null,this.lastValidatePromise=null,this.getForm=function(){return{getFieldValue:n.getFieldValue,getFieldsValue:n.getFieldsValue,getFieldError:n.getFieldError,getFieldWarning:n.getFieldWarning,getFieldsError:n.getFieldsError,isFieldsTouched:n.isFieldsTouched,isFieldTouched:n.isFieldTouched,isFieldValidating:n.isFieldValidating,isFieldsValidating:n.isFieldsValidating,resetFields:n.resetFields,setFields:n.setFields,setFieldValue:n.setFieldValue,setFieldsValue:n.setFieldsValue,validateFields:n.validateFields,submit:n.submit,_init:!0,getInternalHooks:n.getInternalHooks}},this.getInternalHooks=function(e){return e===m?(n.formHooked=!0,{dispatch:n.dispatch,initEntityValue:n.initEntityValue,registerField:n.registerField,useSubscribe:n.useSubscribe,setInitialValues:n.setInitialValues,destroyForm:n.destroyForm,setCallbacks:n.setCallbacks,setValidateMessages:n.setValidateMessages,getFields:n.getFields,setPreserve:n.setPreserve,getInitialValue:n.getInitialValue,registerWatch:n.registerWatch}):((0,v.ZP)(!1,"`getInternalHooks` is internal usage. Should not call directly."),null)},this.useSubscribe=function(e){n.subscribable=e},this.prevWithoutPreserves=null,this.setInitialValues=function(e,t){if(n.initialValues=e||{},t){var r,o=ue({},e,n.store);null===(r=n.prevWithoutPreserves)||void 0===r||r.map((function(t){var n=t.key;o=ae(o,n,oe(e,n))})),n.prevWithoutPreserves=null,n.updateStore(o)}},this.destroyForm=function(){var e=new Te;n.getFieldEntities(!0).forEach((function(t){n.isMergedPreserve(t.isPreserve())||e.set(t.getNamePath(),!0)})),n.prevWithoutPreserves=e},this.getInitialValue=function(e){var t=oe(n.initialValues,e);return e.length?ne(t):t},this.setCallbacks=function(e){n.callbacks=e},this.setValidateMessages=function(e){n.validateMessages=e},this.setPreserve=function(e){n.preserve=e},this.watchList=[],this.registerWatch=function(e){return n.watchList.push(e),function(){n.watchList=n.watchList.filter((function(t){return t!==e}))}},this.notifyWatch=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(n.watchList.length){var t=n.getFieldsValue();n.watchList.forEach((function(n){n(t,e)}))}},this.timeoutId=null,this.warningUnhooked=function(){0},this.updateStore=function(e){n.store=e},this.getFieldEntities=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return e?n.fieldEntities.filter((function(e){return e.getNamePath().length})):n.fieldEntities},this.getFieldsMap=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=new Te;return n.getFieldEntities(e).forEach((function(e){var n=e.getNamePath();t.set(n,e)})),t},this.getFieldEntitiesForNamePathList=function(e){if(!e)return n.getFieldEntities(!0);var t=n.getFieldsMap(!0);return e.map((function(e){var n=re(e);return t.get(n)||{INVALIDATE_NAME_PATH:re(e)}}))},this.getFieldsValue=function(e,t){if(n.warningUnhooked(),!0===e&&!t)return n.store;var r=n.getFieldEntitiesForNamePathList(Array.isArray(e)?e:null),o=[];return r.forEach((function(n){var r,a="INVALIDATE_NAME_PATH"in n?n.INVALIDATE_NAME_PATH:n.getNamePath();if(e||!(null===(r=n.isListField)||void 0===r?void 0:r.call(n)))if(t){var i="getMeta"in n?n.getMeta():null;t(i)&&o.push(a)}else o.push(a)})),ie(n.store,o.map(re))},this.getFieldValue=function(e){n.warningUnhooked();var t=re(e);return oe(n.store,t)},this.getFieldsError=function(e){return n.warningUnhooked(),n.getFieldEntitiesForNamePathList(e).map((function(t,n){return t&&!("INVALIDATE_NAME_PATH"in t)?{name:t.getNamePath(),errors:t.getErrors(),warnings:t.getWarnings()}:{name:re(e[n]),errors:[],warnings:[]}}))},this.getFieldError=function(e){n.warningUnhooked();var t=re(e);return n.getFieldsError([t])[0].errors},this.getFieldWarning=function(e){n.warningUnhooked();var t=re(e);return n.getFieldsError([t])[0].warnings},this.isFieldsTouched=function(){n.warningUnhooked();for(var e=arguments.length,t=new Array(e),r=0;r0&&void 0!==arguments[0]?arguments[0]:{},t=new Te,r=n.getFieldEntities(!0);r.forEach((function(e){var n=e.props.initialValue,r=e.getNamePath();if(void 0!==n){var o=t.get(r)||new Set;o.add({entity:e,value:n}),t.set(r,o)}}));var o,a=function(r){r.forEach((function(r){if(void 0!==r.props.initialValue){var o=r.getNamePath();if(void 0!==n.getInitialValue(o))(0,v.ZP)(!1,"Form already set 'initialValues' with path '".concat(o.join("."),"'. Field can not overwrite it."));else{var a=t.get(o);if(a&&a.size>1)(0,v.ZP)(!1,"Multiple Field with path '".concat(o.join("."),"' set 'initialValue'. Can not decide which one to pick."));else if(a){var i=n.getFieldValue(o);e.skipExist&&void 0!==i||n.updateStore(ae(n.store,o,(0,c.Z)(a)[0].value))}}}}))};e.entities?o=e.entities:e.namePathList?(o=[],e.namePathList.forEach((function(e){var n,r=t.get(e);r&&(n=o).push.apply(n,(0,c.Z)((0,c.Z)(r).map((function(e){return e.entity}))))}))):o=r,a(o)},this.resetFields=function(e){n.warningUnhooked();var t=n.store;if(!e)return n.updateStore(ue({},n.initialValues)),n.resetWithFieldInitialValue(),n.notifyObservers(t,null,{type:"reset"}),void n.notifyWatch();var r=e.map(re);r.forEach((function(e){var t=n.getInitialValue(e);n.updateStore(ae(n.store,e,t))})),n.resetWithFieldInitialValue({namePathList:r}),n.notifyObservers(t,r,{type:"reset"}),n.notifyWatch(r)},this.setFields=function(e){n.warningUnhooked();var t=n.store,r=[];e.forEach((function(e){var o=e.name,i=(e.errors,(0,a.Z)(e,Ie)),l=re(o);r.push(l),"value"in i&&n.updateStore(ae(n.store,l,i.value)),n.notifyObservers(t,[l],{type:"setField",data:e})})),n.notifyWatch(r)},this.getFields=function(){return n.getFieldEntities(!0).map((function(e){var t=e.getNamePath(),r=e.getMeta(),o=(0,l.Z)((0,l.Z)({},r),{},{name:t,value:n.getFieldValue(t)});return Object.defineProperty(o,"originRCField",{value:!0}),o}))},this.initEntityValue=function(e){var t=e.props.initialValue;if(void 0!==t){var r=e.getNamePath();void 0===oe(n.store,r)&&n.updateStore(ae(n.store,r,t))}},this.isMergedPreserve=function(e){var t=void 0!==e?e:n.preserve;return null===t||void 0===t||t},this.registerField=function(e){n.fieldEntities.push(e);var t=e.getNamePath();if(n.notifyWatch([t]),void 0!==e.props.initialValue){var r=n.store;n.resetWithFieldInitialValue({entities:[e],skipExist:!0}),n.notifyObservers(r,[e.getNamePath()],{type:"valueUpdate",source:"internal"})}return function(r,o){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];if(n.fieldEntities=n.fieldEntities.filter((function(t){return t!==e})),!n.isMergedPreserve(o)&&(!r||a.length>1)){var i=r?void 0:n.getInitialValue(t);if(t.length&&n.getFieldValue(t)!==i&&n.fieldEntities.every((function(e){return!de(e.getNamePath(),t)}))){var l=n.store;n.updateStore(ae(l,t,i,!0)),n.notifyObservers(l,[t],{type:"remove"}),n.triggerDependenciesUpdate(l,t)}}n.notifyWatch([t])}},this.dispatch=function(e){switch(e.type){case"updateValue":var t=e.namePath,r=e.value;n.updateValue(t,r);break;case"validateField":var o=e.namePath,a=e.triggerName;n.validateFields([o],{triggerName:a})}},this.notifyObservers=function(e,t,r){if(n.subscribable){var o=(0,l.Z)((0,l.Z)({},r),{},{store:n.getFieldsValue(!0)});n.getFieldEntities().forEach((function(n){(0,n.onStoreChange)(e,t,o)}))}else n.forceRootUpdate()},this.triggerDependenciesUpdate=function(e,t){var r=n.getDependencyChildrenFields(t);return r.length&&n.validateFields(r),n.notifyObservers(e,r,{type:"dependenciesUpdate",relatedFields:[t].concat((0,c.Z)(r))}),r},this.updateValue=function(e,t){var r=re(e),o=n.store;n.updateStore(ae(n.store,r,t)),n.notifyObservers(o,[r],{type:"valueUpdate",source:"internal"}),n.notifyWatch([r]);var a=n.triggerDependenciesUpdate(o,r),i=n.callbacks.onValuesChange;i&&i(ie(n.store,[r]),n.getFieldsValue());n.triggerOnFieldsChange([r].concat((0,c.Z)(a)))},this.setFieldsValue=function(e){n.warningUnhooked();var t=n.store;if(e){var r=ue(n.store,e);n.updateStore(r)}n.notifyObservers(t,null,{type:"valueUpdate",source:"external"}),n.notifyWatch()},this.setFieldValue=function(e,t){n.setFields([{name:e,value:t}])},this.getDependencyChildrenFields=function(e){var t=new Set,r=[],o=new Te;n.getFieldEntities().forEach((function(e){(e.props.dependencies||[]).forEach((function(t){var n=re(t);o.update(n,(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new Set;return t.add(e),t}))}))}));return function e(n){(o.get(n)||new Set).forEach((function(n){if(!t.has(n)){t.add(n);var o=n.getNamePath();n.isFieldDirty()&&o.length&&(r.push(o),e(o))}}))}(e),r},this.triggerOnFieldsChange=function(e,t){var r=n.callbacks.onFieldsChange;if(r){var o=n.getFields();if(t){var a=new Te;t.forEach((function(e){var t=e.name,n=e.errors;a.set(t,n)})),o.forEach((function(e){e.errors=a.get(e.name)||e.errors}))}r(o.filter((function(t){var n=t.name;return le(e,n)})),o)}},this.validateFields=function(e,t){n.warningUnhooked();var r=!!e,o=r?e.map(re):[],a=[];n.getFieldEntities(!0).forEach((function(i){if(r||o.push(i.getNamePath()),(null===t||void 0===t?void 0:t.recursive)&&r){var s=i.getNamePath();s.every((function(t,n){return e[n]===t||void 0===e[n]}))&&o.push(s)}if(i.props.rules&&i.props.rules.length){var u=i.getNamePath();if(!r||le(o,u)){var d=i.validateRules((0,l.Z)({validateMessages:(0,l.Z)((0,l.Z)({},$),n.validateMessages)},t));a.push(d.then((function(){return{name:u,errors:[],warnings:[]}})).catch((function(e){var t,n=[],r=[];return null===(t=e.forEach)||void 0===t||t.call(e,(function(e){var t=e.rule.warningOnly,o=e.errors;t?r.push.apply(r,(0,c.Z)(o)):n.push.apply(n,(0,c.Z)(o))})),n.length?Promise.reject({name:u,errors:n,warnings:r}):{name:u,errors:n,warnings:r}})))}}}));var i=function(e){var t=!1,n=e.length,r=[];return e.length?new Promise((function(o,a){e.forEach((function(e,i){e.catch((function(e){return t=!0,e})).then((function(e){n-=1,r[i]=e,n>0||(t&&a(r),o(r))}))}))})):Promise.resolve([])}(a);n.lastValidatePromise=i,i.catch((function(e){return e})).then((function(e){var t=e.map((function(e){return e.name}));n.notifyObservers(n.store,t,{type:"validateFinish"}),n.triggerOnFieldsChange(t,e)}));var s=i.then((function(){return n.lastValidatePromise===i?Promise.resolve(n.getFieldsValue(o)):Promise.reject([])})).catch((function(e){var t=e.filter((function(e){return e&&e.errors.length}));return Promise.reject({values:n.getFieldsValue(o),errorFields:t,outOfDate:n.lastValidatePromise!==i})}));return s.catch((function(e){return e})),s},this.submit=function(){n.warningUnhooked(),n.validateFields().then((function(e){var t=n.callbacks.onFinish;if(t)try{t(e)}catch(r){console.error(r)}})).catch((function(e){var t=n.callbacks.onFinishFailed;t&&t(e)}))},this.forceRootUpdate=t}));const Re=function(e){var t=r.useRef(),n=r.useState({}),o=(0,Ne.Z)(n,2)[1];if(!t.current)if(e)t.current=e;else{var a=new Ae((function(){o({})}));t.current=a.getForm()}return[t.current]};var De=r.createContext({triggerFormChange:function(){},triggerFormFinish:function(){},registerForm:function(){},unregisterForm:function(){}}),Le=function(e){var t=e.validateMessages,n=e.onFormChange,o=e.onFormFinish,a=e.children,c=r.useContext(De),s=r.useRef({});return r.createElement(De.Provider,{value:(0,l.Z)((0,l.Z)({},c),{},{validateMessages:(0,l.Z)((0,l.Z)({},c.validateMessages),t),triggerFormChange:function(e,t){n&&n(e,{changedFields:t,forms:s.current}),c.triggerFormChange(e,t)},triggerFormFinish:function(e,t){o&&o(e,{values:t,forms:s.current}),c.triggerFormFinish(e,t)},registerForm:function(e,t){e&&(s.current=(0,l.Z)((0,l.Z)({},s.current),{},(0,i.Z)({},e,t))),c.registerForm(e,t)},unregisterForm:function(e){var t=(0,l.Z)({},s.current);delete t[e],s.current=t,c.unregisterForm(e)}})},a)};const Fe=De;var ze=["name","initialValues","fields","form","preserve","children","component","validateMessages","validateTrigger","onValuesChange","onFieldsChange","onFinish","onFinishFailed"];const Be=function(e,t){var n=e.name,i=e.initialValues,s=e.fields,u=e.form,d=e.preserve,f=e.children,p=e.component,h=void 0===p?"form":p,v=e.validateMessages,g=e.validateTrigger,b=void 0===g?"onChange":g,x=e.onValuesChange,w=e.onFieldsChange,k=e.onFinish,C=e.onFinishFailed,S=(0,a.Z)(e,ze),E=r.useContext(Fe),j=Re(u),O=(0,Ne.Z)(j,1)[0],_=O.getInternalHooks(m),N=_.useSubscribe,P=_.setInitialValues,Z=_.setCallbacks,M=_.setValidateMessages,T=_.setPreserve,I=_.destroyForm;r.useImperativeHandle(t,(function(){return O})),r.useEffect((function(){return E.registerForm(n,O),function(){E.unregisterForm(n)}}),[E,O,n]),M((0,l.Z)((0,l.Z)({},E.validateMessages),v)),Z({onValuesChange:x,onFieldsChange:function(e){if(E.triggerFormChange(n,e),w){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0,n=(0,r.useState)(),o=(0,Ne.Z)(n,2),a=o[0],i=o[1],l=(0,r.useMemo)((function(){return Ue(a)}),[a]),c=(0,r.useRef)(l);c.current=l;var s=(0,r.useContext)(y),u=t||s,d=u&&u._init,f=re(e),p=(0,r.useRef)(f);return p.current=f,(0,r.useEffect)((function(){if(d){var e=u.getFieldsValue,t=(0,(0,u.getInternalHooks)(m).registerWatch)((function(e){var t=oe(e,p.current),n=Ue(t);c.current!==n&&(c.current=n,i(t))})),n=oe(e(),p.current);return i(n),t}}),[]),a};var He=r.forwardRef(Be);He.FormProvider=Le,He.Field=je,He.List=_e,He.useForm=Re,He.useWatch=Ve;const Ke=He},8613:(e,t,n)=>{"use strict";n.d(t,{iz:()=>He,ck:()=>Y,BW:()=>Ve,sN:()=>Y,GP:()=>Ve,Wd:()=>ye,ZP:()=>Ye,Xl:()=>Ke});var r=n(7896),o=n(6666),a=n(3028),i=n(8079),l=n(6234),c=n(2159),s=n(969),u=n(5667),d=n.n(u),f=n(1806),p=n.n(f),h=n(1978),v=n(5277),m=n(1594),g=n(9249),y=n(7371),b=n(8106),x=n(551),w=n(4184),k=n(8870),C=n(4862),S=["children","locked"],E=s.createContext(null);function j(e){var t=e.children,n=e.locked,r=(0,c.Z)(e,S),o=s.useContext(E),i=(0,C.Z)((function(){return function(e,t){var n=(0,a.Z)({},e);return Object.keys(t).forEach((function(e){var r=t[e];void 0!==r&&(n[e]=r)})),n}(o,r)}),[o,r],(function(e,t){return!n&&(e[0]!==t[0]||!p()(e[1],t[1]))}));return s.createElement(E.Provider,{value:i},t)}function O(e,t,n,r){var o=s.useContext(E),a=o.activeKey,i=o.onActive,l=o.onInactive,c={active:a===e};return t||(c.onMouseEnter=function(t){null===n||void 0===n||n({key:e,domEvent:t}),i(e)},c.onMouseLeave=function(t){null===r||void 0===r||r({key:e,domEvent:t}),l(e)}),c}var _=["item"];function N(e){var t=e.item,n=(0,c.Z)(e,_);return Object.defineProperty(n,"item",{get:function(){return(0,v.ZP)(!1,"`info.item` is deprecated since we will move to function component that not provides React Node instance in future."),t}}),n}function P(e){var t=e.icon,n=e.props,r=e.children;return("function"===typeof t?s.createElement(t,(0,a.Z)({},n)):t)||r||null}function Z(e){var t=s.useContext(E),n=t.mode,r=t.rtl,o=t.inlineIndent;if("inline"!==n)return null;return r?{paddingRight:e*o}:{paddingLeft:e*o}}var M=[],T=s.createContext(null);function I(){return s.useContext(T)}var A=s.createContext(M);function R(e){var t=s.useContext(A);return s.useMemo((function(){return void 0!==e?[].concat((0,i.Z)(t),[e]):t}),[t,e])}var D=s.createContext(null),L=s.createContext(null);function F(e,t){return void 0===e?null:"".concat(e,"-").concat(t)}function z(e){return F(s.useContext(L),e)}const B=s.createContext({});var U=["title","attribute","elementRef"],V=["style","className","eventKey","warnKey","disabled","itemIcon","children","role","onMouseEnter","onMouseLeave","onClick","onKeyDown","onFocus"],H=["active"],K=function(e){(0,b.Z)(n,e);var t=(0,x.Z)(n);function n(){return(0,g.Z)(this,n),t.apply(this,arguments)}return(0,y.Z)(n,[{key:"render",value:function(){var e=this.props,t=e.title,n=e.attribute,o=e.elementRef,a=(0,c.Z)(e,U),i=(0,k.Z)(a,["eventKey"]);return(0,v.ZP)(!n,"`attribute` of Menu.Item is deprecated. Please pass attribute directly."),s.createElement(m.Z.Item,(0,r.Z)({},n,{title:"string"===typeof t?t:void 0},i,{ref:o}))}}]),n}(s.Component),W=function(e){var t,n=e.style,l=e.className,u=e.eventKey,f=(e.warnKey,e.disabled),p=e.itemIcon,h=e.children,v=e.role,m=e.onMouseEnter,g=e.onMouseLeave,y=e.onClick,b=e.onKeyDown,x=e.onFocus,k=(0,c.Z)(e,V),C=z(u),S=s.useContext(E),j=S.prefixCls,_=S.onItemClick,M=S.disabled,T=S.overflowDisabled,I=S.itemIcon,A=S.selectedKeys,D=S.onActive,L=s.useContext(B)._internalRenderMenuItem,F="".concat(j,"-item"),U=s.useRef(),W=s.useRef(),Y=M||f,q=R(u);var $=function(e){return{key:u,keyPath:(0,i.Z)(q).reverse(),item:U.current,domEvent:e}},G=p||I,X=O(u,Y,m,g),Q=X.active,J=(0,c.Z)(X,H),ee=A.includes(u),te=Z(q.length),ne={};"option"===e.role&&(ne["aria-selected"]=ee);var re=s.createElement(K,(0,r.Z)({ref:U,elementRef:W,role:null===v?"none":v||"menuitem",tabIndex:f?null:-1,"data-menu-id":T&&C?null:C},k,J,ne,{component:"li","aria-disabled":f,style:(0,a.Z)((0,a.Z)({},te),n),className:d()(F,(t={},(0,o.Z)(t,"".concat(F,"-active"),Q),(0,o.Z)(t,"".concat(F,"-selected"),ee),(0,o.Z)(t,"".concat(F,"-disabled"),Y),t),l),onClick:function(e){if(!Y){var t=$(e);null===y||void 0===y||y(N(t)),_(t)}},onKeyDown:function(e){if(null===b||void 0===b||b(e),e.which===w.Z.ENTER){var t=$(e);null===y||void 0===y||y(N(t)),_(t)}},onFocus:function(e){D(u),null===x||void 0===x||x(e)}}),h,s.createElement(P,{props:(0,a.Z)((0,a.Z)({},e),{},{isSelected:ee}),icon:G}));return L&&(re=L(re,e,{selected:ee})),re};const Y=function(e){var t=e.eventKey,n=I(),r=R(t);return s.useEffect((function(){if(n)return n.registerPath(t,r),function(){n.unregisterPath(t,r)}}),[r]),n?null:s.createElement(W,e)};var q=n(6522),$=n(2148),G=["label","children","key","type"];function X(e,t){return(0,$.Z)(e).map((function(e,n){if(s.isValidElement(e)){var r,o,a=e.key,l=null!==(r=null===(o=e.props)||void 0===o?void 0:o.eventKey)&&void 0!==r?r:a;(null===l||void 0===l)&&(l="tmp_key-".concat([].concat((0,i.Z)(t),[n]).join("-")));var c={key:l,eventKey:l};return s.cloneElement(e,c)}return e}))}function Q(e){return(e||[]).map((function(e,t){if(e&&"object"===(0,q.Z)(e)){var n=e.label,o=e.children,a=e.key,i=e.type,l=(0,c.Z)(e,G),u=null!==a&&void 0!==a?a:"tmp-".concat(t);return o||"group"===i?"group"===i?s.createElement(Ve,(0,r.Z)({key:u},l,{title:n}),Q(o)):s.createElement(ye,(0,r.Z)({key:u},l,{title:n}),Q(o)):"divider"===i?s.createElement(He,(0,r.Z)({key:u},l)):s.createElement(Y,(0,r.Z)({key:u},l),n)}return null})).filter((function(e){return e}))}function J(e,t,n){var r=e;return t&&(r=Q(t)),X(r,n)}function ee(e){var t=s.useRef(e);t.current=e;var n=s.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o1&&(k.motionAppear=!1);var C=k.onVisibleChanged;return k.onVisibleChanged=function(e){return m.current||e||x(!0),null===C||void 0===C?void 0:C(e)},b?null:s.createElement(j,{mode:c,locked:!m.current},s.createElement(pe.Z,(0,r.Z)({visible:w},k,{forceRender:f,removeOnLeave:!1,leavedClassName:"".concat(d,"-hidden")}),(function(e){var n=e.className,r=e.style;return s.createElement(oe,{id:t,className:n,style:r},i)})))}var ve=["style","className","title","eventKey","warnKey","disabled","internalPopupClose","children","itemIcon","expandIcon","popupClassName","popupOffset","onClick","onMouseEnter","onMouseLeave","onTitleClick","onTitleMouseEnter","onTitleMouseLeave"],me=["active"],ge=function(e){var t,n=e.style,i=e.className,u=e.title,f=e.eventKey,p=(e.warnKey,e.disabled),h=e.internalPopupClose,v=e.children,g=e.itemIcon,y=e.expandIcon,b=e.popupClassName,x=e.popupOffset,w=e.onClick,k=e.onMouseEnter,C=e.onMouseLeave,S=e.onTitleClick,_=e.onTitleMouseEnter,M=e.onTitleMouseLeave,T=(0,c.Z)(e,ve),I=z(f),A=s.useContext(E),L=A.prefixCls,F=A.mode,U=A.openKeys,V=A.disabled,H=A.overflowDisabled,K=A.activeKey,W=A.selectedKeys,Y=A.itemIcon,q=A.expandIcon,$=A.onItemClick,G=A.onOpenChange,X=A.onActive,Q=s.useContext(B)._internalRenderSubMenuItem,J=s.useContext(D).isSubPathKey,te=R(),ne="".concat(L,"-submenu"),re=V||p,ae=s.useRef(),ie=s.useRef();var le=g||Y,ce=y||q,se=U.includes(f),ue=!H&&se,de=J(W,f),pe=O(f,re,_,M),ge=pe.active,ye=(0,c.Z)(pe,me),be=s.useState(!1),xe=(0,l.Z)(be,2),we=xe[0],ke=xe[1],Ce=function(e){re||ke(e)},Se=s.useMemo((function(){return ge||"inline"!==F&&(we||J([K],f))}),[F,ge,K,we,f,J]),Ee=Z(te.length),je=ee((function(e){null===w||void 0===w||w(N(e)),$(e)})),Oe=I&&"".concat(I,"-popup"),_e=s.createElement("div",(0,r.Z)({role:"menuitem",style:Ee,className:"".concat(ne,"-title"),tabIndex:re?null:-1,ref:ae,title:"string"===typeof u?u:null,"data-menu-id":H&&I?null:I,"aria-expanded":ue,"aria-haspopup":!0,"aria-controls":Oe,"aria-disabled":re,onClick:function(e){re||(null===S||void 0===S||S({key:f,domEvent:e}),"inline"===F&&G(f,!se))},onFocus:function(){X(f)}},ye),u,s.createElement(P,{icon:"horizontal"!==F?ce:null,props:(0,a.Z)((0,a.Z)({},e),{},{isOpen:ue,isSubMenu:!0})},s.createElement("i",{className:"".concat(ne,"-arrow")}))),Ne=s.useRef(F);if("inline"!==F&&(Ne.current=te.length>1?"vertical":F),!H){var Pe=Ne.current;_e=s.createElement(fe,{mode:Pe,prefixCls:ne,visible:!h&&ue&&"inline"!==F,popupClassName:b,popupOffset:x,popup:s.createElement(j,{mode:"horizontal"===Pe?"vertical":Pe},s.createElement(oe,{id:Oe,ref:ie},v)),disabled:re,onVisibleChange:function(e){"inline"!==F&&G(f,e)}},_e)}var Ze=s.createElement(m.Z.Item,(0,r.Z)({role:"none"},T,{component:"li",style:n,className:d()(ne,"".concat(ne,"-").concat(F),i,(t={},(0,o.Z)(t,"".concat(ne,"-open"),ue),(0,o.Z)(t,"".concat(ne,"-active"),Se),(0,o.Z)(t,"".concat(ne,"-selected"),de),(0,o.Z)(t,"".concat(ne,"-disabled"),re),t)),onMouseEnter:function(e){Ce(!0),null===k||void 0===k||k({key:f,domEvent:e})},onMouseLeave:function(e){Ce(!1),null===C||void 0===C||C({key:f,domEvent:e})}}),_e,!H&&s.createElement(he,{id:Oe,open:ue,keyPath:te},v));return Q&&(Ze=Q(Ze,e,{selected:de,active:Se,open:ue,disabled:re})),s.createElement(j,{onItemClick:je,mode:"horizontal"===F?"vertical":F,itemIcon:le,expandIcon:ce},Ze)};function ye(e){var t,n=e.eventKey,r=e.children,o=R(n),a=X(r,o),i=I();return s.useEffect((function(){if(i)return i.registerPath(n,o),function(){i.unregisterPath(n,o)}}),[o]),t=i?a:s.createElement(ge,e,a),s.createElement(A.Provider,{value:o},t)}var be=n(4500),xe=w.Z.LEFT,we=w.Z.RIGHT,ke=w.Z.UP,Ce=w.Z.DOWN,Se=w.Z.ENTER,Ee=w.Z.ESC,je=w.Z.HOME,Oe=w.Z.END,_e=[ke,Ce,xe,we];function Ne(e,t){return(0,be.tS)(e,!0).filter((function(e){return t.has(e)}))}function Pe(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(!e)return null;var o=Ne(e,t),a=o.length,i=o.findIndex((function(e){return n===e}));return r<0?-1===i?i=a-1:i-=1:r>0&&(i+=1),o[i=(i+a)%a]}function Ze(e,t,n,r,a,i,l,c,u,d){var f=s.useRef(),p=s.useRef();p.current=t;var h=function(){ie.Z.cancel(f.current)};return s.useEffect((function(){return function(){h()}}),[]),function(s){var v=s.which;if([].concat(_e,[Se,Ee,je,Oe]).includes(v)){var m,g,y,b=function(){return m=new Set,g=new Map,y=new Map,i().forEach((function(e){var t=document.querySelector("[data-menu-id='".concat(F(r,e),"']"));t&&(m.add(t),y.set(t,e),g.set(e,t))})),m};b();var x=function(e,t){for(var n=e||document.activeElement;n;){if(t.has(n))return n;n=n.parentElement}return null}(g.get(t),m),w=y.get(x),k=function(e,t,n,r){var a,i,l,c,s="prev",u="next",d="children",f="parent";if("inline"===e&&r===Se)return{inlineTrigger:!0};var p=(a={},(0,o.Z)(a,ke,s),(0,o.Z)(a,Ce,u),a),h=(i={},(0,o.Z)(i,xe,n?u:s),(0,o.Z)(i,we,n?s:u),(0,o.Z)(i,Ce,d),(0,o.Z)(i,Se,d),i),v=(l={},(0,o.Z)(l,ke,s),(0,o.Z)(l,Ce,u),(0,o.Z)(l,Se,d),(0,o.Z)(l,Ee,f),(0,o.Z)(l,xe,n?d:f),(0,o.Z)(l,we,n?f:d),l);switch(null===(c={inline:p,horizontal:h,vertical:v,inlineSub:p,horizontalSub:v,verticalSub:v}["".concat(e).concat(t?"":"Sub")])||void 0===c?void 0:c[r]){case s:return{offset:-1,sibling:!0};case u:return{offset:1,sibling:!0};case f:return{offset:-1,sibling:!1};case d:return{offset:1,sibling:!1};default:return null}}(e,1===l(w,!0).length,n,v);if(!k&&v!==je&&v!==Oe)return;(_e.includes(v)||[je,Oe].includes(v))&&s.preventDefault();var C=function(e){if(e){var t=e,n=e.querySelector("a");(null===n||void 0===n?void 0:n.getAttribute("href"))&&(t=n);var r=y.get(e);c(r),h(),f.current=(0,ie.Z)((function(){p.current===r&&t.focus()}))}};if([je,Oe].includes(v)||k.sibling||!x){var S,E,j=Ne(S=x&&"inline"!==e?function(e){for(var t=e;t;){if(t.getAttribute("data-menu-list"))return t;t=t.parentElement}return null}(x):a.current,m);E=v===je?j[0]:v===Oe?j[j.length-1]:Pe(S,m,x,k.offset),C(E)}else if(k.inlineTrigger)u(w);else if(k.offset>0)u(w,!0),h(),f.current=(0,ie.Z)((function(){b();var e=x.getAttribute("aria-controls"),t=Pe(document.getElementById(e),m);C(t)}),5);else if(k.offset<0){var O=l(w,!0),_=O[O.length-2],N=g.get(_);u(_,!1),C(N)}}null===d||void 0===d||d(s)}}var Me=Math.random().toFixed(5).toString().slice(2),Te=0;var Ie="__RC_UTIL_PATH_SPLIT__",Ae=function(e){return e.join(Ie)},Re="rc-menu-more";function De(){var e=s.useState({}),t=(0,l.Z)(e,2)[1],n=(0,s.useRef)(new Map),r=(0,s.useRef)(new Map),o=s.useState([]),a=(0,l.Z)(o,2),c=a[0],u=a[1],d=(0,s.useRef)(0),f=(0,s.useRef)(!1),p=(0,s.useCallback)((function(e,o){var a=Ae(o);r.current.set(a,e),n.current.set(e,a),d.current+=1;var i,l=d.current;i=function(){l===d.current&&(f.current||t({}))},Promise.resolve().then(i)}),[]),h=(0,s.useCallback)((function(e,t){var o=Ae(t);r.current.delete(o),n.current.delete(e)}),[]),v=(0,s.useCallback)((function(e){u(e)}),[]),m=(0,s.useCallback)((function(e,t){var r=n.current.get(e)||"",o=r.split(Ie);return t&&c.includes(o[0])&&o.unshift(Re),o}),[c]),g=(0,s.useCallback)((function(e,t){return e.some((function(e){return m(e,!0).includes(t)}))}),[m]),y=(0,s.useCallback)((function(e){var t="".concat(n.current.get(e)).concat(Ie),o=new Set;return(0,i.Z)(r.current.keys()).forEach((function(e){e.startsWith(t)&&o.add(r.current.get(e))})),o}),[]);return s.useEffect((function(){return function(){f.current=!0}}),[]),{registerPath:p,unregisterPath:h,refreshOverflowKeys:v,isSubPathKey:g,getKeyPath:m,getKeys:function(){var e=(0,i.Z)(n.current.keys());return c.length&&e.push(Re),e},getSubPathKeys:y}}var Le=["prefixCls","rootClassName","style","className","tabIndex","items","children","direction","id","mode","inlineCollapsed","disabled","disabledOverflow","subMenuOpenDelay","subMenuCloseDelay","forceSubMenuRender","defaultOpenKeys","openKeys","activeKey","defaultActiveFirst","selectable","multiple","defaultSelectedKeys","selectedKeys","onSelect","onDeselect","inlineIndent","motion","defaultMotions","triggerSubMenuAction","builtinPlacements","itemIcon","expandIcon","overflowedIndicator","overflowedIndicatorPopupClassName","getPopupContainer","onClick","onOpenChange","onKeyDown","openAnimation","openTransitionName","_internalRenderMenuItem","_internalRenderSubMenuItem"],Fe=[];var ze=["className","title","eventKey","children"],Be=["children"],Ue=function(e){var t=e.className,n=e.title,o=(e.eventKey,e.children),a=(0,c.Z)(e,ze),i=s.useContext(E).prefixCls,l="".concat(i,"-item-group");return s.createElement("li",(0,r.Z)({},a,{onClick:function(e){return e.stopPropagation()},className:d()(l,t)}),s.createElement("div",{className:"".concat(l,"-title"),title:"string"===typeof n?n:void 0},n),s.createElement("ul",{className:"".concat(l,"-list")},o))};function Ve(e){var t=e.children,n=(0,c.Z)(e,Be),r=X(t,R(n.eventKey));return I()?r:s.createElement(Ue,(0,k.Z)(n,["warnKey"]),r)}function He(e){var t=e.className,n=e.style,r=s.useContext(E).prefixCls;return I()?null:s.createElement("li",{className:d()("".concat(r,"-item-divider"),t),style:n})}var Ke=R,We=s.forwardRef((function(e,t){var n,u,f=e.prefixCls,v=void 0===f?"rc-menu":f,g=e.rootClassName,y=e.style,b=e.className,x=e.tabIndex,w=void 0===x?0:x,k=e.items,C=e.children,S=e.direction,E=e.id,O=e.mode,_=void 0===O?"vertical":O,P=e.inlineCollapsed,Z=e.disabled,M=e.disabledOverflow,I=e.subMenuOpenDelay,A=void 0===I?.1:I,R=e.subMenuCloseDelay,z=void 0===R?.1:R,U=e.forceSubMenuRender,V=e.defaultOpenKeys,H=e.openKeys,K=e.activeKey,W=e.defaultActiveFirst,q=e.selectable,$=void 0===q||q,G=e.multiple,X=void 0!==G&&G,Q=e.defaultSelectedKeys,te=e.selectedKeys,ne=e.onSelect,re=e.onDeselect,oe=e.inlineIndent,ae=void 0===oe?24:oe,ie=e.motion,le=e.defaultMotions,ce=e.triggerSubMenuAction,se=void 0===ce?"hover":ce,ue=e.builtinPlacements,de=e.itemIcon,fe=e.expandIcon,pe=e.overflowedIndicator,he=void 0===pe?"...":pe,ve=e.overflowedIndicatorPopupClassName,me=e.getPopupContainer,ge=e.onClick,be=e.onOpenChange,xe=e.onKeyDown,we=(e.openAnimation,e.openTransitionName,e._internalRenderMenuItem),ke=e._internalRenderSubMenuItem,Ce=(0,c.Z)(e,Le),Se=s.useMemo((function(){return J(C,k,Fe)}),[C,k]),Ee=s.useState(!1),je=(0,l.Z)(Ee,2),Oe=je[0],_e=je[1],Ne=s.useRef(),Pe=function(e){var t=(0,h.Z)(e,{value:e}),n=(0,l.Z)(t,2),r=n[0],o=n[1];return s.useEffect((function(){Te+=1;var e="".concat(Me,"-").concat(Te);o("rc-menu-uuid-".concat(e))}),[]),r}(E),Ie="rtl"===S;var Ae=s.useMemo((function(){return"inline"!==_&&"vertical"!==_||!P?[_,!1]:["vertical",P]}),[_,P]),ze=(0,l.Z)(Ae,2),Be=ze[0],Ue=ze[1],Ve=s.useState(0),He=(0,l.Z)(Ve,2),Ke=He[0],We=He[1],Ye=Ke>=Se.length-1||"horizontal"!==Be||M,qe=(0,h.Z)(V,{value:H,postState:function(e){return e||Fe}}),$e=(0,l.Z)(qe,2),Ge=$e[0],Xe=$e[1],Qe=function(e){Xe(e),null===be||void 0===be||be(e)},Je=s.useState(Ge),et=(0,l.Z)(Je,2),tt=et[0],nt=et[1],rt="inline"===Be,ot=s.useRef(!1);s.useEffect((function(){rt&&nt(Ge)}),[Ge]),s.useEffect((function(){ot.current?rt?Xe(tt):Qe(Fe):ot.current=!0}),[rt]);var at=De(),it=at.registerPath,lt=at.unregisterPath,ct=at.refreshOverflowKeys,st=at.isSubPathKey,ut=at.getKeyPath,dt=at.getKeys,ft=at.getSubPathKeys,pt=s.useMemo((function(){return{registerPath:it,unregisterPath:lt}}),[it,lt]),ht=s.useMemo((function(){return{isSubPathKey:st}}),[st]);s.useEffect((function(){ct(Ye?Fe:Se.slice(Ke+1).map((function(e){return e.key})))}),[Ke,Ye]);var vt=(0,h.Z)(K||W&&(null===(n=Se[0])||void 0===n?void 0:n.key),{value:K}),mt=(0,l.Z)(vt,2),gt=mt[0],yt=mt[1],bt=ee((function(e){yt(e)})),xt=ee((function(){yt(void 0)}));(0,s.useImperativeHandle)(t,(function(){return{list:Ne.current,focus:function(e){var t,n,r,o,a=null!==gt&&void 0!==gt?gt:null===(t=Se.find((function(e){return!e.props.disabled})))||void 0===t?void 0:t.key;a&&(null===(n=Ne.current)||void 0===n||null===(r=n.querySelector("li[data-menu-id='".concat(F(Pe,a),"']")))||void 0===r||null===(o=r.focus)||void 0===o||o.call(r,e))}}}));var wt=(0,h.Z)(Q||[],{value:te,postState:function(e){return Array.isArray(e)?e:null===e||void 0===e?Fe:[e]}}),kt=(0,l.Z)(wt,2),Ct=kt[0],St=kt[1],Et=ee((function(e){null===ge||void 0===ge||ge(N(e)),function(e){if($){var t,n=e.key,r=Ct.includes(n);t=X?r?Ct.filter((function(e){return e!==n})):[].concat((0,i.Z)(Ct),[n]):[n],St(t);var o=(0,a.Z)((0,a.Z)({},e),{},{selectedKeys:t});r?null===re||void 0===re||re(o):null===ne||void 0===ne||ne(o)}!X&&Ge.length&&"inline"!==Be&&Qe(Fe)}(e)})),jt=ee((function(e,t){var n=Ge.filter((function(t){return t!==e}));if(t)n.push(e);else if("inline"!==Be){var r=ft(e);n=n.filter((function(e){return!r.has(e)}))}p()(Ge,n)||Qe(n)})),Ot=ee(me),_t=Ze(Be,gt,Ie,Pe,Ne,dt,ut,yt,(function(e,t){var n=null!==t&&void 0!==t?t:!Ge.includes(e);jt(e,n)}),xe);s.useEffect((function(){_e(!0)}),[]);var Nt=s.useMemo((function(){return{_internalRenderMenuItem:we,_internalRenderSubMenuItem:ke}}),[we,ke]),Pt="horizontal"!==Be||M?Se:Se.map((function(e,t){return s.createElement(j,{key:e.key,overflowDisabled:t>Ke},e)})),Zt=s.createElement(m.Z,(0,r.Z)({id:E,ref:Ne,prefixCls:"".concat(v,"-overflow"),component:"ul",itemComponent:Y,className:d()(v,"".concat(v,"-root"),"".concat(v,"-").concat(Be),b,(u={},(0,o.Z)(u,"".concat(v,"-inline-collapsed"),Ue),(0,o.Z)(u,"".concat(v,"-rtl"),Ie),u),g),dir:S,style:y,role:"menu",tabIndex:w,data:Pt,renderRawItem:function(e){return e},renderRawRest:function(e){var t=e.length,n=t?Se.slice(-t):null;return s.createElement(ye,{eventKey:Re,title:he,disabled:Ye,internalPopupClose:0===t,popupClassName:ve},n)},maxCount:"horizontal"!==Be||M?m.Z.INVALIDATE:m.Z.RESPONSIVE,ssr:"full","data-menu-list":!0,onVisibleChange:function(e){We(e)},onKeyDown:_t},Ce));return s.createElement(B.Provider,{value:Nt},s.createElement(L.Provider,{value:Pe},s.createElement(j,{prefixCls:v,rootClassName:g,mode:Be,openKeys:Ge,rtl:Ie,disabled:Z,motion:Oe?ie:null,defaultMotions:Oe?le:null,activeKey:gt,onActive:bt,onInactive:xt,selectedKeys:Ct,inlineIndent:ae,subMenuOpenDelay:A,subMenuCloseDelay:z,forceSubMenuRender:U,builtinPlacements:ue,triggerSubMenuAction:se,getPopupContainer:Ot,itemIcon:de,expandIcon:fe,onItemClick:Et,onOpenChange:jt},s.createElement(D.Provider,{value:ht},Zt),s.createElement("div",{style:{display:"none"},"aria-hidden":!0},s.createElement(T.Provider,{value:pt},Se)))))}));We.Item=Y,We.SubMenu=ye,We.ItemGroup=Ve,We.Divider=He;const Ye=We},8289:(e,t,n)=>{"use strict";n.d(t,{V:()=>ae,Z:()=>ie});var r=n(6666),o=n(3028),a=n(6234),i=n(6522),l=n(969),c=n(4943),s=n(125),u=n(5667),d=n.n(u),f=n(3126);function p(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var h=function(e,t){var n={animationend:p("Animation","AnimationEnd"),transitionend:p("Transition","TransitionEnd")};return e&&("AnimationEvent"in t||delete n.animationend.animation,"TransitionEvent"in t||delete n.transitionend.transition),n}((0,f.Z)(),"undefined"!==typeof window?window:{}),v={};if((0,f.Z)()){var m=document.createElement("div");v=m.style}var g={};function y(e){if(g[e])return g[e];var t=h[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:2;t();var a=(0,A.Z)((function(){o<=1?r({isCanceled:function(){return a!==e.current}}):n(r,o-1)}));e.current=a},t]}(),s=(0,a.Z)(c,2),u=s[0],d=s[1];return R((function(){if(o!==N&&o!==T){var e=D.indexOf(o),n=D[e+1],r=t(o);false===r?i(n,!0):u((function(e){function t(){e.isCanceled()||i(n,!0)}!0===r?t():Promise.resolve(r).then(t)}))}}),[e,o]),l.useEffect((function(){return function(){d()}}),[]),[function(){i(P,!0)},o]};function z(e,t,n,i){var c=i.motionEnter,s=void 0===c||c,u=i.motionAppear,d=void 0===u||u,f=i.motionLeave,p=void 0===f||f,h=i.motionDeadline,v=i.motionLeaveImmediately,m=i.onAppearPrepare,g=i.onEnterPrepare,y=i.onLeavePrepare,b=i.onAppearStart,x=i.onEnterStart,w=i.onLeaveStart,S=i.onAppearActive,N=i.onEnterActive,T=i.onLeaveActive,A=i.onAppearEnd,D=i.onEnterEnd,z=i.onLeaveEnd,B=i.onVisibleChanged,U=(0,I.Z)(),V=(0,a.Z)(U,2),H=V[0],K=V[1],W=(0,I.Z)(E),Y=(0,a.Z)(W,2),q=Y[0],$=Y[1],G=(0,I.Z)(null),X=(0,a.Z)(G,2),Q=X[0],J=X[1],ee=(0,l.useRef)(!1),te=(0,l.useRef)(null);function ne(){return n()}var re=(0,l.useRef)(!1);function oe(e){var t=ne();if(!e||e.deadline||e.target===t){var n,r=re.current;q===j&&r?n=null===A||void 0===A?void 0:A(t,e):q===O&&r?n=null===D||void 0===D?void 0:D(t,e):q===_&&r&&(n=null===z||void 0===z?void 0:z(t,e)),q!==E&&r&&!1!==n&&($(E,!0),J(null,!0))}}var ae=function(e){var t=(0,l.useRef)(),n=(0,l.useRef)(e);n.current=e;var r=l.useCallback((function(e){n.current(e)}),[]);function o(e){e&&(e.removeEventListener(C,r),e.removeEventListener(k,r))}return l.useEffect((function(){return function(){o(t.current)}}),[]),[function(e){t.current&&t.current!==e&&o(t.current),e&&e!==t.current&&(e.addEventListener(C,r),e.addEventListener(k,r),t.current=e)},o]}(oe),ie=(0,a.Z)(ae,1)[0],le=l.useMemo((function(){var e,t,n;switch(q){case j:return e={},(0,r.Z)(e,P,m),(0,r.Z)(e,Z,b),(0,r.Z)(e,M,S),e;case O:return t={},(0,r.Z)(t,P,g),(0,r.Z)(t,Z,x),(0,r.Z)(t,M,N),t;case _:return n={},(0,r.Z)(n,P,y),(0,r.Z)(n,Z,w),(0,r.Z)(n,M,T),n;default:return{}}}),[q]),ce=F(q,(function(e){if(e===P){var t=le.prepare;return!!t&&t(ne())}var n;de in le&&J((null===(n=le[de])||void 0===n?void 0:n.call(le,ne(),null))||null);return de===M&&(ie(ne()),h>0&&(clearTimeout(te.current),te.current=setTimeout((function(){oe({deadline:!0})}),h))),true})),se=(0,a.Z)(ce,2),ue=se[0],de=se[1],fe=L(de);re.current=fe,R((function(){K(t);var n,r=ee.current;(ee.current=!0,e)&&(!r&&t&&d&&(n=j),r&&t&&s&&(n=O),(r&&!t&&p||!r&&v&&!t&&p)&&(n=_),n&&($(n),ue()))}),[t]),(0,l.useEffect)((function(){(q===j&&!d||q===O&&!s||q===_&&!p)&&$(E)}),[d,s,p]),(0,l.useEffect)((function(){return function(){ee.current=!1,clearTimeout(te.current)}}),[]);var pe=l.useRef(!1);(0,l.useEffect)((function(){H&&(pe.current=!0),void 0!==H&&q===E&&((pe.current||H)&&(null===B||void 0===B||B(H)),pe.current=!0)}),[H,q]);var he=Q;return le.prepare&&de===Z&&(he=(0,o.Z)({transition:"none"},he)),[q,de,he,null!==H&&void 0!==H?H:t]}var B=n(9249),U=n(7371),V=n(8106),H=n(551);const K=function(e){(0,V.Z)(n,e);var t=(0,H.Z)(n);function n(){return(0,B.Z)(this,n),t.apply(this,arguments)}return(0,U.Z)(n,[{key:"render",value:function(){return this.props.children}}]),n}(l.Component);const W=function(e){var t=e;function n(e){return!(!e.motionName||!t)}"object"===(0,i.Z)(e)&&(t=e.transitionSupport);var u=l.forwardRef((function(e,t){var i=e.visible,u=void 0===i||i,f=e.removeOnLeave,p=void 0===f||f,h=e.forceRender,v=e.children,m=e.motionName,g=e.leavedClassName,y=e.eventProps,b=n(e),x=(0,l.useRef)(),w=(0,l.useRef)();var k=z(b,u,(function(){try{return x.current instanceof HTMLElement?x.current:(0,c.Z)(w.current)}catch(e){return null}}),e),C=(0,a.Z)(k,4),j=C[0],O=C[1],_=C[2],N=C[3],M=l.useRef(N);N&&(M.current=!0);var T,I=l.useCallback((function(e){x.current=e,(0,s.mH)(t,e)}),[t]),A=(0,o.Z)((0,o.Z)({},y),{},{visible:u});if(v)if(j!==E&&n(e)){var R,D;O===P?D="prepare":L(O)?D="active":O===Z&&(D="start"),T=v((0,o.Z)((0,o.Z)({},A),{},{className:d()(S(m,j),(R={},(0,r.Z)(R,S(m,"".concat(j,"-").concat(D)),D),(0,r.Z)(R,m,"string"===typeof m),R)),style:_}),I)}else T=N?v((0,o.Z)({},A),I):!p&&M.current?v((0,o.Z)((0,o.Z)({},A),{},{className:g}),I):h?v((0,o.Z)((0,o.Z)({},A),{},{style:{display:"none"}}),I):null;else T=null;l.isValidElement(T)&&(0,s.Yr)(T)&&(T.ref||(T=l.cloneElement(T,{ref:I})));return l.createElement(K,{ref:w},T)}));return u.displayName="CSSMotion",u}(w);var Y=n(7896),q=n(2159),$="add",G="keep",X="remove",Q="removed";function J(e){var t;return t=e&&"object"===(0,i.Z)(e)&&"key"in e?e:{key:e},(0,o.Z)((0,o.Z)({},t),{},{key:String(t.key)})}function ee(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return e.map(J)}function te(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,a=t.length,i=ee(e),l=ee(t);i.forEach((function(e){for(var t=!1,i=r;i1}));return s.forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==X}))).forEach((function(t){t.key===e&&(t.status=G)}))})),n}var ne=["component","children","onVisibleChanged","onAllRemoved"],re=["status"],oe=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];const ae=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:W,n=function(e){(0,V.Z)(r,e);var n=(0,H.Z)(r);function r(){var e;(0,B.Z)(this,r);for(var t=arguments.length,a=new Array(t),i=0;i{"use strict";n.d(t,{Z:()=>M});var r=n(7896),o=n(3028),a=n(6234),i=n(2159),l=n(969),c=n(5667),s=n.n(c),u=n(4480),d=n(2968),f=["prefixCls","invalidate","item","renderItem","responsive","responsiveDisabled","registerSize","itemKey","className","style","children","display","order","component"],p=void 0;function h(e,t){var n=e.prefixCls,a=e.invalidate,c=e.item,d=e.renderItem,h=e.responsive,v=e.responsiveDisabled,m=e.registerSize,g=e.itemKey,y=e.className,b=e.style,x=e.children,w=e.display,k=e.order,C=e.component,S=void 0===C?"div":C,E=(0,i.Z)(e,f),j=h&&!w;function O(e){m(g,e)}l.useEffect((function(){return function(){O(null)}}),[]);var _,N=d&&c!==p?d(c):x;a||(_={opacity:j?0:1,height:j?0:p,overflowY:j?"hidden":p,order:h?k:p,pointerEvents:j?"none":p,position:j?"absolute":p});var P={};j&&(P["aria-hidden"]=!0);var Z=l.createElement(S,(0,r.Z)({className:s()(!a&&n,y),style:(0,o.Z)((0,o.Z)({},_),b)},P,E,{ref:t}),N);return h&&(Z=l.createElement(u.Z,{onResize:function(e){O(e.offsetWidth)},disabled:v},Z)),Z}var v=l.forwardRef(h);v.displayName="Item";const m=v;var g=n(3076),y=n(1041);var b=["component"],x=["className"],w=["className"],k=function(e,t){var n=l.useContext(j);if(!n){var o=e.component,a=void 0===o?"div":o,c=(0,i.Z)(e,b);return l.createElement(a,(0,r.Z)({},c,{ref:t}))}var u=n.className,d=(0,i.Z)(n,x),f=e.className,p=(0,i.Z)(e,w);return l.createElement(j.Provider,{value:null},l.createElement(m,(0,r.Z)({ref:t,className:s()(u,f)},d,p)))},C=l.forwardRef(k);C.displayName="RawItem";const S=C;var E=["prefixCls","data","renderItem","renderRawItem","itemKey","itemWidth","ssr","style","className","maxCount","renderRest","renderRawRest","suffix","component","itemComponent","onVisibleChange"],j=l.createContext(null),O="responsive",_="invalidate";function N(e){return"+ ".concat(e.length," ...")}function P(e,t){var n=e.prefixCls,c=void 0===n?"rc-overflow":n,f=e.data,p=void 0===f?[]:f,h=e.renderItem,v=e.renderRawItem,b=e.itemKey,x=e.itemWidth,w=void 0===x?10:x,k=e.ssr,C=e.style,S=e.className,P=e.maxCount,Z=e.renderRest,M=e.renderRawRest,T=e.suffix,I=e.component,A=void 0===I?"div":I,R=e.itemComponent,D=e.onVisibleChange,L=(0,i.Z)(e,E),F=function(){var e=(0,y.Z)({}),t=(0,a.Z)(e,2)[1],n=(0,l.useRef)([]),r=0,o=0;return function(e){var a=r;return r+=1,n.current.lengthP,Oe=(0,l.useMemo)((function(){var e=p;return Se?e=null===V&&z?p:p.slice(0,Math.min(p.length,K/w)):"number"===typeof P&&(e=p.slice(0,P)),e}),[p,w,V,P,Se]),_e=(0,l.useMemo)((function(){return Se?p.slice(me+1):p.slice(Oe.length)}),[p,Oe,Se,me]),Ne=(0,l.useCallback)((function(e,t){var n;return"function"===typeof b?b(e):null!==(n=b&&(null===e||void 0===e?void 0:e[b]))&&void 0!==n?n:t}),[b]),Pe=(0,l.useCallback)(h||function(e){return e},[h]);function Ze(e,t){ve(e),t||(xe(eK){Ze(r-1),de(e-o-ie+ne);break}}T&&Te(0)+ie>K&&de(null)}}),[K,q,ne,ie,Ne,Oe]);var Ie=be&&!!_e.length,Ae={};null!==ue&&Se&&(Ae={position:"absolute",left:ue,top:0});var Re,De={prefixCls:we,responsive:Se,component:R,invalidate:Ee},Le=v?function(e,t){var n=Ne(e,t);return l.createElement(j.Provider,{key:n,value:(0,o.Z)((0,o.Z)({},De),{},{order:t,item:e,itemKey:n,registerSize:Me,display:t<=me})},v(e,t))}:function(e,t){var n=Ne(e,t);return l.createElement(m,(0,r.Z)({},De,{order:t,key:n,item:e,renderItem:Pe,itemKey:n,registerSize:Me,display:t<=me}))},Fe={order:Ie?me:Number.MAX_SAFE_INTEGER,className:"".concat(we,"-rest"),registerSize:function(e,t){re(t),J(ne)},display:Ie};if(M)M&&(Re=l.createElement(j.Provider,{value:(0,o.Z)((0,o.Z)({},De),Fe)},M(_e)));else{var ze=Z||N;Re=l.createElement(m,(0,r.Z)({},De,Fe),"function"===typeof ze?ze(_e):ze)}var Be=l.createElement(A,(0,r.Z)({className:s()(!Ee&&c,S),style:C,ref:t},L),Oe.map(Le),je?Re:null,T&&l.createElement(m,(0,r.Z)({},De,{responsive:Ce,responsiveDisabled:!Se,order:me,className:"".concat(we,"-suffix"),registerSize:function(e,t){le(t)},display:!0,style:Ae}),T));return Ce&&(Be=l.createElement(u.Z,{onResize:function(e,t){H(t.clientWidth)},disabled:!Se},Be)),Be}var Z=l.forwardRef(P);Z.displayName="Overflow",Z.Item=S,Z.RESPONSIVE=O,Z.INVALIDATE=_;const M=Z},7144:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"}},4480:(e,t,n)=>{"use strict";n.d(t,{Z:()=>x});var r=n(7896),o=n(969),a=n(2148),i=(n(5277),n(3028)),l=n(125),c=n(4943),s=n(2158),u=new Map;var d=new s.Z((function(e){e.forEach((function(e){var t,n=e.target;null===(t=u.get(n))||void 0===t||t.forEach((function(e){return e(n)}))}))}));var f=n(9249),p=n(7371),h=n(8106),v=n(551),m=function(e){(0,h.Z)(n,e);var t=(0,v.Z)(n);function n(){return(0,f.Z)(this,n),t.apply(this,arguments)}return(0,p.Z)(n,[{key:"render",value:function(){return this.props.children}}]),n}(o.Component),g=o.createContext(null);function y(e){var t=e.children,n=e.disabled,r=o.useRef(null),a=o.useRef(null),s=o.useContext(g),f="function"===typeof t,p=f?t(r):t,h=o.useRef({width:-1,height:-1,offsetWidth:-1,offsetHeight:-1}),v=!f&&o.isValidElement(p)&&(0,l.Yr)(p),y=v?p.ref:null,b=o.useMemo((function(){return(0,l.sQ)(y,r)}),[y,r]),x=o.useRef(e);x.current=e;var w=o.useCallback((function(e){var t=x.current,n=t.onResize,r=t.data,o=e.getBoundingClientRect(),a=o.width,l=o.height,c=e.offsetWidth,u=e.offsetHeight,d=Math.floor(a),f=Math.floor(l);if(h.current.width!==d||h.current.height!==f||h.current.offsetWidth!==c||h.current.offsetHeight!==u){var p={width:d,height:f,offsetWidth:c,offsetHeight:u};h.current=p;var v=c===Math.round(a)?a:c,m=u===Math.round(l)?l:u,g=(0,i.Z)((0,i.Z)({},p),{},{offsetWidth:v,offsetHeight:m});null===s||void 0===s||s(g,e,r),n&&Promise.resolve().then((function(){n(g,e)}))}}),[]);return o.useEffect((function(){var e,t,o=(0,c.Z)(r.current)||(0,c.Z)(a.current);return o&&!n&&(e=o,t=w,u.has(e)||(u.set(e,new Set),d.observe(e)),u.get(e).add(t)),function(){return function(e,t){u.has(e)&&(u.get(e).delete(t),u.get(e).size||(d.unobserve(e),u.delete(e)))}(o,w)}}),[r.current,n]),o.createElement(m,{ref:a},v?o.cloneElement(p,{ref:b}):p)}function b(e){var t=e.children;return("function"===typeof t?[t]:(0,a.Z)(t)).map((function(t,n){var a=(null===t||void 0===t?void 0:t.key)||"".concat("rc-observer-key","-").concat(n);return o.createElement(y,(0,r.Z)({},e,{key:a}),t)}))}b.Collection=function(e){var t=e.children,n=e.onBatchResize,r=o.useRef(0),a=o.useRef([]),i=o.useContext(g),l=o.useCallback((function(e,t,o){r.current+=1;var l=r.current;a.current.push({size:e,element:t,data:o}),Promise.resolve().then((function(){l===r.current&&(null===n||void 0===n||n(a.current),a.current=[])})),null===i||void 0===i||i(e,t,o)}),[n,i]);return o.createElement(g.Provider,{value:l},t)};const x=b},1831:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r={adjustX:1,adjustY:1},o=[0,0],a={left:{points:["cr","cl"],overflow:r,offset:[-4,0],targetOffset:o},right:{points:["cl","cr"],overflow:r,offset:[4,0],targetOffset:o},top:{points:["bc","tc"],overflow:r,offset:[0,-4],targetOffset:o},bottom:{points:["tc","bc"],overflow:r,offset:[0,4],targetOffset:o},topLeft:{points:["bl","tl"],overflow:r,offset:[0,-4],targetOffset:o},leftTop:{points:["tr","tl"],overflow:r,offset:[-4,0],targetOffset:o},topRight:{points:["br","tr"],overflow:r,offset:[0,-4],targetOffset:o},rightTop:{points:["tl","tr"],overflow:r,offset:[4,0],targetOffset:o},bottomRight:{points:["tr","br"],overflow:r,offset:[0,4],targetOffset:o},rightBottom:{points:["bl","br"],overflow:r,offset:[4,0],targetOffset:o},bottomLeft:{points:["tl","bl"],overflow:r,offset:[0,4],targetOffset:o},leftBottom:{points:["br","bl"],overflow:r,offset:[-4,0],targetOffset:o}}},7218:(e,t,n)=>{"use strict";n.d(t,{Z:()=>tt});var r=n(3028),o=n(7896),a=n(9249),i=n(7371),l=n(753),c=n(8106),s=n(551),u=n(969),d=n(5749),f=n(3076),p=n(3521),h=n(4943),v=n(125),m=n(197),g=n(3409),y=n(5667),b=n.n(y);function x(e,t,n){return n?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}var w=n(6234),k=n(2159),C=n(9086),S=n(8289);function E(e){var t=e.prefixCls,n=e.motion,r=e.animation,o=e.transitionName;return n||(r?{motionName:"".concat(t,"-").concat(r)}:o?{motionName:o}:null)}function j(e){var t=e.prefixCls,n=e.visible,a=e.zIndex,i=e.mask,l=e.maskMotion,c=e.maskAnimation,s=e.maskTransitionName;if(!i)return null;var d={};return(l||s||c)&&(d=(0,r.Z)({motionAppear:!0},E({motion:l,prefixCls:t,transitionName:s,animation:c}))),u.createElement(S.Z,(0,o.Z)({},d,{visible:n,removeOnLeave:!0}),(function(e){var n=e.className;return u.createElement("div",{style:{zIndex:a},className:b()("".concat(t,"-mask"),n)})}))}var O,_=n(6522),N=n(2523);function P(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Z(e){for(var t=1;t=0&&n.left>=0&&n.bottom>n.top&&n.right>n.left?n:null}function ye(e){var t,n,r;if(pe.isWindow(e)||9===e.nodeType){var o=pe.getWindow(e);t={left:pe.getWindowScrollLeft(o),top:pe.getWindowScrollTop(o)},n=pe.viewportWidth(o),r=pe.viewportHeight(o)}else t=pe.offset(e),n=pe.outerWidth(e),r=pe.outerHeight(e);return t.width=n,t.height=r,t}function be(e,t){var n=t.charAt(0),r=t.charAt(1),o=e.width,a=e.height,i=e.left,l=e.top;return"c"===n?l+=a/2:"b"===n&&(l+=a),"c"===r?i+=o/2:"r"===r&&(i+=o),{left:i,top:l}}function xe(e,t,n,r,o){var a=be(t,n[1]),i=be(e,n[0]),l=[i.left-a.left,i.top-a.top];return{left:Math.round(e.left-l[0]+r[0]-o[0]),top:Math.round(e.top-l[1]+r[1]-o[1])}}function we(e,t,n){return e.leftn.right}function ke(e,t,n){return e.topn.bottom}function Ce(e,t,n){var r=[];return pe.each(e,(function(e){r.push(e.replace(t,(function(e){return n[e]})))})),r}function Se(e,t){return e[t]=-e[t],e}function Ee(e,t){return(/%$/.test(e)?parseInt(e.substring(0,e.length-1),10)/100*t:parseInt(e,10))||0}function je(e,t){e[0]=Ee(e[0],t.width),e[1]=Ee(e[1],t.height)}function Oe(e,t,n,r){var o=n.points,a=n.offset||[0,0],i=n.targetOffset||[0,0],l=n.overflow,c=n.source||e;a=[].concat(a),i=[].concat(i);var s={},u=0,d=ge(c,!(!(l=l||{})||!l.alwaysByViewport)),f=ye(c);je(a,f),je(i,t);var p=xe(f,t,o,a,i),h=pe.merge(f,p);if(d&&(l.adjustX||l.adjustY)&&r){if(l.adjustX&&we(p,f,d)){var v=Ce(o,/[lr]/gi,{l:"r",r:"l"}),m=Se(a,0),g=Se(i,0);(function(e,t,n){return e.left>n.right||e.left+t.widthn.bottom||e.top+t.height=n.left&&o.left+a.width>n.right&&(a.width-=o.left+a.width-n.right),r.adjustX&&o.left+a.width>n.right&&(o.left=Math.max(n.right-a.width,n.left)),r.adjustY&&o.top=n.top&&o.top+a.height>n.bottom&&(a.height-=o.top+a.height-n.bottom),r.adjustY&&o.top+a.height>n.bottom&&(o.top=Math.max(n.bottom-a.height,n.top)),pe.mix(o,a)}(p,f,d,s))}return h.width!==f.width&&pe.css(c,"width",pe.width(c)+h.width-f.width),h.height!==f.height&&pe.css(c,"height",pe.height(c)+h.height-f.height),pe.offset(c,{left:h.left,top:h.top},{useCssRight:n.useCssRight,useCssBottom:n.useCssBottom,useCssTransform:n.useCssTransform,ignoreShake:n.ignoreShake}),{points:o,offset:a,targetOffset:i,overflow:s}}function _e(e,t,n){var r=n.target||t,o=ye(r),a=!function(e,t){var n=ge(e,t),r=ye(e);return!n||r.left+r.width<=n.left||r.top+r.height<=n.top||r.left>=n.right||r.top>=n.bottom}(r,n.overflow&&n.overflow.alwaysByViewport);return Oe(e,o,n,a)}_e.__getOffsetParent=ve,_e.__getVisibleRectForElement=ge;var Ne=n(5888),Pe=n.n(Ne),Ze=n(2158);function Me(e,t){var n=null,r=null;var o=new Ze.Z((function(e){var o=(0,w.Z)(e,1)[0].target;if(document.documentElement.contains(o)){var a=o.getBoundingClientRect(),i=a.width,l=a.height,c=Math.floor(i),s=Math.floor(l);n===c&&r===s||Promise.resolve().then((function(){t({width:c,height:s})})),n=c,r=s}}));return e&&o.observe(e),function(){o.disconnect()}}function Te(e){return"function"!==typeof e?null:e()}function Ie(e){return"object"===(0,_.Z)(e)&&e?e:null}var Ae=function(e,t){var n=e.children,r=e.disabled,o=e.target,a=e.align,i=e.onAlign,l=e.monitorWindowResize,c=e.monitorBufferTime,s=void 0===c?0:c,d=u.useRef({}),f=u.useRef(),h=u.Children.only(n),g=u.useRef({});g.current.disabled=r,g.current.target=o,g.current.align=a,g.current.onAlign=i;var y=function(e,t){var n=u.useRef(!1),r=u.useRef(null);function o(){window.clearTimeout(r.current)}return[function a(i){if(o(),n.current&&!0!==i)r.current=window.setTimeout((function(){n.current=!1,a()}),t);else{if(!1===e())return;n.current=!0,r.current=window.setTimeout((function(){n.current=!1}),t)}},function(){n.current=!1,o()}]}((function(){var e=g.current,t=e.disabled,n=e.target,r=e.align,o=e.onAlign;if(!t&&n){var a,i=f.current,l=Te(n),c=Ie(n);d.current.element=l,d.current.point=c,d.current.align=r;var s=document.activeElement;return l&&(0,N.Z)(l)?a=_e(i,l,r):c&&(a=function(e,t,n){var r,o,a=pe.getDocument(e),i=a.defaultView||a.parentWindow,l=pe.getWindowScrollLeft(i),c=pe.getWindowScrollTop(i),s=pe.viewportWidth(i),u=pe.viewportHeight(i),d={left:r="pageX"in t?t.pageX:l+t.clientX,top:o="pageY"in t?t.pageY:c+t.clientY,width:0,height:0},f=r>=0&&r<=l+s&&o>=0&&o<=c+u,p=[n.points[0],"cc"];return Oe(e,d,Z(Z({},n),{},{points:p}),f)}(i,c,r)),function(e,t){e!==document.activeElement&&(0,p.Z)(t,e)&&"function"===typeof e.focus&&e.focus()}(s,i),o&&a&&o(i,a),!0}return!1}),s),b=(0,w.Z)(y,2),x=b[0],k=b[1],C=u.useRef({cancel:function(){}}),S=u.useRef({cancel:function(){}});u.useEffect((function(){var e,t,n=Te(o),r=Ie(o);f.current!==S.current.element&&(S.current.cancel(),S.current.element=f.current,S.current.cancel=Me(f.current,x)),d.current.element===n&&((e=d.current.point)===(t=r)||e&&t&&("pageX"in t&&"pageY"in t?e.pageX===t.pageX&&e.pageY===t.pageY:"clientX"in t&&"clientY"in t&&e.clientX===t.clientX&&e.clientY===t.clientY))&&Pe()(d.current.align,a)||(x(),C.current.element!==n&&(C.current.cancel(),C.current.element=n,C.current.cancel=Me(n,x)))})),u.useEffect((function(){r?k():x()}),[r]);var E=u.useRef(null);return u.useEffect((function(){l?E.current||(E.current=(0,m.Z)(window,"resize",x)):E.current&&(E.current.remove(),E.current=null)}),[l]),u.useEffect((function(){return function(){C.current.cancel(),S.current.cancel(),E.current&&E.current.remove(),k()}}),[]),u.useImperativeHandle(t,(function(){return{forceAlign:function(){return x(!0)}}})),u.isValidElement(h)&&(h=u.cloneElement(h,{ref:(0,v.sQ)(h.ref,f)})),h},Re=u.forwardRef(Ae);Re.displayName="Align";const De=Re;var Le=n(2968),Fe=n(2723),ze=n(4795),Be=n(1041),Ue=["measure","alignPre","align",null,"motion"];var Ve=u.forwardRef((function(e,t){var n=e.visible,a=e.prefixCls,i=e.className,l=e.style,c=e.children,s=e.zIndex,d=e.stretch,p=e.destroyPopupOnHide,h=e.forceRender,v=e.align,m=e.point,g=e.getRootDomNode,y=e.getClassNameFromAlign,x=e.onAlign,k=e.onMouseEnter,C=e.onMouseLeave,j=e.onMouseDown,O=e.onTouchStart,_=e.onClick,N=(0,u.useRef)(),P=(0,u.useRef)(),Z=(0,u.useState)(),M=(0,w.Z)(Z,2),T=M[0],I=M[1],A=function(e){var t=u.useState({width:0,height:0}),n=(0,w.Z)(t,2),r=n[0],o=n[1];return[u.useMemo((function(){var t={};if(e){var n=r.width,o=r.height;-1!==e.indexOf("height")&&o?t.height=o:-1!==e.indexOf("minHeight")&&o&&(t.minHeight=o),-1!==e.indexOf("width")&&n?t.width=n:-1!==e.indexOf("minWidth")&&n&&(t.minWidth=n)}return t}),[e,r]),function(e){o({width:e.offsetWidth,height:e.offsetHeight})}]}(d),R=(0,w.Z)(A,2),D=R[0],L=R[1];var F=function(e,t){var n=(0,Be.Z)(null),r=(0,w.Z)(n,2),o=r[0],a=r[1],i=(0,u.useRef)();function l(e){a(e,!0)}function c(){f.Z.cancel(i.current)}return(0,u.useEffect)((function(){l("measure")}),[e]),(0,u.useEffect)((function(){"measure"===o&&t(),o&&(i.current=(0,f.Z)((0,ze.Z)((0,Fe.Z)().mark((function e(){var t,n;return(0,Fe.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=Ue.indexOf(o),(n=Ue[t+1])&&-1!==t&&l(n);case 3:case"end":return e.stop()}}),e)})))))}),[o]),(0,u.useEffect)((function(){return function(){c()}}),[]),[o,function(e){c(),i.current=(0,f.Z)((function(){l((function(e){switch(o){case"align":return"motion";case"motion":return"stable"}return e})),null===e||void 0===e||e()}))}]}(n,(function(){d&&L(g())})),z=(0,w.Z)(F,2),B=z[0],U=z[1],V=(0,u.useState)(0),H=(0,w.Z)(V,2),K=H[0],W=H[1],Y=(0,u.useRef)();function q(){var e;null===(e=N.current)||void 0===e||e.forceAlign()}function $(e,t){var n=y(t);T!==n&&I(n),W((function(e){return e+1})),"align"===B&&(null===x||void 0===x||x(e,t))}(0,Le.Z)((function(){"alignPre"===B&&W(0)}),[B]),(0,Le.Z)((function(){"align"===B&&(K<2?q():U((function(){var e;null===(e=Y.current)||void 0===e||e.call(Y)})))}),[K]);var G=(0,r.Z)({},E(e));function X(){return new Promise((function(e){Y.current=e}))}["onAppearEnd","onEnterEnd","onLeaveEnd"].forEach((function(e){var t=G[e];G[e]=function(e,n){return U(),null===t||void 0===t?void 0:t(e,n)}})),u.useEffect((function(){G.motionName||"motion"!==B||U()}),[G.motionName,B]),u.useImperativeHandle(t,(function(){return{forceAlign:q,getElement:function(){return P.current}}}));var Q=(0,r.Z)((0,r.Z)({},D),{},{zIndex:s,opacity:"motion"!==B&&"stable"!==B&&n?0:void 0,pointerEvents:n||"stable"===B?void 0:"none"},l),J=!0;!(null===v||void 0===v?void 0:v.points)||"align"!==B&&"stable"!==B||(J=!1);var ee=c;return u.Children.count(c)>1&&(ee=u.createElement("div",{className:"".concat(a,"-content")},c)),u.createElement(S.Z,(0,o.Z)({visible:n,ref:P,leavedClassName:"".concat(a,"-hidden")},G,{onAppearPrepare:X,onEnterPrepare:X,removeOnLeave:p,forceRender:h}),(function(e,t){var n=e.className,o=e.style,l=b()(a,i,T,n);return u.createElement(De,{target:m||g,key:"popup",ref:N,monitorWindowResize:!0,disabled:J,align:v,onAlign:$},u.createElement("div",{ref:t,className:l,onMouseEnter:k,onMouseLeave:C,onMouseDownCapture:j,onTouchStartCapture:O,onClick:_,style:(0,r.Z)((0,r.Z)({},o),Q)},ee))}))}));Ve.displayName="PopupInner";const He=Ve;var Ke=u.forwardRef((function(e,t){var n=e.prefixCls,a=e.visible,i=e.zIndex,l=e.children,c=e.mobile,s=(c=void 0===c?{}:c).popupClassName,d=c.popupStyle,f=c.popupMotion,p=void 0===f?{}:f,h=c.popupRender,v=e.onClick,m=u.useRef();u.useImperativeHandle(t,(function(){return{forceAlign:function(){},getElement:function(){return m.current}}}));var g=(0,r.Z)({zIndex:i},d),y=l;return u.Children.count(l)>1&&(y=u.createElement("div",{className:"".concat(n,"-content")},l)),h&&(y=h(y)),u.createElement(S.Z,(0,o.Z)({visible:a,ref:m,removeOnLeave:!0},p),(function(e,t){var o=e.className,a=e.style,i=b()(n,s,o);return u.createElement("div",{ref:t,className:i,onClick:v,style:(0,r.Z)((0,r.Z)({},a),g)},y)}))}));Ke.displayName="MobilePopupInner";const We=Ke;var Ye=["visible","mobile"],qe=u.forwardRef((function(e,t){var n=e.visible,a=e.mobile,i=(0,k.Z)(e,Ye),l=(0,u.useState)(n),c=(0,w.Z)(l,2),s=c[0],d=c[1],f=(0,u.useState)(!1),p=(0,w.Z)(f,2),h=p[0],v=p[1],m=(0,r.Z)((0,r.Z)({},i),{},{visible:s});(0,u.useEffect)((function(){d(n),n&&a&&v((0,C.Z)())}),[n,a]);var g=h?u.createElement(We,(0,o.Z)({},m,{mobile:a,ref:t})):u.createElement(He,(0,o.Z)({},m,{ref:t}));return u.createElement("div",null,u.createElement(j,m),g)}));qe.displayName="Popup";const $e=qe;const Ge=u.createContext(null);function Xe(){}function Qe(){return""}function Je(e){return e?e.ownerDocument:window.document}var et=["onClick","onMouseDown","onTouchStart","onMouseEnter","onMouseLeave","onFocus","onBlur","onContextMenu"];const tt=function(e){var t=function(t){(0,c.Z)(g,t);var n=(0,s.Z)(g);function g(e){var t,r;return(0,a.Z)(this,g),(t=n.call(this,e)).popupRef=u.createRef(),t.triggerRef=u.createRef(),t.portalContainer=void 0,t.attachId=void 0,t.clickOutsideHandler=void 0,t.touchOutsideHandler=void 0,t.contextMenuOutsideHandler1=void 0,t.contextMenuOutsideHandler2=void 0,t.mouseDownTimeout=void 0,t.focusTime=void 0,t.preClickTime=void 0,t.preTouchTime=void 0,t.delayTimer=void 0,t.hasPopupMouseDown=void 0,t.onMouseEnter=function(e){var n=t.props.mouseEnterDelay;t.fireEvents("onMouseEnter",e),t.delaySetPopupVisible(!0,n,n?null:e)},t.onMouseMove=function(e){t.fireEvents("onMouseMove",e),t.setPoint(e)},t.onMouseLeave=function(e){t.fireEvents("onMouseLeave",e),t.delaySetPopupVisible(!1,t.props.mouseLeaveDelay)},t.onPopupMouseEnter=function(){t.clearDelayTimer()},t.onPopupMouseLeave=function(e){var n;e.relatedTarget&&!e.relatedTarget.setTimeout&&(0,p.Z)(null===(n=t.popupRef.current)||void 0===n?void 0:n.getElement(),e.relatedTarget)||t.delaySetPopupVisible(!1,t.props.mouseLeaveDelay)},t.onFocus=function(e){t.fireEvents("onFocus",e),t.clearDelayTimer(),t.isFocusToShow()&&(t.focusTime=Date.now(),t.delaySetPopupVisible(!0,t.props.focusDelay))},t.onMouseDown=function(e){t.fireEvents("onMouseDown",e),t.preClickTime=Date.now()},t.onTouchStart=function(e){t.fireEvents("onTouchStart",e),t.preTouchTime=Date.now()},t.onBlur=function(e){t.fireEvents("onBlur",e),t.clearDelayTimer(),t.isBlurToHide()&&t.delaySetPopupVisible(!1,t.props.blurDelay)},t.onContextMenu=function(e){e.preventDefault(),t.fireEvents("onContextMenu",e),t.setPopupVisible(!0,e)},t.onContextMenuClose=function(){t.isContextMenuToShow()&&t.close()},t.onClick=function(e){if(t.fireEvents("onClick",e),t.focusTime){var n;if(t.preClickTime&&t.preTouchTime?n=Math.min(t.preClickTime,t.preTouchTime):t.preClickTime?n=t.preClickTime:t.preTouchTime&&(n=t.preTouchTime),Math.abs(n-t.focusTime)<20)return;t.focusTime=0}t.preClickTime=0,t.preTouchTime=0,t.isClickToShow()&&(t.isClickToHide()||t.isBlurToHide())&&e&&e.preventDefault&&e.preventDefault();var r=!t.state.popupVisible;(t.isClickToHide()&&!r||r&&t.isClickToShow())&&t.setPopupVisible(!t.state.popupVisible,e)},t.onPopupMouseDown=function(){var e;(t.hasPopupMouseDown=!0,clearTimeout(t.mouseDownTimeout),t.mouseDownTimeout=window.setTimeout((function(){t.hasPopupMouseDown=!1}),0),t.context)&&(e=t.context).onPopupMouseDown.apply(e,arguments)},t.onDocumentClick=function(e){if(!t.props.mask||t.props.maskClosable){var n=e.target,r=t.getRootDomNode(),o=t.getPopupDomNode();(0,p.Z)(r,n)&&!t.isContextMenuOnly()||(0,p.Z)(o,n)||t.hasPopupMouseDown||t.close()}},t.getRootDomNode=function(){var e=t.props.getTriggerDOMNode;if(e)return e(t.triggerRef.current);try{var n=(0,h.Z)(t.triggerRef.current);if(n)return n}catch(r){}return d.findDOMNode((0,l.Z)(t))},t.getPopupClassNameFromAlign=function(e){var n=[],r=t.props,o=r.popupPlacement,a=r.builtinPlacements,i=r.prefixCls,l=r.alignPoint,c=r.getPopupClassNameFromAlign;return o&&a&&n.push(function(e,t,n,r){for(var o=n.points,a=Object.keys(e),i=0;i{"use strict";n.d(t,{Z:()=>a});var r=n(969),o=n(9479);function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];return r.Children.forEach(e,(function(e){(void 0!==e&&null!==e||t.keepEmpty)&&(Array.isArray(e)?n=n.concat(a(e)):(0,o.isFragment)(e)&&e.props?n=n.concat(a(e.props.children,t)):n.push(e))})),n}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(5749);function o(e,t,n,o){var a=r.unstable_batchedUpdates?function(e){r.unstable_batchedUpdates(n,e)}:n;return e.addEventListener&&e.addEventListener(t,a,o),{remove:function(){e.removeEventListener&&e.removeEventListener(t,a,o)}}}},3126:(e,t,n)=>{"use strict";function r(){return!("undefined"===typeof window||!window.document||!window.document.createElement)}n.d(t,{Z:()=>r})},3521:(e,t,n)=>{"use strict";function r(e,t){return!!e&&e.contains(t)}n.d(t,{Z:()=>r})},5334:(e,t,n)=>{"use strict";n.d(t,{hq:()=>u});var r=n(3126),o="rc-util-key";function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.mark;return t?t.startsWith("data-")?t:"data-".concat(t):o}function i(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function l(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,r.Z)())return null;var o,a=document.createElement("style");(null===(t=n.csp)||void 0===t?void 0:t.nonce)&&(a.nonce=null===(o=n.csp)||void 0===o?void 0:o.nonce);a.innerHTML=e;var l=i(n),c=l.firstChild;return n.prepend&&l.prepend?l.prepend(a):n.prepend&&c?l.insertBefore(a,c):l.appendChild(a),a}var c=new Map;function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i(t);return Array.from(c.get(n).children).find((function(n){return"STYLE"===n.tagName&&n.getAttribute(a(t))===e}))}function u(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=i(n);if(!c.has(r)){var o=l("",n),u=o.parentNode;c.set(r,u),u.removeChild(o)}var d=s(t,n);if(d){var f,p,h;if((null===(f=n.csp)||void 0===f?void 0:f.nonce)&&d.nonce!==(null===(p=n.csp)||void 0===p?void 0:p.nonce))d.nonce=null===(h=n.csp)||void 0===h?void 0:h.nonce;return d.innerHTML!==e&&(d.innerHTML=e),d}var v=l(e,n);return v.setAttribute(a(n),t),v}},4943:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(5749);function o(e){return e instanceof HTMLElement?e:r.findDOMNode(e)}},4500:(e,t,n)=>{"use strict";n.d(t,{tS:()=>i});var r=n(8079),o=n(2523);function a(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if((0,o.Z)(e)){var n=e.nodeName.toLowerCase(),r=["input","select","textarea","button"].includes(n)||e.isContentEditable||"a"===n&&!!e.getAttribute("href"),a=e.getAttribute("tabindex"),i=Number(a),l=null;return a&&!Number.isNaN(i)?l=i:r&&null===l&&(l=0),r&&e.disabled&&(l=null),null!==l&&(l>=0||t&&l<0)}return!1}function i(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=(0,r.Z)(e.querySelectorAll("*")).filter((function(e){return a(e,t)}));return a(e,t)&&n.unshift(e),n}},2523:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=function(e){if(!e)return!1;if(e.offsetParent)return!0;if(e.getBBox){var t=e.getBBox();if(t.width||t.height)return!0}if(e.getBoundingClientRect){var n=e.getBoundingClientRect();if(n.width||n.height)return!0}return!1}},7326:(e,t,n)=>{"use strict";n.d(t,{G:()=>a});var r=n(3126),o=function(e){if((0,r.Z)()&&window.document.documentElement){var t=Array.isArray(e)?e:[e],n=window.document.documentElement;return t.some((function(e){return e in n.style}))}return!1};function a(e,t){return Array.isArray(e)||void 0===t?o(e):function(e,t){if(!o(e))return!1;var n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r}(e,t)}},4184:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=r.F1&&t<=r.F12)return!1;switch(t){case r.ALT:case r.CAPS_LOCK:case r.CONTEXT_MENU:case r.CTRL:case r.DOWN:case r.END:case r.ESC:case r.HOME:case r.INSERT:case r.LEFT:case r.MAC_FF_META:case r.META:case r.NUMLOCK:case r.NUM_CENTER:case r.PAGE_DOWN:case r.PAGE_UP:case r.PAUSE:case r.PRINT_SCREEN:case r.RIGHT:case r.SHIFT:case r.UP:case r.WIN_KEY:case r.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=r.ZERO&&e<=r.NINE)return!0;if(e>=r.NUM_ZERO&&e<=r.NUM_MULTIPLY)return!0;if(e>=r.A&&e<=r.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case r.SPACE:case r.QUESTION_MARK:case r.NUM_PLUS:case r.NUM_MINUS:case r.NUM_PERIOD:case r.NUM_DIVISION:case r.SEMICOLON:case r.DASH:case r.EQUALS:case r.COMMA:case r.PERIOD:case r.SLASH:case r.APOSTROPHE:case r.SINGLE_QUOTE:case r.OPEN_SQUARE_BRACKET:case r.BACKSLASH:case r.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const o=r},3409:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(969),o=n(5749),a=n(3126);const i=(0,r.forwardRef)((function(e,t){var n=e.didUpdate,i=e.getContainer,l=e.children,c=(0,r.useRef)(),s=(0,r.useRef)();(0,r.useImperativeHandle)(t,(function(){return{}}));var u=(0,r.useRef)(!1);return!u.current&&(0,a.Z)()&&(s.current=i(),c.current=s.current.parentNode,u.current=!0),(0,r.useEffect)((function(){null===n||void 0===n||n(e)})),(0,r.useEffect)((function(){return null===s.current.parentNode&&null!==c.current&&c.current.appendChild(s.current),function(){var e,t;null===(e=s.current)||void 0===e||null===(t=e.parentNode)||void 0===t||t.removeChild(s.current)}}),[]),s.current?o.createPortal(l,s.current):null}))},3114:(e,t,n)=>{"use strict";var r;function o(e){if("undefined"===typeof document)return 0;if(e||void 0===r){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var n=document.createElement("div"),o=n.style;o.position="absolute",o.top="0",o.left="0",o.pointerEvents="none",o.visibility="hidden",o.width="200px",o.height="150px",o.overflow="hidden",n.appendChild(t),document.body.appendChild(n);var a=t.offsetWidth;n.style.overflow="scroll";var i=t.offsetWidth;a===i&&(i=n.clientWidth),document.body.removeChild(n),r=a-i}return r}function a(e){var t=e.match(/^(.*)px$/),n=Number(null===t||void 0===t?void 0:t[1]);return Number.isNaN(n)?o():n}function i(e){if("undefined"===typeof document||!e||!(e instanceof Element))return{width:0,height:0};var t=getComputedStyle(e,"::-webkit-scrollbar"),n=t.width,r=t.height;return{width:a(n),height:a(r)}}n.d(t,{Z:()=>o,o:()=>i})},8753:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(969);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";n.d(t,{Z:()=>a,o:()=>i});var r=n(969),o=(0,n(3126).Z)()?r.useLayoutEffect:r.useEffect;const a=o;var i=function(e,t){var n=r.useRef(!0);o((function(){if(!n.current)return e()}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])}},4862:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(969);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},1978:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r,o=n(6234),a=n(969),i=n(8753),l=n(2968),c=n(1041);function s(e){return void 0!==e}function u(e,t){var n=t||{},u=n.defaultValue,d=n.value,f=n.onChange,p=n.postState,h=(0,c.Z)((function(){var t,n=void 0;return s(d)?(n=d,t=r.PROP):s(u)?(n="function"===typeof u?u():u,t=r.PROP):(n="function"===typeof e?e():e,t=r.INNER),[n,t,n]})),v=(0,o.Z)(h,2),m=v[0],g=v[1],y=s(d)?d:m[0],b=p?p(y):y;(0,l.o)((function(){g((function(e){var t=(0,o.Z)(e,1)[0];return[d,r.PROP,t]}))}),[d]);var x=a.useRef(),w=(0,i.Z)((function(e,t){g((function(t){var n=(0,o.Z)(t,3),a=n[0],i=n[1],l=n[2],c="function"===typeof e?e(a):e;if(c===a)return t;var s=i===r.INNER&&x.current!==l?l:a;return[c,r.INNER,s]}),t)})),k=(0,i.Z)(f);return(0,l.Z)((function(){var e=(0,o.Z)(m,3),t=e[0],n=e[1],a=e[2];t!==a&&n===r.INNER&&(k(t,a),x.current=a)}),[m]),[b,w]}!function(e){e[e.INNER=0]="INNER",e[e.PROP=1]="PROP"}(r||(r={}))},1041:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(6234),o=n(969);function a(e){var t=o.useRef(!1),n=o.useState(e),a=(0,r.Z)(n,2),i=a[0],l=a[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[i,function(e,n){n&&t.current||l(e)}]}},9086:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=function(){if("undefined"===typeof navigator||"undefined"===typeof window)return!1;var e=navigator.userAgent||navigator.vendor||window.opera;return!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(null===e||void 0===e?void 0:e.substr(0,4)))}},8870:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(3028);function o(e,t){var n=(0,r.Z)({},e);return Array.isArray(t)&&t.forEach((function(e){delete n[e]})),n}},605:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(3028),o="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),a="aria-",i="data-";function l(e,t){return 0===e.indexOf(t)}function c(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,r.Z)({},n);var c={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||l(n,a))||t.data&&l(n,i)||t.attr&&o.includes(n))&&(c[n]=e[n])})),c}},3076:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=function(e){return+setTimeout(e,16)},o=function(e){return clearTimeout(e)};"undefined"!==typeof window&&"requestAnimationFrame"in window&&(r=function(e){return window.requestAnimationFrame(e)},o=function(e){return window.cancelAnimationFrame(e)});var a=0,i=new Map;function l(e){i.delete(e)}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=a+=1;function o(t){if(0===t)l(n),e();else{var a=r((function(){o(t-1)}));i.set(n,a)}}return o(t),n}c.cancel=function(e){var t=i.get(e);return l(t),o(t)}},125:(e,t,n)=>{"use strict";n.d(t,{Yr:()=>s,mH:()=>i,sQ:()=>l,x1:()=>c});var r=n(6522),o=n(9479),a=n(4862);function i(e,t){"function"===typeof e?e(t):"object"===(0,r.Z)(e)&&e&&"current"in e&&(e.current=t)}function l(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{ET:()=>l,Kp:()=>o,ZP:()=>c});var r={};function o(e,t){0}function a(e,t){0}function i(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function l(e,t){i(a,e,t)}const c=function(e,t){i(o,e,t)}},7910:(e,t,n)=>{"use strict";n.d(t,{Z:()=>$});var r=n(969),o=n(5667),a=n.n(o),i=n(4480);function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;tn},e}return t=l,(n=[{key:"componentDidMount",value:function(){this.scrollbarRef.current.addEventListener("touchstart",this.onScrollbarTouchStart),this.thumbRef.current.addEventListener("touchstart",this.onMouseDown)}},{key:"componentDidUpdate",value:function(e){e.scrollTop!==this.props.scrollTop&&this.delayHidden()}},{key:"componentWillUnmount",value:function(){this.removeEvents(),clearTimeout(this.visibleTimeout)}},{key:"render",value:function(){var e=this.state,t=e.dragging,n=e.visible,o=this.props.prefixCls,i=this.getSpinHeight(),l=this.getTop(),c=this.showScroll(),s=c&&n;return r.createElement("div",{ref:this.scrollbarRef,className:a()("".concat(o,"-scrollbar"),h({},"".concat(o,"-scrollbar-show"),c)),style:{width:8,top:0,bottom:0,right:0,position:"absolute",display:s?null:"none"},onMouseDown:this.onContainerMouseDown,onMouseMove:this.delayHidden},r.createElement("div",{ref:this.thumbRef,className:a()("".concat(o,"-scrollbar-thumb"),h({},"".concat(o,"-scrollbar-thumb-moving"),t)),style:{width:"100%",height:i,top:l,left:0,position:"absolute",background:"rgba(0, 0, 0, 0.5)",borderRadius:99,cursor:"pointer",userSelect:"none"},onMouseDown:this.onMouseDown}))}}])&&m(t.prototype,n),o&&m(t,o),Object.defineProperty(t,"prototype",{writable:!1}),l}(r.Component);function C(e){var t=e.children,n=e.setRef,o=r.useCallback((function(e){n(e)}),[]);return r.cloneElement(t,{ref:o})}var S=n(4943);function E(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]&&arguments[1],r=e<0&&i.current.top||e>0&&i.current.bottom;return t&&r?(clearTimeout(o.current),n.current=!1):r&&!n.current||a(),!n.current&&r}};var R=n(2968);var D=["prefixCls","className","height","itemHeight","fullHeight","style","data","children","itemKey","virtual","component","onScroll","onVisibleChange"];function L(){return L=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var K=[],W={overflowY:"auto",overflowAnchor:"none"};function Y(e,t){var n=e.prefixCls,o=void 0===n?"rc-virtual-list":n,i=e.className,l=e.height,c=e.itemHeight,s=e.fullHeight,u=void 0===s||s,p=e.style,h=e.data,v=e.children,m=e.itemKey,g=e.virtual,y=e.component,b=void 0===y?"div":y,x=e.onScroll,w=e.onVisibleChange,E=H(e,D),_=!(!1===g||!l||!c),P=_&&h&&c*h.length>l,Z=U((0,r.useState)(0),2),T=Z[0],F=Z[1],V=U((0,r.useState)(!1),2),Y=V[0],q=V[1],$=a()(o,i),G=h||K,X=(0,r.useRef)(),Q=(0,r.useRef)(),J=(0,r.useRef)(),ee=r.useCallback((function(e){return"function"===typeof m?m(e):null===e||void 0===e?void 0:e[m]}),[m]),te={getKey:ee};function ne(e){F((function(t){var n=function(e){var t=e;Number.isNaN(ye.current)||(t=Math.min(t,ye.current));return t=Math.max(t,0)}("function"===typeof e?e(t):e);return X.current.scrollTop=n,n}))}var re=(0,r.useRef)({start:0,end:G.length}),oe=(0,r.useRef)(),ae=U(M(G,ee),1)[0];oe.current=ae;var ie=function(e,t,n){var o=O(r.useState(0),2),a=o[0],i=o[1],l=(0,r.useRef)(new Map),c=(0,r.useRef)(new j),s=(0,r.useRef)();function u(){f.Z.cancel(s.current)}function d(){u(),s.current=(0,f.Z)((function(){l.current.forEach((function(e,t){if(e&&e.offsetParent){var n=(0,S.Z)(e),r=n.offsetHeight;c.current.get(t)!==r&&c.current.set(t,n.offsetHeight)}})),i((function(e){return e+1}))}))}return(0,r.useEffect)((function(){return u}),[]),[function(r,o){var a=e(r),i=l.current.get(a);o?(l.current.set(a,o),d()):l.current.delete(a),!i!==!o&&(o?null===t||void 0===t||t(r):null===n||void 0===n||n(r))},d,c.current,a]}(ee,null,null),le=U(ie,4),ce=le[0],se=le[1],ue=le[2],de=le[3],fe=r.useMemo((function(){if(!_)return{scrollHeight:void 0,start:0,end:G.length-1,offset:void 0};var e;if(!P)return{scrollHeight:(null===(e=Q.current)||void 0===e?void 0:e.offsetHeight)||0,start:0,end:G.length-1,offset:void 0};for(var t,n,r,o=0,a=G.length,i=0;i=T&&void 0===t&&(t=i,n=o),f>T+l&&void 0===r&&(r=i),o=f}return void 0===t&&(t=0,n=0),void 0===r&&(r=G.length-1),{scrollHeight:o,start:t,end:r=Math.min(r+1,G.length),offset:n}}),[P,_,T,G,de,l]),pe=fe.scrollHeight,he=fe.start,ve=fe.end,me=fe.offset;re.current.start=he,re.current.end=ve;var ge=pe-l,ye=(0,r.useRef)(ge);ye.current=ge;var be=T<=0,xe=T>=ge,we=A(be,xe);var ke=function(e,t,n,o){var a=(0,r.useRef)(0),i=(0,r.useRef)(null),l=(0,r.useRef)(null),c=(0,r.useRef)(!1),s=A(t,n);return[function(t){if(e){f.Z.cancel(i.current);var n=t.deltaY;a.current+=n,l.current=n,s(n)||(I||t.preventDefault(),i.current=(0,f.Z)((function(){var e=c.current?10:1;o(a.current*e),a.current=0})))}},function(t){e&&(c.current=t.detail===l.current)}]}(_,be,xe,(function(e){ne((function(t){return t+e}))})),Ce=U(ke,2),Se=Ce[0],Ee=Ce[1];!function(e,t,n){var o,a=(0,r.useRef)(!1),i=(0,r.useRef)(0),l=(0,r.useRef)(null),c=(0,r.useRef)(null),s=function(e){if(a.current){var t=Math.ceil(e.touches[0].pageY),r=i.current-t;i.current=t,n(r)&&e.preventDefault(),clearInterval(c.current),c.current=setInterval((function(){(!n(r*=.9333333333333333,!0)||Math.abs(r)<=.1)&&clearInterval(c.current)}),16)}},u=function(){a.current=!1,o()},d=function(e){o(),1!==e.touches.length||a.current||(a.current=!0,i.current=Math.ceil(e.touches[0].pageY),l.current=e.target,l.current.addEventListener("touchmove",s),l.current.addEventListener("touchend",u))};o=function(){l.current&&(l.current.removeEventListener("touchmove",s),l.current.removeEventListener("touchend",u))},(0,R.Z)((function(){return e&&t.current.addEventListener("touchstart",d),function(){var e;null===(e=t.current)||void 0===e||e.removeEventListener("touchstart",d),o(),clearInterval(c.current)}}),[e])}(_,X,(function(e,t){return!we(e,t)&&(Se({preventDefault:function(){},deltaY:e}),!0)})),(0,R.Z)((function(){function e(e){_&&e.preventDefault()}return X.current.addEventListener("wheel",Se),X.current.addEventListener("DOMMouseScroll",Ee),X.current.addEventListener("MozMousePixelScroll",e),function(){X.current&&(X.current.removeEventListener("wheel",Se),X.current.removeEventListener("DOMMouseScroll",Ee),X.current.removeEventListener("MozMousePixelScroll",e))}}),[_]);var je=function(e,t,n,o,a,i,l,c){var s=r.useRef();return function(r){if(null!==r&&void 0!==r){if(f.Z.cancel(s.current),"number"===typeof r)l(r);else if(r&&"object"===N(r)){var u,d=r.align;u="index"in r?r.index:t.findIndex((function(e){return a(e)===r.key}));var p=r.offset,h=void 0===p?0:p;!function r(c,p){if(!(c<0)&&e.current){var v=e.current.clientHeight,m=!1,g=p;if(v){for(var y=p||d,b=0,x=0,w=0,k=Math.min(t.length,u),C=0;C<=k;C+=1){var S=a(t[C]);x=b;var E=n.get(S);b=w=x+(void 0===E?o:E),C===u&&void 0===E&&(m=!0)}var j=null;switch(y){case"top":j=x-h;break;case"bottom":j=w-v+h;break;default:var O=e.current.scrollTop;xO+v&&(g="bottom")}null!==j&&j!==e.current.scrollTop&&l(j)}s.current=(0,f.Z)((function(){m&&i(),r(c-1,g)}))}}(3)}}else c()}}(X,G,ue,c,ee,se,ne,(function(){var e;null===(e=J.current)||void 0===e||e.delayHidden()}));r.useImperativeHandle(t,(function(){return{scrollTo:je}})),(0,R.Z)((function(){if(w){var e=G.slice(he,ve+1);w(e,G)}}),[he,ve,G]);var Oe=function(e,t,n,o,a,i){var l=i.getKey;return e.slice(t,n+1).map((function(e,n){var i=a(e,t+n,{}),c=l(e);return r.createElement(C,{key:c,setRef:function(t){return o(e,t)}},i)}))}(G,he,ve,ce,v,te),_e=null;return l&&(_e=z(B({},u?"height":"maxHeight",l),W),_&&(_e.overflowY="hidden",Y&&(_e.pointerEvents="none"))),r.createElement("div",L({style:z(z({},p),{},{position:"relative"}),className:$},E),r.createElement(b,{className:"".concat(o,"-holder"),style:_e,ref:X,onScroll:function(e){var t=e.currentTarget.scrollTop;t!==T&&ne(t),null===x||void 0===x||x(e)}},r.createElement(d,{prefixCls:o,height:pe,offset:me,onInnerResize:se,ref:Q},Oe)),_&&r.createElement(k,{ref:J,prefixCls:o,scrollTop:T,height:l,scrollHeight:pe,count:G.length,onScroll:function(e){ne(e)},onStartMove:function(){q(!0)},onStopMove:function(){q(!1)}}))}var q=r.forwardRef(Y);q.displayName="List";const $=q},2610:(e,t,n)=>{"use strict";var r=n(969),o=n(8019);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n